我有一个简单的应用程序,它接受文本和密码,生成文本将其写入文件然后尝试检索并解密它。在加密之前,生成'pad',这是从密码生成的字符串,其长度为文本长度。当我尝试检索文本时出现问题,因为无论我如何尝试,我都会继续检索错误的文本,因为它与密码的长度不匹配。
cout << " !!! DEBUG ONLY. CHANGE MAIN CODE BEFORE RELEASE !!!\n";
string text, password, file;
cout << "Please enter the text you would like encrypted: ";
getline(cin, text);
cout << "Please enter the password for creating the cipher: ";
getline(cin, password);
cout << "Please enter the file path: ";
getline(cin, file);
password = GeneratePad(password, text.size());
string separator = "30436f4a57e831406e8c0ef203923fe3ba9d0ac4TB5Mi4b33A";
ofstream mann(file.c_str(), ios::app);
mann << "\n" << separator << CryptText(text, password);
mann.close();
cout << " !!! DEBUG ONLY. CHANGE MAIN CODE BEFORE RELEASE !!!\n";
ifstream frau(file.c_str(), ios::binary);
string foobar;
bool barfoo = false;
string decrypted;
while (!barfoo)
{
getline(frau, foobar);
if(foobar.find(separator) != string::npos){
decrypted += foobar.substr(separator.length() + 1);
cout << "SUBSTR " << foobar.substr(separator.length() + 1);
barfoo = true; } }
while (getline(frau, foobar))
{
decrypted += foobar;
}
string decrypted2;
cout << " LEN " << decrypted.length() << " !!!!! " << decrypted << endl;
decrypted2 = CryptText(decrypted, password);
cout << decrypted2 << endl;
system("PAUSE");
看似不是必需的东西纯粹是为了调试(比如输出原始的加密文本等)。关于为什么会发生这种情况的任何想法?
答案 0 :(得分:2)
问题1:您在文本模式下打开输出文件,但是以二进制模式读回。
std::ofstream mann(file.c_str(), std::ios::app|std::ios::binary);
问题2:您的加密数据可能不再是ASCII文本了。它可能包含特殊字符,如'\ n'或^ Z,甚至包含嵌入的'\ 0'字符。您应该使用未格式化的i / o,如read()和write(),而不是getline()和&lt;&lt;。
补充评论:
不要使用系统(“PAUSE”);.它风格很差,并且使程序不必要地依赖于系统。只需使用常规C ++ i / o编写暂停消息并等待返回按下。
std::cout << "Press return to continue" << std::endl;
std::getline();
我建议不要使用“使用namespace std”,而只需在需要时使用std :: qualifier。它让事情变得更加清洁。
答案 1 :(得分:0)
我进行了以下两次编辑:
ofstream mann(file.c_str(), ios::app|ios::binary);
while (getline(frau, foobar))
{
decrypted += foobar;
decrypted += "\n";
}
当我打开文件进行阅读时,我还添加了ios :: binary,当我添加到解密的字符串时,我添加了“\ n”,它被'getline'删除了。 它现在完美无缺。