C ++ ofstream输出文件不等于输出到文件

时间:2017-11-21 06:31:32

标签: c++ file encryption ofstream

我使用简单的算法来加密文本文档。它对前120个字符的工作正常。我的问题是控制台输出和输出文件中写入的加密内容之间的区别。 你能帮我吗?

#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <fstream>
#include <string>
#include <stdio.h>
using namespace std;

int main() {
int Ra;
string filename;
cout<< "enter file name to encrypt"<<endl;
getline(cin,filename);
filename.append(".txt");
string line;
string page;
 ifstream infile;
infile.open (filename.c_str());
if (infile.is_open())
{
 while ( getline (infile,line) )
 {
   cout << endl<<line << '\n';
 page=page+line;
}
infile.close();
}
else
{cout << "Unable to open file";
exit(1);}
char page2[page.length()];
//convert string to char
for (int a=0;a<=page.length()-1;a++)
    {
        page2[a]=page[a];

    }
char output[page.length()];

srand (time(NULL));
int seed=rand() % 99900000;

srand (seed);
//encrypt
for(int b=0;b<=page.length()-1;b++){
Ra=rand() % 1000;
output[b]=page2[b]+Ra;
cout<<b<<","<<page[b]<<","<<page2[b]<<","<<output[b]<<endl;
}

//display+put back
cout<<"output encrypted"<<endl;
ofstream outfile ;
outfile.open (filename.c_str(),ios::trunc);
if (outfile.is_open()){
    cin.sync();
for (int c=0;c<=page.length()-1;c++){
cout<<output[c]<<", ";
outfile<<output[c];
    }
 outfile.close();
}
else cout << "Unable to open file";
cout<<endl<<"key= "<<seed;
cout << endl << "Press any key to continue...";
cin.sync();
cin.ignore();
return 0;
}

original text doc

output and final result not equal

1 个答案:

答案 0 :(得分:0)

char page2[page.length()]; //?
//convert string to char
for (int a=0;a<=page.length()-1;a++) page2[a]=page[a];
char output[page.length()];

您不需要将字符串转换为char数组。 page已将字符保存在数组中。如果您愿意,可以使用std::string page2 = page;std::string output = page;

Ra=rand() % 1000;
output[b]=page2[b]+Ra;

每个字节保存0到255之间的值。如果添加最多1000的随机值,则无法撤消操作。

在这种贫民窟加密方案中,您不希望超过char限制。您可以改用^运算符。然后以二进制格式写入加密数据:

srand(seed);
string output = page;
for(size_t b = 0; b < page.length(); b++)
    output[b] ^= (rand() % 0xFF);

ofstream outfile("encrypted.binary", ios::binary);
outfile.write(output.data(), output.size());
outfile.close();

然后你可以再次读取数据(二进制)并再次使用XOR运算符:

std::string decrypt = output;
srand(seed);
for(size_t b = 0; b < page.length(); b++)
    decrypt[b] ^= (rand() % 0xFF);

ofstream filedecrypt("decrypted.txt");
filedecrypt.write(decrypt.data(), decrypt.size());
filedecrypt.close();

编辑:

请注意,这是&#34;混淆&#34;不加密。它还要求程序由相同的编译器/机器制作,以便rand中的重复可以重复。

对于实际加密,您可以学习AES。最简单的解释是,AES使用密钥。这个密钥有点像密码,但它长达32个字节,并且它不会从A到Z,从0变为255.

AES使用密钥和安全随机数生成器来创建长度为16个字节的加密块,让我们说这些随机字节:

{29, 23, BE, 84, E1, 6C, D6, AE, 52, 90, 49, F1, F1, BB, E9, EB}

然后XOR用纯文本创建秘密文本。然后,AES将根据前一个块,前一个16字节的纯文本和密钥创建另一个16字节的加密块。

以最简单的方式,这与您正在做的有些相似,但它不是获得一个字节rand(),而是从aes()得到16个字节。来自AES的序列不能是谓词(除了暴力攻击,需要一百万年)

使用OpenSSL等库来实现AES加密。