0 意味着使用无填充的AES CBC,以该配置,您应该可以看到您的消息。虽然可能在末尾有一些填充字节。所以剩下的是:
- 您没有正确加载密钥。
- 您没有正确加载IV。
- 您没有正确加载数据。
- 服务器正在执行您不希望的操作。
要调试此问题,您需要隔离您的系统。您可以通过实现回环测试来完成这项工作,在其中加密和解密数据以确保您正确加载了所有内容。但是这可能会产生误导。即使您做错了某些事情(例如,反向加载密钥),您仍然可以解密您已经加密的内容,因为您在两侧都以完全相同的错误方式进行操作。
因此,您需要根据已知答案测试
(KAT)进行测试。您可以在AES维基百科条目上查找官方KAT。但恰巧我已经在SO上发布了另一个答案,我们可以使用它。
给定此输入:
KEY: 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
IV: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
PLAIN TEXT: encrypt me
CIPHER TEXT: 338d2a9e28208cad84c457eb9bd91c81
使用第三方程序验证您是否可以解密密码文本并获取明文。
$ echo -n "encrypt me" > to_encrypt
$ openssl enc -in to_encrypt -out encrypted -e -aes-256-cbc \
> -K 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f \
> -iv 0000000000000000
$ hexdump -C encrypted
00000000 33 8d 2a 9e 28 20 8c ad 84 c4 57 eb 9b d9 1c 81 |3.*.( ....W.....|
00000010
$ openssl enc -in encrypted -out plain_text -d -aes-256-cbc \
> -K 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f \
> -iv 0000000000000000
$ hexdump -C plain_text
00000000 65 6e 63 72 79 70 74 20 6d 65 |encrypt me|
0000000a
现在尝试在您的程序中解密这个已知答案测试。请确保启用PKCS7填充,因为这是我在此示例中使用的填充方式。作为练习,尝试不使用填充进行解密,并查看结果是否相同,只是在“加密我”文本后面有填充字节。
实施KAT是一个重要的步骤。它表示您的实现是正确的,但是您对服务器行为的假设是错误的。然后就是时候开始质疑这些假设了...
(顺便说一下,您提到的那些选项并不是互斥的。ECB表示没有IV,而CBC表示您有一个IV。与填充没有关系。)
好吧,我知道我说过这是一个练习,但我想证明即使您使用填充进行加密,不使用填充进行解密,也不会得到垃圾数据。因此,给定使用PKCS7填充的KAT,我们使用“无填充”选项进行解密,并获得可读的消息,后面跟随着用作填充字节的06
。
$ openssl enc -in encrypted -out plain_text -d -aes-256-cbc \
-K 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f \
-iv 0000000000000000 -nopad
$ hexdump -C plain_text
00000000 65 6e 63 72 79 70 74 20 6d 65 06 06 06 06 06 06 |encrypt me......|
00000010
$
"PKCS5Padding"
字符串 - 它实际上与PKCS#7填充完全相同。这适用于大多数允许不同块密码使用PKCS#5填充的应用程序。在答案中澄清了这一点... - Maarten Bodewes