c++ - 如何创建与 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 代码中得到的不匹配。我在这里想念什么?
在我的代码中找到一个最小的、可验证的、完整的示例来演示结果。
解决方案
我想到了。问题是我使用了错误的命令行参数。它应该是-K
关键,而不是-k
。这是正确的格式:
printf '%s' '48656c6c6f20776f726c6421' | xxd -r -ps | openssl aes-256-cbc -iv 00000000000000000000000000000000 -K 0000000000000000000000000000000000000000000000000000000000000000 -nosalt | xxd -ps
这给出了与 C++ 中的 OpenSSL 完全相同的结果。
推荐阅读
- c++ - 如何使用主要参数添加更多堆栈?
- php - PHP Decimal128 字符串格式化
- ios - 打印语句总是崩溃
- azure-devops - 如何从 Azure DevOps 在 Microsoft AppCenter 中运行 XCUITests
- javascript - 如何延迟请求数据?
- python - pandas 中的高效 STAR 选择
- python - “int”类型的参数是不可迭代的问题
- javascript - 使用 Google App Script 替换 Google Sheet 中的文本而不重新格式化值
- linux - 在 Spark 中运行多个作业
- java - 生成一个 jar 并将其用作另一个模块中的依赖项