key_gen.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package generator
  2. import (
  3. "crypto/aes"
  4. "crypto/cipher"
  5. "crypto/rand"
  6. "encoding/hex"
  7. "errors"
  8. "io"
  9. )
  10. const (
  11. maxEncodeLen = 32
  12. )
  13. // KeyGenerator key generator
  14. type KeyGenerator struct {
  15. AESKey string
  16. }
  17. func encryptAESCFB(msg, key []byte) ([]byte, error) {
  18. block, err := aes.NewCipher(key)
  19. if err != nil {
  20. return nil, err
  21. }
  22. ciphertext := make([]byte, aes.BlockSize+len(msg))
  23. iv := ciphertext[:aes.BlockSize]
  24. if _, err := io.ReadFull(rand.Reader, iv); err != nil {
  25. return nil, err
  26. }
  27. stream := cipher.NewCFBEncrypter(block, iv)
  28. stream.XORKeyStream(ciphertext[aes.BlockSize:], msg)
  29. return ciphertext, nil
  30. }
  31. func decryptAESCFB(msg, key []byte) ([]byte, error) {
  32. block, err := aes.NewCipher(key)
  33. if err != nil {
  34. return nil, err
  35. }
  36. if len(msg) < aes.BlockSize {
  37. return nil, errors.New("decrypt message too short")
  38. }
  39. iv := msg[:aes.BlockSize]
  40. msg = msg[aes.BlockSize:]
  41. stream := cipher.NewCFBDecrypter(block, iv)
  42. stream.XORKeyStream(msg, msg)
  43. return msg, nil
  44. }
  45. // NewKeyGenerator create a key generator
  46. func NewKeyGenerator(key string) (*KeyGenerator, error) {
  47. l := len(key)
  48. if l != 16 && l != 24 && l != 32 {
  49. return nil, errors.New("invalid aes key length, should be 16, 24 or 32 bytes")
  50. }
  51. return &KeyGenerator{
  52. AESKey: key,
  53. }, nil
  54. }
  55. // GenRandomKey get random key
  56. func (g *KeyGenerator) GenRandomKey(id string) (string, error) {
  57. binkey, err := encryptAESCFB([]byte(id), []byte(g.AESKey))
  58. if err != nil {
  59. return "", err
  60. }
  61. return hex.EncodeToString(binkey), nil
  62. }
  63. // DecodeIDFromRandomKey get id from encrypt strings
  64. func (g *KeyGenerator) DecodeIDFromRandomKey(encrypted string) (string, error) {
  65. buf, err := hex.DecodeString(encrypted)
  66. if err != nil {
  67. return "", err
  68. }
  69. raw, err := decryptAESCFB(buf, []byte(g.AESKey))
  70. if err != nil {
  71. return "", err
  72. }
  73. return string(raw), nil
  74. }