Openssl RC4与C ++ RC4(加盐)

时间:2019-04-15 17:09:43

标签: c++ openssl salt rc4-cipher

我正在使用RC4 C ++程序进行更多工作,以与命令行参数兼容。 我想知道是否有人可以向我介绍一些不错的文档,这些文档说明了在加密与解密时,openssl rc4命令行如何使用盐,因此我可以将一些兼容性纳入程序中。 几天前,在这里有人的帮助下,一旦合并了EVP_bytestokey函数,我的程序便与非加盐版本兼容。我研究了opensl使用的EVP_bytestokey函数,文档显示它可以带有salt参数:

“ salt参数在派生中用作盐:它应指向8字节缓冲区,如果不使用盐则应为NULL。”

我用CLI给我的盐创建了一个无符号字符数组,并将它们作为ASCII等效项存储在数组中,以作为SALT参数传入(传递给EVP_bytestokey)。 然后,我比较了文件大小,结果表明该文件的加密/加盐版本比原始文件大16个字节。看来CLI版本在文件前加上了“ salted__”,但仅占16个字节中的8个字节。 有谁知道多余的8个字节来自何处?据我了解,盐在传递到RC4_setkey的密钥流生成器之前会先加在密码短语中,所以我不明白为什么应该更改文件大小,而不是“ salted __”。

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

我这里有使用C函数的文档,但是似乎找不到关于CLI版本机制的任何具体信息,因此,我很乐意在这里获得帮助。

1 个答案:

答案 0 :(得分:0)

所以对于任何好奇的人,我都知道了。加密后,带有salt选项的OpenSSL RC4在文件的开头添加16个字节。前8个字节为:“ salted__”,后8个字节为实际的盐,显示为无符号字符。可以使用Lseek跳过字节1-8,然后可以将字节9-16装入无符号char数组(大小为8字节)。然后将此数组转换为(const unsigned char *),同时作为盐传递给第3个参数EVP_bytestokey()。

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