我正在尝试使用我用openssl / rc4标头编写的cpp文件通过RC4加密文本文件,然后通过命令行解密以表明我的实现是正确的。
该文件的终端命令在下面,而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;
}
答案 0 :(得分:1)
因此,这是您的代码版本,其中添加了许多错误检查,已修复的错误,奇怪的东西(仅在读或写时将O(1)
与O_RDWR
一起使用?{{1} }?open()
?),然后像pread()
的{{1}}选项一样使用pwrite()
使用(那是关键(heh)因素):
EVP_BytesToKey()
演示:
-k