0

我正在制作一个基于 XOR 的加密/解密器,它的工作原理是这样的。您有一个明文字符(例如 3)和一个用户密钥(例如 5)。以位形式写入:

3 = 00000011

5 = 00000101

现在,如果我们进行异或运算,我们得到 6:

6 = 00000110

这可以通过说 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;
}

为什么程序不能正确翻译文本?为什么它会在文件末尾添加字符?

4

4 回答 4

7

从表面上看,加密几乎与这里的任何事情(或至少与问题)无关。

while(!fin.eof() && znak != ' ')

while (!whatever.eof())几乎可以保证表单的循环不能正常工作。

    fin.get(buffer, sizeof(buffer)); 

当你这样做时,请注意它并不能保证它会读取sizeof(buffer)字符——只是它不会读取更多字符。当没有那么多字符可供读取时,您通常会在文件末尾获得更少的内容。[编辑:我还应该提到,您也可以在其他地方读取更少的内容——例如,如果您正在从网络连接读取,接收部分缓冲区是很常见的,但当它到达时会更多。]

for(int i = 0; i < sizeof(buffer); i++)

因此,在这里,当您尝试处理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;
}
于 2011-02-22T20:43:04.850 回答
1

以下是我注意到的一些项目:
1. 以二进制unsigned char数据类型操作。
A charorsigned char可能会对您的加密方案造成严重破坏。
将文件打开为binary,因此操作系统不会转换字节:

老的:

char buffer[5001]; 
ifstream fin("a.txt", ifstream::in);
ofstream fout("b.txt");

更正:

const unsigned int BUFFER_SIZE = 4096; // Prefer multiples of 2.
ifstream fin("a.txt", ios::binary);  // ifstream::in is redundant for an ifstream
ofstream fout("b.txt", ios::binary);

与您的数据类型保持一致。和类型可能是不同
的大小如果你想玩字节,最好。 intcharunsigned char

参考:int键;char znak;

使用 I/O 语句作为语句中的表达式while。总之,eof是看完后引起的:

while ((fin >> znak) && (znak != ' '))
于 2011-02-22T20:46:51.867 回答
1

我在网上找到了一些 XOR 加密代码,可能对你有帮助

它是用 c 编写的精美代码 https://code.google.com/p/xorencryption/

用 C++ 编写 http://programmingconsole.blogspot.in/2013/10/xor-encryption-for-alphabets.html

于 2013-11-22T13:33:32.693 回答
0

仔细查看将文件读入缓冲区的代码。get() 函数最多读取您要求的字符数;在文件末尾会更少。您应该检查使用 gcount() 实际读取了多少个,并且仅在执行加密步骤时循环遍历那些。

你似乎还需要一些其他的整理工作。

于 2011-02-22T20:39:43.133 回答