0

如果我有一个包含 1024 个字符的字符串和一个简单的异或算法,它仍然很容易破解吗?

const unsigned char Key[1024] = {0x.........};

void EncodeBuffer(unsigned char Buffer[],unsigned int Size) {
    unsigned int i = 0,c = 0;
    while (i < Size) {
         while(c < 1024)
              Buffer[i] ^= Key[c++];
         i++;
         c = 0;
    }
}
4

1 回答 1

4

首先,您的算法并没有像您认为的那样做。您最终将 的每个字节Buffer与 的每个字节进行异或Key,这实际上意味着您将 的每个字节Buffer与相同的字节进行异或。你的意思可能是这样的:

const unsigned char Key[1024] = {0x.........};

void EncodeBuffer(unsigned char Buffer[],unsigned int Size) {
    unsigned int i = 0;
    while (i < Size) {
        //Each byte of the buffer is xor'd with a byte of the key
        //Each byte of the key may be used for more than one byte in the buffer (insecure)
        Buffer[i] ^= Key[i % 1024];
        i++;
    }
}

现在,这更安全一些,但对于现实世界来说还不够安全。你用这个加密的越多,攻击者就越容易猜到密钥。此外,如果攻击者可以看到源代码(甚至是编译后的二进制文件),他们将拥有密钥。

您可能正在寻找的是一次性键盘,它需要一个至少与输入长度相同的键。

顺便说一句,如果您尝试编写此代码以用于任何类型的实际情况,我建议您不要使用现有的加密库。这些东西很难做对,而且有足够多的人在做这件事,所以最好为自己(更不用说你的客户)省去处理错误加密的麻烦。

于 2013-09-11T11:50:43.097 回答