我正在 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
从此处提取的代码摘录,但稍作修改:
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))
CipherText = PlainText + Block - (PlainText MOD Block)
这个等式给出了 CBC 的密文长度。
因此,该行ciphertext := make([]byte, aes.BlockSize+len(plaintext))满足此要求,因为我的明文始终被填充为块大小的倍数。
问题:
使用 Go 我得到以下密文: caf8fe667f4087e1b67d8c9c57fcb1f56b368cafb4bfecbda1e481661ab7b93d87703fb140368d3034d5187c53861c7400000000000000000000000000000000
无论我的明文长度如何,我总是在密文末尾得到 16 个 0x00 字节。
如果我用在线 AES 计算器做同样的事情,我会得到这个密文: caf8fe667f4087e1b67d8c9c57fcb1f56b368cafb4bfecbda1e481661ab7b93d87703fb140368d3034d5187c53861c74ccd202bac41937be75731f23796f1516
前 48 个字节caf8fe667f4087e1b67d8c9c57fcb1f56b368cafb4bfecbda1e481661ab7b93d87703fb140368d3034d5187c53861c74是相同的。但我遗漏了最后 16 个字节。
这说:
传递大于 src 的 dst 是可以接受的,在这种情况下,CryptBlocks 只会更新 dst[:len(src)] 而不会触及 dst 的其余部分。
但为什么会这样呢?密文的长度需要比明文的长度长,在线 AES 计算器证明了这一点。
慕村225694
相关分类