61 lines
1.6 KiB
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
|
|
}
|