如果我有一个包含 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;
}
}
Run Code Online (Sandbox Code Playgroud)
首先,你的算法并没有像你想象的那样做。您最终将 的每个字节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++;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,这有点安全了,但对于现实世界来说还不够安全。使用此加密的次数越多,攻击者就越容易猜测密钥。此外,如果攻击者可以看到源代码(甚至编译后的二进制文件),他们将拥有密钥。
您可能需要的是一次性的 pad,它需要一个至少与输入长度相同的密钥。
顺便说一句,如果您尝试编写此代码以在任何现实情况下使用,我建议您不要这样做,而只需使用现有的加密库。这些东西很难做好,而且有足够多的人在从事这方面的工作,因此最好让您自己(更不用说您的客户)免去处理有缺陷的加密的麻烦。
| 归档时间: |
|
| 查看次数: |
686 次 |
| 最近记录: |