我正在Golang(Go)测试AES 256 CBC实现.
plaintext: {"key1": "value1", "key2": "value2"}
因为明文是36 B,需要是块大小(16 B)的倍数,所以我用12个随机字节手动填充到48 B.
输入:
plaintext: aaaaaaaaaaaa{"key1": "value1", "key2": "value2"}
AES 256 key: b8ae2fe8669c0401fb289e6ab6247924
AES IV: e0332fc2a9743e4f
代码摘录从here中提取,但进行了一些修改:
block, err := aes.NewCipher(key)
if err != nil {
fmt.Println("Error creating a new AES cipher by using your key!");
fmt.Println(err);
os.Exit(1);
}
ciphertext := make([]byte, aes.BlockSize+len(plaintext))
mode := cipher.NewCBCEncrypter(block, iv)
mode.CryptBlocks(ciphertext, plaintext)
fmt.Printf("%x\n", ciphertext)
fmt.Println("len(ciphertext):",len(ciphertext))
密文=明文+块
这个方程给出了CBC密文的长度.
所以,行ciphertext := make([]byte, aes.BlockSize+len(plaintext))
满足了这个要求,因为我的明文总是被填充为块大小的倍数.
Problem:
使用Go,我得到以下密文:
我总是在密文末尾得到16个0x00字节,无论明文的长度如何.
如果我对在线AES计算器执行相同操作,我会得到以下密文:
前48个字节caf8fe667f4087e1b67d8c9c57fcb1f56b368cafb4bfecbda1e481661ab7b93d87703fb140368d3034d5187c53861c74
相同.但我缺少最后16个字节.
This表示:
可以通过比src大的dst,在这种情况下,
但为什么会这样呢?密文的长度需要大于明文的长度,在线AES计算器证明了这一点.