14
func addBase64Padding(value string) string {
17
value += strings.Repeat("=", 4-m)
23
func removeBase64Padding(value string) string {
24
return strings.Replace(value, "=", "", -1)
27
func Pad(src []byte) []byte {
28
padding := aes.BlockSize - len(src)%aes.BlockSize
29
padtext := bytes.Repeat([]byte{byte(padding)}, padding)
30
return append(src, padtext...)
33
func Unpad(src []byte) ([]byte, error) {
35
unpadding := int(src[length-1])
37
if unpadding > length {
38
return nil, errors.New("unpad error. This could happen when incorrect encryption key is used")
41
return src[:(length - unpadding)], nil
44
func encrypt(key []byte, text string) (string, error) {
45
block, err := aes.NewCipher(key)
50
msg := Pad([]byte(text))
51
ciphertext := make([]byte, aes.BlockSize+len(msg))
52
iv := ciphertext[:aes.BlockSize]
53
if _, err := io.ReadFull(rand.Reader, iv); err != nil {
57
cfb := cipher.NewCFBEncrypter(block, iv)
58
cfb.XORKeyStream(ciphertext[aes.BlockSize:], []byte(msg))
59
finalMsg := removeBase64Padding(base64.URLEncoding.EncodeToString(ciphertext))
63
func decrypt(key []byte, text string) (string, error) {
64
block, err := aes.NewCipher(key)
69
decodedMsg, err := base64.URLEncoding.DecodeString(addBase64Padding(text))
74
if (len(decodedMsg) % aes.BlockSize) != 0 {
75
return "", errors.New("blocksize must be multipe of decoded message length")
78
iv := decodedMsg[:aes.BlockSize]
79
msg := decodedMsg[aes.BlockSize:]
81
cfb := cipher.NewCFBDecrypter(block, iv)
82
cfb.XORKeyStream(msg, msg)
84
unpadMsg, err := Unpad(msg)
89
return string(unpadMsg), nil