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字节)的倍数。以下是实现步骤和示例代码:

实现步骤

  1. 选择密钥:AES-128、AES-192或AES-256,对应密钥长度16、24或32字节。
  2. 生成IV:初始向量(IV)需随机生成,长度为16字节。
  3. 处理明文:检查明文长度,若非16倍数需手动填充(PKCS#7等)或截断(无填充要求时需确保长度正确)。
  4. 加密:使用crypto/aescrypto/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)。

回到顶部