首页 > 解决方案 > 如何创建与 OpenSSL C++ 输出相比的 OpenSSL 输出以生成单元测试?

问题描述

我正在为 OpenSSL 的 AES-256-CBC 加密使用 C++ 包装器,它遵循OpenSSL docs中的配方。它意味着需要一些数据来加密,一个密钥和一个初始化向量,并返回加密的字节。

现在在相对意义上,加密和解密工作正常。我可以加密任何东西并解密它并检索原始数据。但是,我想从绝对意义上对其进行测试。因此,我在命令行/终端中使用 OpenSSL 来创建加密数据,然后将其注入我的测试中。但是输出不匹配,我不确定从哪里开始或如何系统地解决这个问题。

要生成十六进制数据:

printf '%s' 'Hello world!' | xxd -ps

返回48656c6c6f20776f726c6421

然后,使用 OpenSSL 对其进行加密:

printf '%s' '48656c6c6f20776f726c6421' | xxd -r -ps | openssl aes-256-cbc -iv 00000000000000000000000000000000 -k 0000000000000000000000000000000000000000000000000000000000000000 -nosalt | xxd -ps

这给出了f1b486ded0fd22dad9dbdab2205f61c2.

xxd -r将十六进制转换为字节,xxd反之亦然。我也试过用plain Hello world!withoutxxd开头,但也是错误的。结果总是与我在 C++ OpenSSL 代码中得到的不匹配。我在这里想念什么?

在我的代码中找到一个最小的、可验证的、完整的示例来演示结果。

标签: c++unit-testingencryptionterminalopenssl

解决方案


我想到了。问题是我使用了错误的命令行参数。它应该是-K关键,而不是-k。这是正确的格式:

printf '%s' '48656c6c6f20776f726c6421' | xxd -r -ps | openssl aes-256-cbc -iv 00000000000000000000000000000000 -K 0000000000000000000000000000000000000000000000000000000000000000 -nosalt | xxd -ps

这给出了与 C++ 中的 OpenSSL 完全相同的结果。


推荐阅读