Есть задача скрыть от пользователя некоторое количество строк, притом не сильным шифрованием. Достаточно просто обломать его любопытство, так что подключением QCA заниматься не хочется.
Также нет требований и на быстродействие.
Но код должен быть симметричным.
Потому спроецируем на Qt классический XOR-алгоритм. Дабы иметь возможность записывать строки нормально в поля вывода и текстовые файлы, в добавок строка кодируется в кексы:
C++ (Qt)
// Функция кодирования строки
QString Widget::stringEncrypt(QString strInput, QString strPassword)
{
int a = 0, b = 0;
QString strResult = "";
// Создание битовых массивов из строк
char* chResult = new char[strInput.size()+1];
char* chPasswd = new char[strPassword.size()+1];
// Копирование строк в битовый массив
for (int i=0; i < strInput.size(); i++)
{
chResult[i] = strInput.toLocal8Bit()[i];
}
chResult[strInput.size()] = 0;
for (int i=0; i < strPassword.size(); i++)
{
chPasswd[i] = strPassword.toLocal8Bit()[i];
}
chPasswd[strPassword.size()] = 0;
// Кодирование информации
while(chResult[a])
{
b=0;
while(chPasswd[b])
{
chResult[a] ^= (chPasswd[b] + (a*b));
b++;
}
if ((unsigned char)chResult[a] < 16) strResult += "0";
strResult += QString("%1").arg((int)((unsigned char)chResult[a]),0,16);
a++;
}
// Перевод строки в уникод, а затем в шестнадцатеричеую систему
//QString strResult = QString::fromLocal8Bit(chResult);
//strResult = strResult.toLocal8Bit().toHex();
// Очистка занимаемой памяти
delete [] chResult;
delete [] chPasswd;
// Возврат результата
return strResult;
}
C++ (Qt)
// Декодирование строки
QString Widget::stringDecrypt(QString strInput, QString strPassword)
{
int a = 0, b = 0;
// Сбор строки из hex-значений
strInput = QString::fromLocal8Bit(QByteArray::fromHex(strInput.toLocal8Bit()));
// Создание битовых массивов из строк
char* chResult = new char[strInput.size()+1];
char* chPasswd = new char[strPassword.size()+1];
// Копирование строк в битовый массив
for (int i=0; i < strInput.size(); i++)
{
chResult[i] = strInput.toLocal8Bit()[i];
}
chResult[strInput.size()] = 0;
for (int i=0; i < strPassword.size(); i++)
{
chPasswd[i] = strPassword.toLocal8Bit()[i];
}
chPasswd[strPassword.size()] = 0;
// Кодирование информации
while(chResult[a])
{
b=0;
while(chPasswd[b])
{
chResult[a] ^= (chPasswd[b] + (a*b));
b++;
}
a++;
}
// Перевод строки в уникод
QString strResult = QString::fromLocal8Bit(chResult);
// Очистка занимаемой памяти
delete [] chResult;
delete [] chPasswd;
// Возврат результата
return strResult;
}
Вроде бы все вполне прилично и даже где-то работает... Но периодически возникает ситуация, что декодированная строка в зависимости от пароля периодически внезапно обрывается. Никак не возьму в толк, где же происходит ошибка
Для удобства выделил функции в отдельный проект с соответствующими полями ввода:
cipherprog_urvin.rar