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的区别,物联网嵌入式一般用哪个?

具有不同端口的同一服务器上的 2 个连接 mbedtls

Mbedtls_pk_parse_public_key 返回 0xfffffff0 和 secp256k1 公钥

OpenSSL 和 C# 之间的不同 S/MIME 签名

FreeRTOS+TCP 和 mbedTLS+TCP