C++ openssl rc4命令行加密和实现rc4的cpp文件之间的区别

C++ openssl rc4命令行加密和实现rc4的cpp文件之间的区别,c++,linux,openssl,rc4-cipher,C++,Linux,Openssl,Rc4 Cipher,我正在尝试通过RC4加密一个文本文件,并使用我用openssl/RC4头编写的cpp文件,然后通过命令行解密,以证明我的实现是正确的 下面是我对该文件的终端命令,下面是cpp文件,以及我对其使用的终端编译命令 除了一些模糊的youtube视频解释RC4密码是如何工作的(我已经知道了),网上几乎没有关于这方面的任何信息。我在手册页中找不到任何东西来解释openssl实现的细节 任何关于为什么我的cpp文件没有解密到原始内容的提示都将不胜感激。我在这里拼命想弄清楚这件事。 提前谢谢 (是的,我知道有

我正在尝试通过RC4加密一个文本文件,并使用我用openssl/RC4头编写的cpp文件,然后通过命令行解密,以证明我的实现是正确的

下面是我对该文件的终端命令,下面是cpp文件,以及我对其使用的终端编译命令

除了一些模糊的youtube视频解释RC4密码是如何工作的(我已经知道了),网上几乎没有关于这方面的任何信息。我在手册页中找不到任何东西来解释openssl实现的细节

任何关于为什么我的cpp文件没有解密到原始内容的提示都将不胜感激。我在这里拼命想弄清楚这件事。 提前谢谢

(是的,我知道有一些漏洞使得RC4不是一个好的选择,但现在,我只想了解这些漏洞是如何工作的)

命令行加密:

openssl rc4-40 -k PASSword123 -in /home/chris/Desktop/test.txt -out /home/chris/Desktop/ssloutput.txt -p -nosalt
cpp文件编译:

g++ rc4.cpp -o rc4 -lssl -lcrypto
cpp文件:

#include <openssl/rc4.h>
#include <string>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
    int fd = open("/home/chris/Desktop/ssloutput.txt", O_RDWR);
    unsigned char keygen[12] = "PASSword123";
    RC4_KEY key;

    struct stat st;
    fstat(fd, &st);
    int size = st.st_size;

    unsigned char* fileIn;
    fileIn = (unsigned char*) calloc(size, sizeof(char));
    pread(fd, fileIn, size, 0);
    unsigned char *fileOut = (unsigned char*)malloc(size);

    RC4_set_key(&key, 16, keygen);
    RC4(&key, size, fileIn, fileOut);
    close(fd);

    int fd2 = open("/home/chris/Desktop/rc4output.txt", O_RDWR | O_CREAT);
    pwrite(fd2, fileOut, size, 0);
    close(fd2);

    free(fileIn);
    free(fileOut);

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main()
{
int fd=open(“/home/chris/Desktop/ssloutput.txt”,O_RDWR);
无符号字符keygen[12]=“PASSword123”;
RC4_键;
结构统计;
财政司司长(财务司司长及财政司司长);
int size=st.st\u size;
未签名字符*fileIn;
fileIn=(unsigned char*)calloc(size,sizeof(char));
pread(fd,fileIn,size,0);
无符号字符*文件输出=(无符号字符*)malloc(大小);
RC4设置键(&key,16,keygen);
RC4(键、大小、文件输入、文件输出(&E));
关闭(fd);
int fd2=open(“/home/chris/Desktop/rc4output.txt”,O_RDWR | O_CREAT);
pwrite(fd2,文件输出,大小,0);
关闭(fd2);
免费(备案);
免费(归档);
返回0;
}

因此,这里有一个版本的代码,添加了大量错误检查,修复了错误,还有一些奇怪的东西(使用
O_RDWR
open()
,当你只在读或写时?
pread()
pwrite()
),并使用
EVP\u BytesToKey()
-k
选项类似,openssl rc4使用(这是关键因素):

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(){
int fd=打开(“ssloutput.txt”,仅限Ordu);
如果(fd<0){
perror(“openssloutput.txt”);
返回1;
}
结构统计;
如果(fstat(fd和st)<0){
佩罗尔(“fstat”);
返回1;
}
尺寸=标准尺寸;
unsigned char*fileIn=calloc(大小,1);
如果(!fileIn){
perror(“calloc”);
返回1;
}
如果(读取(fd、文件输入、大小)!=(ssize_t)大小){
佩罗(“阅读”);
返回1;
}
关闭(fd);
unsigned char*fileOut=malloc(大小);
如果(!fileOut){
佩罗尔(“马洛克”);
返回1;
}
//按照与openssl rc4-k foo相同的规则准备密钥
char-keygen[]=“PASSword123”;
RC4_键;
无符号字符计算_键[16];
如果(EVP_BytesToKey)(EVP_rc4(),EVP_sha256(),NULL,
(常量无符号字符*)键根,strlen(键根),1,
计算(U键,空)!=16){
fputs(“计算rc4密钥时出错!\n”,stderr);
返回1;
}
//应该与openssl rc4-p打印出来的匹配
fputs(“key=”,标准输出);
对于(大小n=0;n
演示:

$ cat input.txt
the quick brown dog jumped over the lazy red fox.
$ gcc -o myrc4 -O -Wall -Wextra myrc4.c -lcrypto
$ openssl rc4 -k PASSword123 -md sha256 -p -nosalt -in input.txt -out ssloutput.txt
key=B554C1D224D8EF1738ED4EE238317463
$ ./myrc4
key=B554C1D224D8EF1738ED4EE238317463
$ cat rc4output.txt
the quick brown dog jumped over the lazy red fox.

加密文件和普通文件的大小是否相同?是的,它们都是116字节。即使它们不是,也不重要(尽管从技术上讲,它们总是使用RC4)。算法应该是对称的。如果您在CLI上使用
rc4-40
,那么您肯定应该将
5
传递给
rc4\u set\u key()
作为密钥大小?否则,如果要使用16字节键,请在CLI上使用
rc4
模式。但无论如何,当我在CLI中只运行rc4而不是rc4-40时,它应该与密钥大小=16匹配,但文件仍然不匹配。这是一个15字节的密钥。。。如果你仍然告诉函数使用16,是的,仍然是个问题。非常感谢,这是完美的(这是一个C++文件),所以我不得不把MALLC和CALLC调用(unISGNTED CHAR *)所以,你说的问题不包括EVPYBASEY到KEY?你在哪里找到了它需要的信息?我很高兴代码修复,但是我想知道你是如何到达那里的。我认为应该把功能内置到LSSL和LICODETO库中,如果这是C++,为什么它会使用?code>malloc()
,C cast,C header等等?看起来像C,我想C.没有注意到标记。总之,我需要
EVP\u BytesToKey()
从我在评论中链接到的那个问题。然后就是阅读该函数的文档。这个问题演示了如何使用
-K
为openssl提供用作密钥的确切字节,所以我选择了另一条路线,演示了如何使用
-K
。哇,我不敢相信我掩盖了这一点他特别提到了函数lol。无论如何,谢谢你的帮助。非常感谢。不过,OpenSSL文档肯定还有待改进。