Я работаю над попыткой зашифровать текстовый файл через RC4 с помощью файла cpp, который я написал с заголовками openssl/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
СРР-файл:
#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;
}
rc4-40
в интерфейсе командной строки, наверняка вы должны передавать5
вRC4_set_key()
в качестве размера ключа? В противном случае, если вы хотите использовать 16-байтовые ключи, используйте режимrc4
в CLI. - person Alastair McCormack   schedule 11.04.2019keygen
составляет 12 байтов (на самом деле 11, поскольку вы не должны считать конечный 0), почему вы говоритеRC4_set_key()
, что это 16? Это, вероятно, вызывает все виды прекрасного неопределенного поведения из-за доступа к массиву за пределами границ. - person Shawn   schedule 11.04.2019