mtfosbot/module/aes/aes.go

57 lines
1.3 KiB
Go
Raw Permalink Normal View History

2019-02-01 06:53:10 +00:00
package aes
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"crypto/rand"
)
// PKCS7Padding -
func PKCS7Padding(cipherText []byte, blockSize int) []byte {
padding := blockSize - len(cipherText)%blockSize
padText := bytes.Repeat([]byte{byte(padding)}, padding)
return append(cipherText, padText...)
}
// PKCS7UnPadding -
func PKCS7UnPadding (origData []byte) []byte {
length := len(origData)
unpadding := int(origData[length - 1])
return origData[:(length - unpadding)]
}
// Encrypt -
func Encrypt (origData, key []byte) (enc []byte, err error) {
block , err := aes.NewCipher(key)
if err != nil {
return
}
blockSize := block.BlockSize()
origData = PKCS7Padding(origData, blockSize)
ivByte := make([]byte, blockSize)
_, err = rand.Read(ivByte)
if err != nil {
return
}
blockMode := cipher.NewCBCEncrypter(block, ivByte)
enc = make([]byte, len(origData))
blockMode.CryptBlocks(enc, origData)
return
}
// Decrypt -
func Decrypt (encData, key []byte) (dec []byte, err error) {
block, err := aes.NewCipher(key)
if err != nil {
return
}
blockSize := block.BlockSize()
ivByte := encData[:blockSize]
encData = encData[blockSize:]
blockMode := cipher.NewCBCDecrypter(block, ivByte)
dec = make([]byte, len(encData))
blockMode.CryptBlocks(dec, encData)
dec = PKCS7UnPadding(dec)
return
}