我正在使用一个与命令行参数兼容的RC4 C++程序。我想知道是否有人可以给我一些合适的文档,告诉我在加密和解密时openssl rc4是如何使用盐的,这样我就可以在我的程序中加入一些兼容性。感谢几天前在这里的一些人的帮助,一旦加入了EVP_bytestokey功能,我的程序就可以与非加盐版本兼容。我研究了openssl使用的EVP_bytestokey函数,文档显示它可以接受salt参数:
“salt参数在派生中用作盐:它应指向8字节的缓冲区,如果未使用盐,则为NULL。”
我用命令行界面给我的盐创建了一个无符号字符数组,并将它们作为ASCII码的等价物存储在数组中,以便作为盐参数传递给EVP_bytestokey。然后我比较了文件大小,结果显示加密/加盐版本的文件比原始文件大了16个字节。似乎CLI版本会在文件前面加上"salted__“,但这只占16个字节中的8个。有谁知道额外的8个字节是从哪里来的?据我所知,在传递到RC4_setkey的密钥流生成器之前,盐会被预先添加到密码短语中,所以我不明白为什么要在"salted__“之外更改文件大小。
另外,您认为我使用SALT数组,将十六进制值存储为ASCII等效值的方向正确吗?
我有这里使用的C函数的文档,但我似乎找不到任何关于CLI版本的机制的具体内容,所以我希望在这里能得到任何帮助。
发布于 2019-04-18 05:18:05
因此,对于任何好奇的人,我都想通了。使用salt选项的OpenSSL RC4在加密后会在文件的开头添加16个字节。前8个字节是:"salted__“,后8个字节是实际的盐,显示为无符号字符。Lseek可以用来跳过字节1-8,然后字节9-16可以加载到无符号字符数组中(必须是8个字节)。然后将此数组转换为(const unsigned char*),同时作为盐传递给EVP_bytestokey(),这是第三个参数。
至于盐的用户输入选项,我将其设置为将两位十六进制输入传入一个int变量,然后将该变量传递给unsigned char salt数组。
https://stackoverflow.com/questions/55694194
复制相似问题