Openssl RC4 vs C++ RC4 (with salt)

Openssl RC4 vs C++ RC4 (with salt)

本文关键字:RC4 salt with C++ vs Openssl      更新时间:2023-10-16

我正在使用RC4 C++程序进行更多工作,以与命令行参数兼容。 我想知道是否有人可以指出一些不错的文档的方向,说明命令行 openssl rc4 在加密与解密时如何使用盐,这样我就可以将一些兼容性合并到我的程序中。 感谢几天前有人在这里的一些帮助,一旦合并了EVP_bytestokey功能,我的程序就与非加盐版本兼容。我研究了openssl使用的EVP_bytestokey函数,文档显示它可以采用salt参数:

"salt 参数在推导中用作盐:如果未使用盐,它应该指向 8 字节缓冲区或 NULL。

我用 CLI 给我的盐创建了一个无符号字符数组,并将它们作为 ASCII 等价物存储在数组中,作为 SALT 参数传入(到 EVP_bytestokey)。 然后我比较了文件大小,它显示文件的加密/加盐版本比原始文件大 16 字节。CLI 版本似乎在文件前面附加了"salted__",但这只占 16 个字节中的 8 个。 有谁知道额外的 8 个字节来自哪里?据我了解,盐在传递到密钥流生成器之前会附加到密码短语RC4_setkey所以我不明白为什么要在"salted__"之外更改文件大小。

另外,您认为我在 SALT 数组上朝着正确的方向前进,将十六进制值存储为 ASCII 等价物吗?

我有这里使用的 C 函数的文档,但我似乎找不到有关 CLI 版本机制的任何具体内容,因此我将不胜感激我能在这里获得的任何帮助。

所以对于任何好奇的人来说,我想通了。带有盐选项的 OpenSSL RC4 在加密后在文件的开头预置 16 个字节。前 8 个字节是:"salted__",后 8 个字节是实际的盐,显示为无符号字符。Lseek 可用于跳过字节 1-8,然后可以将字节 9-16 加载到无符号字符数组中(大小必须为 8 字节)。然后,此数组应强制转换为 (const 无符号字符*),同时作为盐传递给 EVP_bytestokey(),这是第三个参数。

至于盐的用户输入选项,我将其设置为将两位十六进制输入到一个 int 变量中,然后将其传递到无符号字符盐数组中。