Jan*_*man 0 c++ encryption xor
我正在制作一个基于XOR的en/decryptor,就像这样工作.你有一个明文字符,例如3,和一个用户密钥,例如5.写入位:
3 = 00000011
5 = 00000101
Run Code Online (Sandbox Code Playgroud)
现在,如果我们进行XOR操作,我们得到6:
6 = 00000110
Run Code Online (Sandbox Code Playgroud)
这可以通过说6 XOR 5(即3)来反转.
所以我做了这个程序.但它确实有错误,它不会正确翻译文本,并且它会在文件的末尾添加许多字符,具体取决于您使用的是哪个键.
using namespace std;
int main(int argc, char *argv[])
{
char buffer[5001];
ifstream fin("a.txt", ifstream::in);
ofstream fout("b.txt");
int key;
char znak;
// console
cout << "Key: ";
cin >> key;
fin.get(znak);
while(!fin.eof() && znak != ' ')
{
fin.get(buffer, sizeof(buffer));
}
for(int i = 0; i < sizeof(buffer); i++)
{
fout << function(key, buffer[i]);
}
cout << "done" << endl;
cin.get();
return 0;
}
char function(int key,char input)
{
return input ^ key;
}
Run Code Online (Sandbox Code Playgroud)
为什么程序不正确翻译文本?为什么它会在文件末尾添加字符?
从外观来看,加密几乎与任何事情(或至少与问题无关)在这里.
while(!fin.eof() && znak != ' ')
Run Code Online (Sandbox Code Playgroud)
表单的循环while (!whatever.eof())
几乎可以保证不正常工作.
fin.get(buffer, sizeof(buffer));
Run Code Online (Sandbox Code Playgroud)
当你做,请注意,它并不能保证它会读取sizeof(buffer)
字符-只是它不会读取任何多比.您通常会在文件末尾获得更少的内容,而只是没有那么多字符可供阅读.[编辑:我还要提到的是,你可以阅读在其他地方少,以及-例如,如果你从网络连接读,这是相当普遍接受的部分缓冲区,但是当它到达更晚.]
for(int i = 0; i < sizeof(buffer); i++)
Run Code Online (Sandbox Code Playgroud)
所以在这里,当你尝试处理sizeof(buffer)
字符时,很可能(特别是在最后一次迭代中)你试图处理的字符多于实际读取的字符.您可以检索您阅读的号码gcount
,但我不确定我是否真的建议您使用它.
就个人而言,我可能会这样做:
class function {
char key;
public:
function(char k) : key(k) { }
char operator()(char input) { return key ^ input; }
};
int main() {
std::ifstream fin("a.txt");
std::ofstream fout("b.txt");
fin.noskipws();
std::transform(std::istream_iterator<char>(fin),
std::istream_iterator<char>(),
std::ostream_iterator<char>(fout),
function(key));
return 0;
}
Run Code Online (Sandbox Code Playgroud)