Openssl RC4 与 C++ RC4(加盐)

Openssl RC4 vs C++ RC4 (with salt)

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

"The salt parameter is used as a salt in the derivation: it should point to an 8 byte buffer or NULL if no salt is used."

我用 CLI 给我的 salt 创建了一个 unsigned char 数组,并将它们作为 ASCII 等价物存储在数组中,以作为 SALT 参数传入(到 EVP_bytestokey)。 然后我比较了文件大小,它显示文件的 encrypted/salted 版本比原始文件大 16 个字节。看起来 CLI 版本将 "salted__" 添加到文件中,但这只占 16 个字节中的 8 个。 有谁知道额外的 8 个字节从何而来?据我所知,盐在传递到 RC4_setkey 的密钥流生成器之前被添加到密码短语中,所以我不明白为什么要在 "salted__".[=10 之外更改文件大小=]

此外,您认为我使用 SALT 数组的方向是否正确,将十六进制值存储为 ASCII 等价物?

我有这里使用的 C 函数的文档,但我似乎找不到任何关于 CLI 版本机制的具体信息,所以我将不胜感激我能在这里得到的任何帮助。

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

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