aes.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package encrypt
  2. import (
  3. "bytes"
  4. "crypto/aes"
  5. "crypto/cipher"
  6. "encoding/base64"
  7. "encoding/hex"
  8. . "app.yhyue.com/moapp/jybase/common"
  9. )
  10. type AES_CBC struct {
  11. Key string //16位
  12. Iv string //16位
  13. }
  14. func (a AES_CBC) Encrypt(value string) (string, error) {
  15. b, err := a.encrypt(value)
  16. if err != nil {
  17. return "", err
  18. }
  19. return base64.StdEncoding.EncodeToString(b), nil
  20. }
  21. func (a AES_CBC) EncryptHex(value string) (string, error) {
  22. b, err := a.encrypt(value)
  23. if err != nil {
  24. return "", err
  25. }
  26. return hex.EncodeToString(b), nil
  27. }
  28. func (a AES_CBC) encrypt(value string) ([]byte, error) {
  29. defer Catch()
  30. origData := []byte(value)
  31. block, err := aes.NewCipher([]byte(a.Key))
  32. if err != nil {
  33. return nil, err
  34. }
  35. origData = a.PKCS5Padding(origData, block.BlockSize())
  36. // origData = a.ZeroPadding(origData, block.BlockSize())
  37. blockMode := cipher.NewCBCEncrypter(block, []byte(a.Iv))
  38. crypted := make([]byte, len(origData))
  39. blockMode.CryptBlocks(crypted, origData)
  40. return crypted, nil
  41. }
  42. func (a AES_CBC) Decrypt(crypted string) (string, error) {
  43. decodeData, err := base64.StdEncoding.DecodeString(crypted)
  44. return a.decrypt(decodeData, err)
  45. }
  46. func (a AES_CBC) DecryptHex(crypted string) (string, error) {
  47. decodeData, err := hex.DecodeString(crypted)
  48. return a.decrypt(decodeData, err)
  49. }
  50. func (a AES_CBC) decrypt(decodeData []byte, err error) (string, error) {
  51. defer Catch()
  52. if err != nil {
  53. return "", err
  54. }
  55. block, err := aes.NewCipher([]byte(a.Key))
  56. if err != nil {
  57. return "", err
  58. }
  59. //blockSize := block.BlockSize()
  60. blockMode := cipher.NewCBCDecrypter(block, []byte(a.Iv))
  61. origData := make([]byte, len(decodeData))
  62. blockMode.CryptBlocks(origData, decodeData)
  63. origData = a.PKCS5UnPadding(origData)
  64. // origData = a.ZeroUnPadding(origData)
  65. return string(origData), nil
  66. }
  67. func (a AES_CBC) ZeroPadding(ciphertext []byte, blockSize int) []byte {
  68. padding := blockSize - len(ciphertext)%blockSize
  69. padtext := bytes.Repeat([]byte{0}, padding)
  70. return append(ciphertext, padtext...)
  71. }
  72. func (a AES_CBC) ZeroUnPadding(origData []byte) []byte {
  73. length := len(origData)
  74. if length == 0 {
  75. return origData
  76. }
  77. unpadding := int(origData[length-1])
  78. if length < unpadding {
  79. return origData
  80. }
  81. return origData[:(length - unpadding)]
  82. }
  83. func (a AES_CBC) PKCS5Padding(ciphertext []byte, blockSize int) []byte {
  84. padding := blockSize - len(ciphertext)%blockSize
  85. padtext := bytes.Repeat([]byte{byte(padding)}, padding)
  86. return append(ciphertext, padtext...)
  87. }
  88. func (a AES_CBC) PKCS5UnPadding(origData []byte) []byte {
  89. length := len(origData)
  90. if length == 0 {
  91. return origData
  92. }
  93. // 去掉最后一个字节 unpadding 次
  94. unpadding := int(origData[length-1])
  95. if length < unpadding {
  96. return origData
  97. }
  98. return origData[:(length - unpadding)]
  99. }