crypt.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package crypt
  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. blockMode.CryptBlocks(origData, crypted)
  38. err, origData = PKCS5UnPadding(origData)
  39. return origData, err
  40. }
  41. //Completion when the length is insufficient
  42. func PKCS5Padding(ciphertext []byte, blockSize int) []byte {
  43. padding := blockSize - len(ciphertext)%blockSize
  44. padtext := bytes.Repeat([]byte{byte(padding)}, padding)
  45. return append(ciphertext, padtext...)
  46. }
  47. //Remove excess
  48. func PKCS5UnPadding(origData []byte) (error, []byte) {
  49. length := len(origData)
  50. // 去掉最后一个字节 unpadding 次
  51. unpadding := int(origData[length-1])
  52. if (length - unpadding) < 0 {
  53. return errors.New("len error"), nil
  54. }
  55. return nil, origData[:(length - unpadding)]
  56. }
  57. //Generate 32-bit MD5 strings
  58. func Md5(s string) string {
  59. h := md5.New()
  60. h.Write([]byte(s))
  61. return hex.EncodeToString(h.Sum(nil))
  62. }
  63. //Generating Random Verification Key
  64. func GetRandomString(l int) string {
  65. str := "0123456789abcdefghijklmnopqrstuvwxyz"
  66. bytes := []byte(str)
  67. result := []byte{}
  68. r := rand.New(rand.NewSource(time.Now().UnixNano()))
  69. for i := 0; i < l; i++ {
  70. result = append(result, bytes[r.Intn(len(bytes))])
  71. }
  72. return string(result)
  73. }