123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- package service
- import (
- "crypto/aes"
- "crypto/cipher"
- "encoding/base64"
- "errors"
- )
- //func pad(src []byte) []byte {
- // padding := aes.BlockSize - len(src)%aes.BlockSize
- // padText := bytes.Repeat([]byte{byte(padding)}, padding)
- // return append(src, padText...)
- //}
- func unpad(src []byte) ([]byte, error) {
- length := len(src)
- unpadding := int(src[length-1])
- if unpadding > length {
- return nil, errors.New("unpad error. This could happen when incorrect encryption key is used")
- }
- return src[:(length - unpadding)], nil
- }
- //func (s *Service) encrypt(text string) (string, error) {
- // msg := pad([]byte(text))
- // cipherText := make([]byte, aes.BlockSize+len(msg))
- // iv := cipherText[:aes.BlockSize]
- // if _, err := io.ReadFull(rand.Reader, iv); err != nil {
- // return "", err
- // }
- //
- // cfb := cipher.NewCFBEncrypter(s.AESBlock, iv)
- // cfb.XORKeyStream(cipherText[aes.BlockSize:], []byte(msg))
- // finalMsg := base64.URLEncoding.EncodeToString(cipherText)
- // return finalMsg, nil
- //}
- func (s *Service) decrypt(text string) (string, error) {
- decodedMsg, err := base64.URLEncoding.DecodeString(text)
- if err != nil {
- return "", err
- }
- if (len(decodedMsg) % aes.BlockSize) != 0 {
- return "", errors.New("blocksize must be multipe of decoded message length")
- }
- iv := decodedMsg[:aes.BlockSize]
- msg := decodedMsg[aes.BlockSize:]
- cfb := cipher.NewCFBDecrypter(s.AESBlock, iv)
- cfb.XORKeyStream(msg, msg)
- unpadMsg, err := unpad(msg)
- if err != nil {
- return "", err
- }
- return string(unpadMsg), nil
- }
|