service/library/mycrypto/aesCrypto.go

72 lines
2.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package mycrypto
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"service/library/configcenter"
"service/library/logger"
)
type AesCrypto struct {
aesPriKey []byte
}
func NewAesCrypto(cryptoConfig *configcenter.CryptoConfig) (aesCrypto *AesCrypto, err error) {
aesCrypto = &AesCrypto{}
//读取私钥
if aesCrypto.readAESPriKey(cryptoConfig) != nil {
logger.Error("read rsa primary key failed!", err)
return
}
return
}
func (aesCrypto *AesCrypto) Encrypt(msg []byte) (encryptedBytes []byte, err error) {
//CBC加密
block, err := aes.NewCipher(aesCrypto.aesPriKey) //block
if err != nil {
logger.Error("AES NewCipher failed!, err: %v", err)
return nil, err
}
blockSize := block.BlockSize() //密钥块长度
paddedData := aesCrypto.pkcs5Padding(msg, blockSize) //填充
blockMode := cipher.NewCBCEncrypter(block, aesCrypto.aesPriKey[:blockSize]) //加密模式
encryptedBytes = make([]byte, len(paddedData)) //创建数组
blockMode.CryptBlocks(encryptedBytes, paddedData) //加密
return
}
func (aesCrypto *AesCrypto) Decrypt(encryptedBytes []byte) (decryptedBytes []byte, err error) {
if len(encryptedBytes) == 0 {
return
}
//CBC解密
block, _ := aes.NewCipher(aesCrypto.aesPriKey) // 分组秘钥
blockSize := block.BlockSize() // 获取秘钥块的长度
blockMode := cipher.NewCBCDecrypter(block, aesCrypto.aesPriKey[:blockSize]) // 加密模式
decryptedBytes = make([]byte, len(encryptedBytes)) // 创建数组
blockMode.CryptBlocks(decryptedBytes, encryptedBytes) // 解密
decryptedBytes = aesCrypto.pkcs5UnPadding(decryptedBytes) // 去除补全码
return
}
func (aesCrypto *AesCrypto) readAESPriKey(cryptoConfig *configcenter.CryptoConfig) (err error) {
//读取私钥
aesCrypto.aesPriKey = []byte(cryptoConfig.AESPrivateKey)
return
}
func (aesCrypto *AesCrypto) pkcs5Padding(ciphertext []byte, blockSize int) []byte {
padding := blockSize - len(ciphertext)%blockSize //判断缺少几位长度。最少1最多 blockSize
padtext := bytes.Repeat([]byte{byte(padding)}, padding) //补足位数。把切片[]byte{byte(padding)}复制padding个
return append(ciphertext, padtext...)
}
func (aesCrypto *AesCrypto) pkcs5UnPadding(origData []byte) []byte {
length := len(origData)
unpadding := int(origData[length-1])
return origData[:(length - unpadding)]
}