aes.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package aes
  2. import (
  3. iaes "crypto/aes"
  4. icipher "crypto/cipher"
  5. "errors"
  6. "go-common/app/interface/main/report-click/service/crypto/cipher"
  7. "go-common/app/interface/main/report-click/service/crypto/padding"
  8. )
  9. var (
  10. ErrAesBlockSize = errors.New("plaintext is not a multiple of the block size")
  11. ErrAesSrcSize = errors.New("ciphertext too short")
  12. ErrAesIVSize = errors.New("iv size is not a block size")
  13. )
  14. // ECBEncrypt aes ecb encrypt.
  15. func ECBEncrypt(src, key []byte, p padding.Padding) ([]byte, error) {
  16. if p == nil {
  17. if len(src) < iaes.BlockSize || len(src)%iaes.BlockSize != 0 {
  18. return nil, ErrAesBlockSize
  19. }
  20. } else {
  21. src = p.Padding(src, iaes.BlockSize)
  22. }
  23. b, err := iaes.NewCipher(key)
  24. if err != nil {
  25. return nil, err
  26. }
  27. mode := cipher.NewECBEncrypter(b)
  28. encryptText := make([]byte, len(src))
  29. mode.CryptBlocks(encryptText, src)
  30. return encryptText, nil
  31. }
  32. // ECBDecrypt aes ecb decrypt.
  33. func ECBDecrypt(src, key []byte, p padding.Padding) ([]byte, error) {
  34. if len(src) < iaes.BlockSize || len(src)%iaes.BlockSize != 0 {
  35. return nil, ErrAesSrcSize
  36. }
  37. b, err := iaes.NewCipher(key)
  38. if err != nil {
  39. return nil, err
  40. }
  41. mode := cipher.NewECBDecrypter(b)
  42. decryptText := make([]byte, len(src))
  43. mode.CryptBlocks(decryptText, src)
  44. if p == nil {
  45. return decryptText, nil
  46. } else {
  47. return p.Unpadding(decryptText, iaes.BlockSize)
  48. }
  49. }
  50. // CBCEncrypt aes cbc encrypt.
  51. func CBCEncrypt(src, key, iv []byte, p padding.Padding) ([]byte, error) {
  52. // check iv
  53. if len(iv) != iaes.BlockSize {
  54. return nil, ErrAesIVSize
  55. }
  56. if p == nil {
  57. // if no padding check src
  58. if len(src) < iaes.BlockSize || len(src)%iaes.BlockSize != 0 {
  59. return nil, ErrAesSrcSize
  60. }
  61. } else {
  62. // padding
  63. src = p.Padding(src, iaes.BlockSize)
  64. }
  65. block, err := iaes.NewCipher(key)
  66. if err != nil {
  67. return nil, err
  68. }
  69. mode := icipher.NewCBCEncrypter(block, iv)
  70. encryptText := make([]byte, len(src))
  71. mode.CryptBlocks(encryptText, src)
  72. return encryptText, nil
  73. }
  74. // CBCDecrypt aes cbc decrypt.
  75. func CBCDecrypt(src, key, iv []byte, p padding.Padding) ([]byte, error) {
  76. // check src
  77. if len(src) < iaes.BlockSize || len(src)%iaes.BlockSize != 0 {
  78. return nil, ErrAesSrcSize
  79. }
  80. // check iv
  81. if len(iv) != iaes.BlockSize {
  82. return nil, ErrAesIVSize
  83. }
  84. block, err := iaes.NewCipher(key)
  85. if err != nil {
  86. return nil, err
  87. }
  88. mode := icipher.NewCBCDecrypter(block, iv)
  89. decryptText := make([]byte, len(src))
  90. mode.CryptBlocks(decryptText, src)
  91. if p == nil {
  92. return decryptText, nil
  93. } else {
  94. return p.Unpadding(decryptText, iaes.BlockSize)
  95. }
  96. }