Golang AES CBC无填充加密
在使用Golang实现AES CBC加密时,发现没有填充会报错。请问如何正确实现无填充的AES CBC加密?需要手动处理数据块对齐吗?能否提供一个示例代码?
2 回复
使用Go实现AES CBC无填充加密,需手动处理数据长度。示例代码:
func encrypt(plaintext []byte, key []byte) ([]byte, error) {
block, _ := aes.NewCipher(key)
iv := make([]byte, aes.BlockSize)
// 手动填充或确保数据长度为块大小倍数
if len(plaintext)%aes.BlockSize != 0 {
return nil, errors.New("plaintext not multiple of block size")
}
ciphertext := make([]byte, len(plaintext))
mode := cipher.NewCBCEncrypter(block, iv)
mode.CryptBlocks(ciphertext, plaintext)
return ciphertext, nil
}
注意:无填充需自行确保数据对齐,否则会出错。
更多关于Golang AES CBC无填充加密的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Go语言中,使用AES CBC模式进行无填充加密时,需要手动处理数据长度,确保明文长度是AES块大小(16字节)的倍数。以下是实现步骤和示例代码:
实现步骤
- 选择密钥:AES-128、AES-192或AES-256,对应密钥长度16、24或32字节。
- 生成IV:初始向量(IV)需随机生成,长度为16字节。
- 处理明文:检查明文长度,若非16倍数需手动填充(PKCS#7等)或截断(无填充要求时需确保长度正确)。
- 加密:使用
crypto/aes和crypto/cipher包进行CBC加密。
示例代码
package main
import (
"crypto/aes"
"crypto/cipher"
"crypto/rand"
"fmt"
"io"
)
// AES CBC加密(无填充,明文长度必须为16的倍数)
func AesCBCEncrypt(plaintext, key []byte) ([]byte, error) {
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}
// 检查明文长度
if len(plaintext)%aes.BlockSize != 0 {
return nil, fmt.Errorf("明文长度必须是 %d 的倍数", aes.BlockSize)
}
// 生成随机IV
ciphertext := make([]byte, aes.BlockSize+len(plaintext))
iv := ciphertext[:aes.BlockSize]
if _, err := io.ReadFull(rand.Reader, iv); err != nil {
return nil, err
}
// CBC加密
mode := cipher.NewCBCEncrypter(block, iv)
mode.CryptBlocks(ciphertext[aes.BlockSize:], plaintext)
return ciphertext, nil
}
// 使用示例
func main() {
key := []byte("16bytekey12345678") // 16字节密钥(AES-128)
plaintext := []byte("1234567890123456") // 16字节明文(必须是16的倍数)
encrypted, err := AesCBCEncrypt(plaintext, key)
if err != nil {
fmt.Println("加密失败:", err)
return
}
fmt.Printf("加密结果: %x\n", encrypted)
}
注意事项
- 无填充限制:明文必须是16字节的倍数,否则会返回错误。
- IV管理:IV需随机且每次加密不同,解密时需使用相同IV。
- 密钥安全:密钥需保密存储,避免硬编码。
如需解密或处理非对齐数据,需补充填充逻辑(如PKCS#7)。

