mbedtls 和 openssl 之间的不同 AES-256 加密输出
Posted
技术标签:
【中文标题】mbedtls 和 openssl 之间的不同 AES-256 加密输出【英文标题】:Different AES-256 encryption output between mbedtls and openssl 【发布时间】:2021-11-07 12:37:59 【问题描述】:我正在开发一个需要通过 mbedtls 解密文件的应用程序,该文件由 openssl 加密。目前,解密不起作用。经过调查,我发现我无法使用这两个框架创建相同的加密文件。两种加密方式有什么区别?
OpenSSL:
-> ✗ cat message
hello world
-> ✗ openssl aes-256-ecb -nosalt -K 6261757363680000000000000000000000000000000000000000000000000000 -in message -out koekoek.bin
-> ✗ xxd koekoek.bin
00000000: 68e1 1f1e 8397 a33e ddea 5c4d 3192 11ab h......>..\M1...
MbedTLS:
(gdb) p (void)memset(decrypt_output, 0, 16)
$63 = void
(gdb) p sprintf(decrypt_output, "hello world")
$64 = 11
(gdb) p/x key
$65 = 0x62, 0x61, 0x75, 0x73, 0x63, 0x68, 0x0 <repeats 26 times>
(gdb) p mbedtls_aes_setkey_enc(&aes, key, 256)
$66 = 0
(gdb) p mbedtls_aes_crypt_ecb(&aes, MBEDTLS_AES_ENCRYPT, decrypt_output, decrypt_output)
$67 = 0
(gdb) p/x decrypt_output
$68 = 0x1b, 0x7c, 0x4d, 0x41, 0xaf, 0xa4, 0x65, 0x7f, 0x56, 0x39, 0x95, 0x2a, 0x21, 0x32, 0x10, 0xab
(gdb)
【问题讨论】:
您在openssl
中加密的数据(文件)包含字符 h e l l o sp w o r l d
和一个 NEWLINE, PLUS 默认情况下 openssl enc
添加 PKCS5/7 PADDING 到块边界(在这种情况下 4 个字节包含 04)。您需要使数据完全相同相同。 PS:对于这样的键,你可以说openssl enc -K 626175636368
,它是零填充; OTOH,您首先不应该使用像这样的非常低熵的键。
在 Dave 的评论中不是很明确,但 mbed_tls
默认不填充,而 openssl
CLI 默认使用 PKCS#7 兼容填充。所以你必须在mbed_tls
中执行填充。
【参考方案1】:
以下openssl
命令产生的结果与您的 mbedtls 脚本相同:
echo -ne "hello world\0\0\0\0\0" | openssl aes-256-ecb -nopad -K 6261757363680000000000000000000000000000000000000000000000000000 | xxd -p
产生:
1b7c4d41afa4657f5639952a213210ab
请注意,输入字符串的长度最多为 16 个字符(即一个 AES 块的长度),使用空 (\0
) 字符,以匹配 mbedtls 默认所做的(-e
选项需要与echo
允许输入中的空字符)。此外,-n
选项与echo
一起使用,因此echo
不会在输入中附加换行符。最后,-nopad
选项与openssl
命令一起使用,因此openssl
不会添加额外的 pkcs#7 填充块。
【讨论】:
以上是关于mbedtls 和 openssl 之间的不同 AES-256 加密输出的主要内容,如果未能解决你的问题,请参考以下文章
使用mbedtls的使用说明和AES加密方法(原来的PolarSSL)
mbedtsl与openssl的区别,物联网嵌入式一般用哪个?