protocol/encryptor_aes.go

61 lines
1.6 KiB
Go

package protocol
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"fmt"
)
var aesEncryptorEnabled = false
var aesCipherBlock cipher.Block = nil
var aesCipherBlockModeEncrypter cipher.BlockMode = nil
var aesCipherBlockModeDecrypter cipher.BlockMode = nil
var aesCipherBlockSize int
var aesCipherIV []byte
func SetEncryptorAesKey(key []byte) (err error) {
// 分组秘钥
aesCipherBlock, err = aes.NewCipher(key)
if err != nil {
return fmt.Errorf("key 长度必须 16/24/32长度: %s", err.Error())
}
aesCipherBlockSize = aesCipherBlock.BlockSize()
aesCipherIV = key[:aesCipherBlockSize]
aesCipherBlockModeEncrypter = cipher.NewCBCEncrypter(aesCipherBlock, aesCipherIV)
aesCipherBlockModeDecrypter = cipher.NewCBCDecrypter(aesCipherBlock, aesCipherIV)
aesEncryptorEnabled = true
return nil
}
func (p *protocolPackage) aesEncrypt() {
if !aesEncryptorEnabled {
return
}
// PKCS7Padding 补码
padding := aesCipherBlockSize - int(p.bodySize)%aesCipherBlockSize
padtext := bytes.Repeat([]byte{byte(padding)}, padding)
p.bodySize += uint32(padding)
p.body = append(p.body, padtext...)
// 创建数组
cryted := make([]byte, p.bodySize)
// 加密
aesCipherBlockModeEncrypter.CryptBlocks(cryted, p.body)
p.body = cryted
p.encryptor = EncryptorAes
}
func (p *protocolPackage) aesDecrypt() {
if !aesEncryptorEnabled {
return
}
// 创建数组
orig := make([]byte, p.bodySize)
// 解密
aesCipherBlockModeDecrypter.CryptBlocks(orig, p.body)
// PKCS7UnPadding 去码
p.bodySize = p.bodySize - uint32(orig[p.bodySize-1])
p.body = orig[:p.bodySize]
p.encryptor = EncryptorNone
}