2011-12-21 3 views
1

Я создаю приложение, которое записывает небольшой файл txt, содержащий 3 строки, затем загружает их обратно в приложение в виджет списка.Простое шифрование и дешифрование документа txt

Все это работает нормально, но теперь я хочу сделать так, чтобы txt-файл не был в обычном тексте. Мне не нужен сложный шифр или что-нибудь, что требует ключа для шифрования и дешифрования. Я просто хочу иметь возможность зашифровать его при сохранении (сохраняет документ, который не является простым текстом) и расшифровывать его, прежде чем он загрузит его обратно в потерянный виджет.

Ниже приведен мой код для записи и чтения из txt-файла. Я просто хотел, чтобы переработать это так что это не простой текст ничего другого, и я не волнует, что его не обеспечить только не простой текст

QFile m_file("mytext.txt"); 
m_file.open(QFile::WriteOnly | QFile::Append); 
QTextStream m_stream(&m_file); 
m_stream << ui->txt_1->text() + " " + ui->txt_2->text() + " " + ui->txt_3->text()       <<; 
m_file.close(); 




QFile n_file("mytext.txt"); 
n_file.open(QFile::ReadOnly); 
QTextStream n_stream(&n_file); 
int i=0; 
while (!n_stream.atEnd()) 
{ 
    ui->listWidget->addItem(n_stream.readLine()); 
    i++; 
} 
+3

Если все, что вам нужно, это голый минимум, вы всегда можете просто сохранить XOR все байты при сохранении, а затем снова XOR при загрузке данных. Это остановит людей, которые думают, что открытие файла в «Блокноте» - хакерство ", хотя, конечно, любой, кто знает что-либо о криптографии, быстро выяснит это. –

+0

@JeremyFriesner XOR байты с чем? – erickson

+0

спасибо за комментарий, что я видел это на разных форумах, но я не знаю, как это сделать в любом случае, кто-нибудь может создать образец кода только для xor txt doument? – AngryDuck

ответ

1

Я знаю, что вы не хотите слышать это, но шифрование является то, вы не хотите заниматься самим собой. Самое простое - использовать для этого хорошую библиотеку, такую ​​как Crypto++.

Если вы действительно чувствуете необходимость что-то сделать самостоятельно, то Vignère cipher - очень простой алгоритм для кодирования, но также очень простой для взлома.

+0

@user В чем смысл? Если вы не хотите безопасности, оставьте его как есть. Почему вы хотите притворяться, что обеспечиваете это? –

1

Может быть?

void cyptStr(char *str){ 
    if(!str){ 
     return; 
    } 
    char *end = str + (strlen(str) - 1); 
    for(;str < end;str++){ 
     if (*str != ' ') 
      *str ^= 1; 
    } 
} 
void ucyptStr(char *str){ 
    if(!str){ 
     return; 
    } 
    char *end = str + (strlen(str) - 1); 
    for(;str < end;str++){ 
     if (*str != ' ') 
      *str ^= 1; 
    } 
} 
+0

Это приведет к удалению любых символов '!' Из строки. Вы бы лучше сделали XOR'ing - измените оба тела цикла на '* str^= 1' (или какое-то другое значение). –

+3

Это не XORing. Это похоже на ROT1. – erickson

+0

@MikeSeymour: Я неравнодушен к XOR 0x42, сам – Hasturkun

1

Я предполагаю, что из вашего вопроса и комментариев вы не хотите, чтобы какая-либо внешняя библиотека достигла этой простой задачи. Вот альтернативы:

1- Использовать собственную функцию шифрования/дешифрования. Затем просто запустите функцию шифрования при записи, вызовите функцию дешифрования при чтении. Здесь можно использовать код для этой цели. (Та же функция используется для ENC/DEC, немного Hacky)

string encryptDecrypt(string toEncrypt) { 
    char key[3] = {'K', 'C', 'Q'}; //Any chars will work, in an array of any size 
    string output = toEncrypt; 

    for (int i = 0; i < toEncrypt.size(); i++) 
     output[i] = toEncrypt[i]^key[i % (sizeof(key)/sizeof(char))]; 

    return output; 
} 

int main(int argc, const char * argv[]) 
{ 
    string encrypted = encryptDecrypt("kylewbanks.com"); 
    cout << "Encrypted:" << encrypted << "\n"; 

    string decrypted = encryptDecrypt(encrypted); 
    cout << "Decrypted:" << decrypted << "\n"; 

    return 0; 
} 

2- Для абсолютной безопасности и более стандартного кода использовать алгоритм шифрования. Лучший способ использовать алгоритм шифрования - выбрать самую современную криптографическую библиотеку, такую ​​как Crypto++ или Qt Cryptographic Architecture (QCA).

Выбор за вами.

Смежные вопросы