aes.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. package crypto4go
  2. import (
  3. "crypto/aes"
  4. "crypto/cipher"
  5. "crypto/md5"
  6. "crypto/rand"
  7. "errors"
  8. "fmt"
  9. "github.com/smartwalle/crypto4go/pbkdf2"
  10. "hash"
  11. "io"
  12. )
  13. const (
  14. kPKCS5SaltLen = 8
  15. kPKCS5DefaultIter = 2048
  16. kPKCS5DefaultMagic = "Salted__"
  17. kEVPMaxIvLen = 16
  18. )
  19. func RandBytes(length int) (data []byte, err error) {
  20. data = make([]byte, length)
  21. if _, err = io.ReadFull(rand.Reader, data); err != nil {
  22. return nil, err
  23. }
  24. return data, err
  25. }
  26. func AESCBCEncryptWithSalt(plaintext, key []byte, iter int, magic string, h func() hash.Hash) ([]byte, error) {
  27. return AESEncryptWithSalt(plaintext, key, iter, magic, h, AESCBCEncrypt)
  28. }
  29. func AESCBCDecryptWithSalt(data, key []byte, iter int, magic string, h func() hash.Hash) ([]byte, error) {
  30. return AESDecryptWithSalt(data, key, iter, magic, h, AESCBCDecrypt)
  31. }
  32. func AESEncryptWithSalt(plaintext, key []byte, iter int, magic string, h func() hash.Hash, f func(plaintext, key, iv []byte) ([]byte, error)) ([]byte, error) {
  33. if iter <= 0 {
  34. iter = kPKCS5DefaultIter
  35. }
  36. if h == nil {
  37. h = md5.New
  38. }
  39. var salt, _ = RandBytes(kPKCS5SaltLen)
  40. var sKey = pbkdf2.Key(key, salt, iter, len(key), h)
  41. var sIV = pbkdf2.Key(sKey, salt, iter, kEVPMaxIvLen, h)
  42. var ciphertext, err = f(plaintext, sKey, sIV)
  43. ciphertext = append(salt, ciphertext...)
  44. ciphertext = append([]byte(magic), ciphertext...)
  45. return ciphertext, err
  46. }
  47. func AESDecryptWithSalt(ciphertext, key []byte, iterCount int, magic string, h func() hash.Hash, f func(ciphertext, key, iv []byte) ([]byte, error)) ([]byte, error) {
  48. if iterCount <= 0 {
  49. iterCount = kPKCS5DefaultIter
  50. }
  51. if h == nil {
  52. h = md5.New
  53. }
  54. //if len(ciphertext) <= len(magic) + kPKCS5SaltLen {
  55. // return nil, errors.New("Error")
  56. //}
  57. var salt = ciphertext[len(magic) : len(magic)+kPKCS5SaltLen]
  58. var sKey = pbkdf2.Key(key, salt, iterCount, len(key), h)
  59. var sIV = pbkdf2.Key(sKey, salt, iterCount, kEVPMaxIvLen, h)
  60. var plaintext, err = f(ciphertext[len(magic)+kPKCS5SaltLen:], sKey, sIV)
  61. return plaintext, err
  62. }
  63. // AESCBCEncrypt 由key的长度决定是128, 192 还是 256
  64. func AESCBCEncrypt(plaintext, key, iv []byte) ([]byte, error) {
  65. var block, err = aes.NewCipher(key)
  66. if err != nil {
  67. return nil, err
  68. }
  69. var blockSize = block.BlockSize()
  70. iv = iv[:blockSize]
  71. var src = PKCS7Padding(plaintext, blockSize)
  72. var dst = make([]byte, len(src))
  73. var mode = cipher.NewCBCEncrypter(block, iv)
  74. mode.CryptBlocks(dst, src)
  75. return dst, nil
  76. }
  77. func AESCBCDecrypt(ciphertext, key, iv []byte) ([]byte, error) {
  78. var block, err = aes.NewCipher(key)
  79. if err != nil {
  80. return nil, err
  81. }
  82. var blockSize = block.BlockSize()
  83. iv = iv[:blockSize]
  84. var dst = make([]byte, len(ciphertext))
  85. var mode = cipher.NewCBCDecrypter(block, iv)
  86. mode.CryptBlocks(dst, ciphertext)
  87. dst = PKCS7UnPadding(dst)
  88. return dst, nil
  89. }
  90. func AESCFBEncrypt(plaintext, key, iv []byte) ([]byte, error) {
  91. var block, err = aes.NewCipher(key)
  92. if err != nil {
  93. return nil, err
  94. }
  95. var blockSize = block.BlockSize()
  96. iv = iv[:blockSize]
  97. var dst = make([]byte, len(plaintext))
  98. var mode = cipher.NewCFBEncrypter(block, iv)
  99. mode.XORKeyStream(dst, plaintext)
  100. return dst, nil
  101. }
  102. func AESCFBDecrypt(ciphertext, key, iv []byte) ([]byte, error) {
  103. var block, err = aes.NewCipher(key)
  104. if err != nil {
  105. return nil, err
  106. }
  107. var blockSize = block.BlockSize()
  108. iv = iv[:blockSize]
  109. var dst = make([]byte, len(ciphertext))
  110. var mode = cipher.NewCFBDecrypter(block, iv)
  111. mode.XORKeyStream(dst, ciphertext)
  112. return dst, nil
  113. }
  114. func AESGCMEncrypt(plaintext, key []byte) ([]byte, error) {
  115. var block, err = aes.NewCipher(key)
  116. if err != nil {
  117. return nil, err
  118. }
  119. mode, err := cipher.NewGCM(block)
  120. if err != nil {
  121. return nil, err
  122. }
  123. nonce, err := RandBytes(mode.NonceSize())
  124. if err != nil {
  125. return nil, err
  126. }
  127. return mode.Seal(nonce, nonce, plaintext, nil), nil
  128. }
  129. func AESGCMEncryptWithNonce(plaintext, key, nonce []byte) ([]byte, error) {
  130. var block, err = aes.NewCipher(key)
  131. if err != nil {
  132. return nil, err
  133. }
  134. mode, err := cipher.NewGCM(block)
  135. if err != nil {
  136. return nil, err
  137. }
  138. if len(nonce) != mode.NonceSize() {
  139. return nil, fmt.Errorf("invalid nonce size, must contain %d characters", mode.NonceSize())
  140. }
  141. return mode.Seal(nil, nonce, plaintext, nil), nil
  142. }
  143. func AESGCMDecrypt(ciphertext, key []byte) ([]byte, error) {
  144. var block, err = aes.NewCipher(key)
  145. if err != nil {
  146. return nil, err
  147. }
  148. mode, err := cipher.NewGCM(block)
  149. if err != nil {
  150. return nil, err
  151. }
  152. nonceSize := mode.NonceSize()
  153. if len(ciphertext) < nonceSize {
  154. return nil, errors.New("ciphertext too short")
  155. }
  156. var nonce []byte
  157. nonce, ciphertext = ciphertext[:nonceSize], ciphertext[nonceSize:]
  158. return mode.Open(nil, nonce, ciphertext, nil)
  159. }
  160. func AESGCMDecryptWithNonce(ciphertext, key, nonce []byte) ([]byte, error) {
  161. var block, err = aes.NewCipher(key)
  162. if err != nil {
  163. return nil, err
  164. }
  165. mode, err := cipher.NewGCM(block)
  166. if err != nil {
  167. return nil, err
  168. }
  169. if len(nonce) != mode.NonceSize() {
  170. return nil, fmt.Errorf("invalid nonce size, must contain %d characters", mode.NonceSize())
  171. }
  172. return mode.Open(nil, nonce, ciphertext, nil)
  173. }