Здравствуйте. Шифрую строку RC4 алгоритмом. Если я задаю текст явно в коде, то все работает как надо, но если я беру его из элемента, то нет.
RC4:C
#include "rc4.h"
unsigned char S[256];
unsigned int i,j;
void RC4::swap(unsigned char *array, int ind1, int ind2)
{
unsigned char temp = array[ind1];
array[ind1] = array[ind2];
array[ind2] = temp;
}
RC4::RC4(){
}
void RC4::init(unsigned char *key,unsigned int key_lenght)
{
for (i = 0; i < 256; i++)
{
S[i] = i;
}
j = 0;
for (i = 0; i < 256; i++)
{
j = (j + S[i] + key[i % key_lenght]) % 256;
swap(S, i, j);
}
i = j = 0;
}
unsigned char RC4::kword()
{
i = (i + 1) % 256;
j = (j + S[i]) % 256;
swap(S, i, j);
unsigned char K = S[(S[i] + S[j]) % 256];
return K;
}
void RC4::code(unsigned char *data, unsigned int data_length)
{
for (int i = 0; i < data_length; i++)
{
data[i] = (data[i] ^ kword());
}
}
Использование:
//char text[]="ТАК ВСЁ РАБОТАЕТ!";
char *text=ui->plainTextEdit->toPlainText().toUtf8().data();
rc= new RC4();
rc->init((unsigned char*)"keykeykey",9);
rc->code((unsigned char*)text,sizeof(text));
delete(rc);
QMessageBox::information(this,"Зашифрованно!",text);
rc=new RC4();
rc->init((unsigned char*)"keykeykey",9);
rc->code((unsigned char*)text,sizeof(text));
delete(rc);
QMessageBox::information(this,"Расшифрованно!",text);
Заранее огромное спасибо за помощь!
скорее всего кодировка исходных файлов у тебя не UTF-8, а cp1251. чтобы получить аналогичный результат из переменной, используй toLocal8Bit() вместо toUtf8().
скорее всего кодировка исходных файлов у тебя не UTF-8, а cp1251. чтобы получить аналогичный результат из переменной, используй toLocal8Bit() вместо toUtf8().
Спасибо. Но я кажется понял. Просто указатель помирает... Потому что
C
char *text=ui->plainTextEdit->toPlainText().toUtf8().data();
Видимо QByteArray сразу после этой строки удаляется из стека(ведь так?). Сделал вот так:
C
QByteArray crypt=ui->plainTextEdit->toPlainText().toUtf8().data();
rc= new RC4();
rc->init((unsigned char*)"keykeykey",9);
rc->code((unsigned char*)crypt.data(),crypt.length());
delete(rc);
Все заработало! Эх... Тяжело переходить с C# и Java :)