加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
crypto_aes_cbc.go 1.62 KB
一键复制 编辑 原始数据 按行查看 历史
技术狼 提交于 2024-07-19 18:35 . no message
package fun
import (
"bytes"
"crypto/aes"
"crypto/cipher"
)
// =================== CBC(密码分组链接模式) ======================
func AesEncryptCBC(origData []byte, key []byte) (encrypted []byte, err error) {
// 分组秘钥
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}
blockSize := block.BlockSize() // 获取秘钥块的长度
origData = pkcs5Padding(origData, blockSize) // 补全码
blockMode := cipher.NewCBCEncrypter(block, key[:blockSize]) // 加密模式
encrypted = make([]byte, len(origData)) // 创建数组
blockMode.CryptBlocks(encrypted, origData) // 加密
return encrypted, nil
}
func AesDecryptCBC(encrypted []byte, key []byte) (decrypted []byte, err error) {
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}
blockSize := block.BlockSize() // 获取秘钥块的长度
blockMode := cipher.NewCBCDecrypter(block, key[:blockSize]) // 加密模式
decrypted = make([]byte, len(encrypted)) // 创建数组
blockMode.CryptBlocks(decrypted, encrypted) // 解密
decrypted = pkcs5UnPadding(decrypted) // 去除补全码
return decrypted, nil
}
func pkcs5Padding(ciphertext []byte, blockSize int) []byte {
padding := blockSize - len(ciphertext)%blockSize
padtext := bytes.Repeat([]byte{byte(padding)}, padding)
return append(ciphertext, padtext...)
}
func pkcs5UnPadding(origData []byte) []byte {
length := len(origData)
unpadding := int(origData[length-1])
return origData[:(length - unpadding)]
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化