aes.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package spiderutil
  2. import (
  3. "bytes"
  4. "crypto/aes"
  5. "crypto/cipher"
  6. )
  7. //aes ecb加密
  8. func AesECBEncrypt(data, key []byte) []byte {
  9. cipher, _ := aes.NewCipher(generateKey([]byte(key)))
  10. length := (len(data) + aes.BlockSize) / aes.BlockSize
  11. plain := make([]byte, length*aes.BlockSize)
  12. copy(plain, data)
  13. pad := byte(len(plain) - len(data))
  14. for i := len(data); i < len(plain); i++ {
  15. plain[i] = pad
  16. }
  17. encrypted := make([]byte, len(plain))
  18. // 分组分块加密
  19. for bs, be := 0, cipher.BlockSize(); bs <= len(data); bs, be = bs+cipher.BlockSize(), be+cipher.BlockSize() {
  20. cipher.Encrypt(encrypted[bs:be], plain[bs:be])
  21. }
  22. return encrypted
  23. }
  24. //aes ecb解密
  25. func AesECBDecrypter(data, key []byte) []byte {
  26. cipher, _ := aes.NewCipher(generateKey(key))
  27. decrypted := make([]byte, len(data))
  28. for bs, be := 0, cipher.BlockSize(); bs < len(data); bs, be = bs+cipher.BlockSize(), be+cipher.BlockSize() {
  29. cipher.Decrypt(decrypted[bs:be], data[bs:be])
  30. }
  31. trim := 0
  32. if len(decrypted) > 0 {
  33. trim = len(decrypted) - int(decrypted[len(decrypted)-1])
  34. }
  35. return decrypted[:trim]
  36. }
  37. //aes cbc加密
  38. func AesCBCEncrypt(data, key, iv []byte) []byte {
  39. // 创建一个AES块,使用提供的密钥
  40. block, _ := aes.NewCipher(key)
  41. // 使用CBC模式创建一个加密器
  42. mode := cipher.NewCBCEncrypter(block, iv)
  43. // 对数据进行填充
  44. padding := aes.BlockSize - len(data)%aes.BlockSize
  45. padtext := append(data, bytes.Repeat([]byte{byte(padding)}, padding)...)
  46. // 加密数据
  47. encrypted := make([]byte, len(padtext))
  48. mode.CryptBlocks(encrypted, padtext)
  49. return encrypted
  50. }
  51. //aes cbc解密
  52. func AesCBCDecrypter(data, key, iv []byte) []byte {
  53. block, _ := aes.NewCipher(key)
  54. decrypter := cipher.NewCBCDecrypter(block, iv)
  55. // 解密数据
  56. decrypted := make([]byte, len(data))
  57. decrypter.CryptBlocks(decrypted, data)
  58. // 去除填充
  59. unpadding := int(decrypted[len(decrypted)-1])
  60. return decrypted[:len(decrypted)-unpadding]
  61. }
  62. func generateKey(key []byte) (genKey []byte) {
  63. genKey = make([]byte, 16)
  64. copy(genKey, key)
  65. for i := 16; i < len(key); {
  66. for j := 0; j < 16 && i < len(key); j, i = j+1, i+1 {
  67. genKey[j] ^= key[i]
  68. }
  69. }
  70. return genKey
  71. }