crypt.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package lib
  2. import (
  3. "bytes"
  4. "crypto/aes"
  5. "crypto/cipher"
  6. "crypto/md5"
  7. "encoding/hex"
  8. "errors"
  9. "math/rand"
  10. "time"
  11. )
  12. //en
  13. func AesEncrypt(origData, key []byte) ([]byte, error) {
  14. block, err := aes.NewCipher(key)
  15. if err != nil {
  16. return nil, err
  17. }
  18. blockSize := block.BlockSize()
  19. origData = PKCS5Padding(origData, blockSize)
  20. // origData = ZeroPadding(origData, block.BlockSize())
  21. blockMode := cipher.NewCBCEncrypter(block, key[:blockSize])
  22. crypted := make([]byte, len(origData))
  23. // 根据CryptBlocks方法的说明,如下方式初始化crypted也可以
  24. // crypted := origData
  25. blockMode.CryptBlocks(crypted, origData)
  26. return crypted, nil
  27. }
  28. //de
  29. func AesDecrypt(crypted, key []byte) ([]byte, error) {
  30. block, err := aes.NewCipher(key)
  31. if err != nil {
  32. return nil, err
  33. }
  34. blockSize := block.BlockSize()
  35. blockMode := cipher.NewCBCDecrypter(block, key[:blockSize])
  36. origData := make([]byte, len(crypted))
  37. // origData := crypted
  38. blockMode.CryptBlocks(origData, crypted)
  39. err, origData = PKCS5UnPadding(origData)
  40. // origData = ZeroUnPadding(origData)
  41. return origData, err
  42. }
  43. //补全
  44. func PKCS5Padding(ciphertext []byte, blockSize int) []byte {
  45. padding := blockSize - len(ciphertext)%blockSize
  46. padtext := bytes.Repeat([]byte{byte(padding)}, padding)
  47. return append(ciphertext, padtext...)
  48. }
  49. //去补
  50. func PKCS5UnPadding(origData []byte) (error, []byte) {
  51. length := len(origData)
  52. // 去掉最后一个字节 unpadding 次
  53. unpadding := int(origData[length-1])
  54. if (length - unpadding) < 0 {
  55. return errors.New("len error"), nil
  56. }
  57. return nil, origData[:(length - unpadding)]
  58. }
  59. //生成32位md5字串
  60. func Md5(s string) string {
  61. h := md5.New()
  62. h.Write([]byte(s))
  63. return hex.EncodeToString(h.Sum(nil))
  64. }
  65. //生成随机验证密钥
  66. func GetRandomString(l int) string {
  67. str := "0123456789abcdefghijklmnopqrstuvwxyz"
  68. bytes := []byte(str)
  69. result := []byte{}
  70. r := rand.New(rand.NewSource(time.Now().UnixNano()))
  71. for i := 0; i < l; i++ {
  72. result = append(result, bytes[r.Intn(len(bytes))])
  73. }
  74. return string(result)
  75. }