aesctrcrypt.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. package rpc
  2. import (
  3. "bytes"
  4. "crypto/aes"
  5. "crypto/cipher"
  6. "errors"
  7. "math/rand"
  8. "strconv"
  9. )
  10. /*
  11. textStr := []byte("we are ro team")
  12. aesPass := []byte("wenting123456789")
  13. retStr, err := rpcc.AESCtrEncrypt(textStr, aesPass)
  14. if err != nil {
  15. log.Printf("err:%v", err)
  16. return
  17. }
  18. retStr1 := base64.StdEncoding.EncodeToString(retStr)
  19. log.Printf("en:%v", retStr1)
  20. plainText,err := rpcc.AESCtrDecrypt(retStr, aesPass)
  21. if err != nil {
  22. log.Printf("err:%v", err)
  23. return
  24. }
  25. log.Printf("de:%v", string(plainText))
  26. */
  27. var ErrKeyLen = errors.New("a sixteen or twenty-four or thirty-two length secret key is required")
  28. var ErrIvAes = errors.New("a sixteen-length ivaes is required")
  29. var ErrPaddingSize = errors.New("padding size error please check the secret key or iv")
  30. var ivaes = "wenting123456789"
  31. func GetAESKey(len int) string {
  32. //key := make([]byte, len)
  33. //for idx := 0; idx < len; idx++ {
  34. // key[idx] = byte(rand.Int31n(256))
  35. //
  36. //}
  37. //retStr := base64.StdEncoding.EncodeToString(key)
  38. //return "wenting123456789"
  39. retStr := "wt"
  40. for idx := 0; idx < len-2; idx++ {
  41. retStr += strconv.Itoa(int(rand.Int31n(10)))
  42. }
  43. ivaes = retStr
  44. return retStr
  45. }
  46. func AESCtrEncrypt(textStr, key []byte, ivAes ...byte) ([]byte, error) {
  47. return AESCbcEncrypt(textStr, key, ivAes...)
  48. //if len(key) != 16 && len(key) != 24 && len(key) != 32 {
  49. // return nil, ErrKeyLen
  50. //}
  51. //if len(ivAes) != 0 && len(ivAes) != 16 {
  52. // return nil, ErrIvAes
  53. //}
  54. //
  55. //block, err := aes.NewCipher(key)
  56. //if err != nil {
  57. // return nil, err
  58. //}
  59. //
  60. //var iv []byte
  61. //if len(ivAes) != 0 {
  62. // iv = ivAes
  63. //} else {
  64. // iv = []byte(ivaes)
  65. //}
  66. //
  67. //data := cipher.NewCTR(block, iv)
  68. //retText := make([]byte, len(textStr))
  69. //data.XORKeyStream(retText, textStr)
  70. //
  71. //return retText, nil
  72. }
  73. func AESCtrDecrypt(cryptText, key []byte, ivAes ...byte) ([]byte, error) {
  74. return AESCbcDecrypt(cryptText, key, ivAes...)
  75. //
  76. //if key != nil && len(key) != 16 && len(key) != 24 && len(key) != 32 {
  77. // log.Println("AESCtrDecrypt key:", key)
  78. // return nil, ErrKeyLen
  79. //}
  80. //if len(ivAes) != 0 && len(ivAes) != 16 {
  81. // return nil, ErrIvAes
  82. //}
  83. //
  84. //block, err := aes.NewCipher(key)
  85. //if err != nil {
  86. // return nil, err
  87. //}
  88. //var iv []byte
  89. //if len(ivAes) != 0 {
  90. // iv = ivAes
  91. //} else {
  92. // iv = []byte(ivaes)
  93. //}
  94. //
  95. //data := cipher.NewCTR(block, iv)
  96. //retText := make([]byte, len(cryptText))
  97. //data.XORKeyStream(retText, cryptText)
  98. //return retText, nil
  99. }
  100. func AESCbcEncrypt(plainText, key []byte, ivAes ...byte) ([]byte, error) {
  101. if len(key) != 16 && len(key) != 24 && len(key) != 32 {
  102. return nil, ErrKeyLen
  103. }
  104. block, err := aes.NewCipher(key)
  105. if err != nil {
  106. return nil, err
  107. }
  108. paddingText := PKCS5Padding(plainText, block.BlockSize())
  109. var iv []byte
  110. if len(ivAes) != 0 {
  111. if len(ivAes) != 16 {
  112. return nil, ErrIvAes
  113. } else {
  114. iv = ivAes
  115. }
  116. } else {
  117. iv = []byte(ivaes)
  118. } // To initialize the vector, it needs to be the same length as block.blocksize
  119. blockMode := cipher.NewCBCEncrypter(block, iv)
  120. cipherText := make([]byte, len(paddingText))
  121. blockMode.CryptBlocks(cipherText, paddingText)
  122. return cipherText, nil
  123. }
  124. // decrypt
  125. func AESCbcDecrypt(cipherText, key []byte, ivAes ...byte) ([]byte, error) {
  126. if len(key) != 16 && len(key) != 24 && len(key) != 32 {
  127. return nil, ErrKeyLen
  128. }
  129. block, err := aes.NewCipher(key)
  130. if err != nil {
  131. return nil, err
  132. }
  133. var iv []byte
  134. if len(ivAes) != 0 {
  135. if len(ivAes) != 16 {
  136. return nil, ErrIvAes
  137. } else {
  138. iv = ivAes
  139. }
  140. } else {
  141. iv = []byte(ivaes)
  142. }
  143. blockMode := cipher.NewCBCDecrypter(block, iv)
  144. paddingText := make([]byte, len(cipherText))
  145. blockMode.CryptBlocks(paddingText, cipherText)
  146. plainText, err := PKCS5UnPadding(paddingText)
  147. if err != nil {
  148. return nil, err
  149. }
  150. return plainText, nil
  151. }
  152. func PKCS5Padding(plainText []byte, blockSize int) []byte {
  153. if blockSize <= 0 {
  154. return nil
  155. }
  156. padding := blockSize - (len(plainText) % blockSize)
  157. padText := bytes.Repeat([]byte{byte(padding)}, padding)
  158. //todo...
  159. // runtime.slicecopy()导致DATA RACE
  160. len1 := len(plainText)
  161. len2 := len(padText)
  162. newText := make([]byte, len1+len2)
  163. copy(newText[0:], plainText[:len1])
  164. copy(newText[len1:], padText[:len2])
  165. //newText := append(plainText, padText...)
  166. return newText
  167. }
  168. func PKCS5UnPadding(plainText []byte) ([]byte, error) {
  169. length := len(plainText)
  170. if length <= 0 {
  171. return plainText, nil
  172. }
  173. number := int(plainText[length-1])
  174. if number > length {
  175. return nil, ErrPaddingSize
  176. }
  177. return plainText[:length-number], nil
  178. }