Adrikk
@Adrikk
Студент

Где допустил ошибку в шифровании/расшифровании с помощью RC4?

Подскажите, где допустил ошибку?
Когда шифрую функцией code(1) - размер выходного шифротекста почему-то очень варьируется от ключа, то есть если в файле с открытым текстом было "123456789" в выходном шифротексте только "%%%%" т.е. только несколько зашифрованных символов.
А при расшифровании из этих же "%%%%" нескольких символов может расшифровать только часть или вообще больший бред выдать...
Не могу понять где допускаю ошибку
Если нужны будут какие-то подробности, я быстро отвечу)
Собственно при шифровании вызываю code и передаю "1", при расшифровании code и передаю "2".
/* ключевое расписание */
void __fastcall TForm2::rc4_init(char *key, int key_length)
{
	for (i = 0; i < 256; i++)
		S[i] = i;
	for (i = j = 0; i < 256; i++)
	{
		unsigned char temp;
		j = (j + (int)key[i % key_length] + S[i]) & 255;
		temp = S[i];
		S[i] = S[j];
		S[j] = temp;
	}
	i = j = 0;
}
/* Вывод одного псевдослучайного байта */
unsigned char __fastcall TForm2::rc4_output()
{
	unsigned char temp;
	i = (i + 1) & 255;
	j = (j + S[i]) & 255;

	temp = S[j];
	S[j] = S[i];
	S[i] = temp;
	return S[(temp + S[j]) & 255];
}
//зашифрование/расшифрование
void __fastcall TForm2::code(int i) {

 if(i==1) {
   rc4_init((char *)password.c_str(), password.Length());
 }
 else if(i==2) {
	rc4_init((char *)password2.c_str(),password2.Length());
 }

 //чтение файла
 char pathToFile[50];
 if(i==1) strcpy(pathToFile,path_ish);
 else strcpy(pathToFile,path_coded);

 ifstream original(pathToFile,ios::in | ios::ate);
 size=(int) original.tellg();
 memblock=new char[size];
 enblock=new char[size];
 original.seekg(0,ios::beg);

 original.read(memblock,size);
 original.close();

 for (int x = 0; x < size; x++)
	{
		enblock[x] = (memblock[x] ^ rc4_output());
	}

 ofstream file;
 if(i==1)
	file.open(path_coded);
 else file.open(path_decoded);
	file << enblock;
	file.close();

	delete[] memblock;
	delete[] enblock;
}
  • Вопрос задан
  • 168 просмотров
Пригласить эксперта
Ответы на вопрос 1
usdglander
@usdglander
Yipee-ki-yay
Разбирать ваш код, я, конечно же разбирать не стал. У меня только вопрос:
Собственно при шифровании вызываю code и передаю "1", при расшифровании code и передаю "2".

Зачем?
Для RC4 P = C(C(P));
Соответственно для расшифрования можно использовать просто повторное шифрование с тем же ключом. К тому же при разных параметрах функции code у вас пароль берётся из разных полей. Вы уверены что они совпадают?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы