aes.go 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. package aes
  2. import (
  3. "bytes"
  4. "crypto/aes"
  5. "crypto/cipher"
  6. "crypto/rand"
  7. "encoding/base64"
  8. "encoding/hex"
  9. "errors"
  10. "fmt"
  11. "io"
  12. )
  13. // KEY_ALGORITHM 密钥算法
  14. const KEY_ALGORITHM = "AES"
  15. // DEFAULT_CIPHER_ALGORITHM 默认加密算法/工作模式/填充方式
  16. const DEFAULT_CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding"
  17. // InitSecretKey 初始化密钥
  18. func InitSecretKey() ([]byte, error) {
  19. key := make([]byte, 16) // AES-128
  20. if _, err := io.ReadFull(rand.Reader, key); err != nil {
  21. return nil, fmt.Errorf("生成随机密钥失败: %v", err)
  22. }
  23. return key, nil
  24. }
  25. // ToKey 转换密钥
  26. func ToKey(key []byte) cipher.Block {
  27. block, _ := aes.NewCipher(key)
  28. return block
  29. }
  30. // Encrypt 加密
  31. func Encrypt(data, key []byte) ([]byte, error) {
  32. return EncryptWithAlgorithm(data, key, DEFAULT_CIPHER_ALGORITHM)
  33. }
  34. // EncryptWithAlgorithm 使用指定算法加密
  35. func EncryptWithAlgorithm(data, key []byte, cipherAlgorithm string) ([]byte, error) {
  36. block := ToKey(key)
  37. // PKCS5填充
  38. data = PKCS5Padding(data, block.BlockSize())
  39. ciphertext := make([]byte, len(data))
  40. for bs, be := 0, block.BlockSize(); bs < len(data); bs, be = bs+block.BlockSize(), be+block.BlockSize() {
  41. block.Encrypt(ciphertext[bs:be], data[bs:be])
  42. }
  43. return ciphertext, nil
  44. }
  45. // Decrypt 解密
  46. func Decrypt(data, key []byte) ([]byte, error) {
  47. return DecryptWithAlgorithm(data, key, DEFAULT_CIPHER_ALGORITHM)
  48. }
  49. // DecryptWithAlgorithm 使用指定算法解密
  50. func DecryptWithAlgorithm(data, key []byte, cipherAlgorithm string) ([]byte, error) {
  51. block := ToKey(key)
  52. plaintext := make([]byte, len(data))
  53. for bs, be := 0, block.BlockSize(); bs < len(data); bs, be = bs+block.BlockSize(), be+block.BlockSize() {
  54. block.Decrypt(plaintext[bs:be], data[bs:be])
  55. }
  56. // PKCS5去除填充
  57. plaintext = PKCS5UnPadding(plaintext)
  58. return plaintext, nil
  59. }
  60. // ShowByteArray 显示字节数组
  61. func ShowByteArray(data []byte) string {
  62. if data == nil {
  63. return "nil"
  64. }
  65. var buf bytes.Buffer
  66. buf.WriteString("{")
  67. for i, b := range data {
  68. if i > 0 {
  69. buf.WriteString(",")
  70. }
  71. buf.WriteString(fmt.Sprintf("%d", b))
  72. }
  73. buf.WriteString("}")
  74. return buf.String()
  75. }
  76. // ParseHexStr2Byte 将16进制转换为二进制
  77. func ParseHexStr2Byte(hexStr string) ([]byte, error) {
  78. if len(hexStr) < 1 {
  79. return nil, errors.New("hex string too short")
  80. }
  81. return hex.DecodeString(hexStr)
  82. }
  83. // ParseByte2HexStr 将二进制转换成16进制
  84. func ParseByte2HexStr(data []byte) string {
  85. return hex.EncodeToString(data)
  86. }
  87. // AESEncryptString 加密字符串
  88. func AESEncryptString(str, key string) (string, error) {
  89. if str == "" || key == "" {
  90. return "", errors.New("input string or key is empty")
  91. }
  92. keyBytes := []byte(key)
  93. if len(keyBytes) != 16 && len(keyBytes) != 24 && len(keyBytes) != 32 {
  94. return "", errors.New("key length must be 16, 24 or 32 bytes")
  95. }
  96. block, err := aes.NewCipher(keyBytes)
  97. if err != nil {
  98. return "", fmt.Errorf("创建AES加密块失败: %v", err)
  99. }
  100. // PKCS5填充
  101. data := PKCS5Padding([]byte(str), block.BlockSize())
  102. ciphertext := make([]byte, len(data))
  103. for bs, be := 0, block.BlockSize(); bs < len(data); bs, be = bs+block.BlockSize(), be+block.BlockSize() {
  104. block.Encrypt(ciphertext[bs:be], data[bs:be])
  105. }
  106. return base64.StdEncoding.EncodeToString(ciphertext), nil
  107. }
  108. // AESDecryptString 解密字符串
  109. func AESDecryptString(str, key string) (string, error) {
  110. if str == "" || key == "" {
  111. return "", errors.New("input string or key is empty")
  112. }
  113. keyBytes := []byte(key)
  114. if len(keyBytes) != 16 && len(keyBytes) != 24 && len(keyBytes) != 32 {
  115. return "", errors.New("key length must be 16, 24 or 32 bytes")
  116. }
  117. ciphertext, err := base64.StdEncoding.DecodeString(str)
  118. if err != nil {
  119. return "", fmt.Errorf("base64解码失败: %v", err)
  120. }
  121. block, err := aes.NewCipher(keyBytes)
  122. if err != nil {
  123. return "", fmt.Errorf("创建AES加密块失败: %v", err)
  124. }
  125. plaintext := make([]byte, len(ciphertext))
  126. for bs, be := 0, block.BlockSize(); bs < len(ciphertext); bs, be = bs+block.BlockSize(), be+block.BlockSize() {
  127. block.Decrypt(plaintext[bs:be], ciphertext[bs:be])
  128. }
  129. // PKCS5去除填充
  130. plaintext = PKCS5UnPadding(plaintext)
  131. return string(plaintext), nil
  132. }
  133. // PKCS5Padding PKCS5填充
  134. func PKCS5Padding(data []byte, blockSize int) []byte {
  135. padding := blockSize - len(data)%blockSize
  136. padText := bytes.Repeat([]byte{byte(padding)}, padding)
  137. return append(data, padText...)
  138. }
  139. // PKCS5UnPadding PKCS5去除填充
  140. func PKCS5UnPadding(data []byte) []byte {
  141. length := len(data)
  142. unPadding := int(data[length-1])
  143. return data[:(length - unPadding)]
  144. }
  145. // ExampleUsage 示例用法
  146. func ExampleUsage() {
  147. // 示例密钥(与Java示例中的密钥一致)
  148. exampleKeyBase64 := "9iEepr1twrizIEKrs1hs2A=="
  149. exampleKey, _ := base64.StdEncoding.DecodeString(exampleKeyBase64)
  150. // 示例数据
  151. exampleData := `{"requestName":"BeforeIn","requestValue":{"carCode":"浙AD0V07","inTime":"2016-09-29 10:06:03","inChannelId":"4","GUID":"1403970b-4eb2-46bc-8f2b-eeec91ddcd5f","inOrOut":"0"},"Type":"0"}`
  152. fmt.Printf("加密前数据: string: %s\n", exampleData)
  153. fmt.Printf("加密前数据: byte[]: %s\n", ShowByteArray([]byte(exampleData)))
  154. fmt.Println()
  155. // 加密
  156. encryptData, err := Encrypt([]byte(exampleData), exampleKey)
  157. if err != nil {
  158. fmt.Printf("加密失败: %v\n", err)
  159. return
  160. }
  161. encryptStr := ParseByte2HexStr(encryptData)
  162. fmt.Printf("加密后数据: byte[]: %s\n", ShowByteArray(encryptData))
  163. fmt.Printf("加密后数据: Byte2HexStr: %s\n", encryptStr)
  164. fmt.Println()
  165. // 解密
  166. decryptData, err := Decrypt(encryptData, exampleKey)
  167. if err != nil {
  168. fmt.Printf("解密失败: %v\n", err)
  169. return
  170. }
  171. fmt.Printf("解密后数据: byte[]: %s\n", ShowByteArray(decryptData))
  172. fmt.Printf("解密后数据: string: %s\n", string(decryptData))
  173. }