c++ - 8192位异或加密?

标签 c++ c encryption

<分区>

如果我有一个包含 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;
    }
}

最佳答案

首先,您的算法并不像您认为的那样工作。你最终将 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++;
    }
}

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

您可能正在寻找的是 one-time pad ,这需要至少输入长度的 key 。

顺便说一下,如果您尝试编写此代码以用于任何类型的现实情况,我建议您不要这样做,而只需使用现有的加密库即可。这件事很难做好,而且有足够多的人在做这件事,所以最好让你自己(更不用说你的客户)免于处理有问题的加密而头疼了。

关于c++ - 8192位异或加密?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18740197/

相关文章:

c++ - SetIntersection 大小不分配

c++ - 改变存储在 QVector 中的结构的状态

c - C 代码中的预期 }

java - 一个单元如何测试非确定性加密函数?

java - 从 .key 和 .cer 文件实例化 java.security 类 PrivateKey 和 X509Certificate

c++ - ponter 和不同大小的整数类型之间的 reinterpret_cast

sql - 列标题 SQL 脚本

c# - malloc 和 Marshal.AllocHGlobal 之间有什么区别?

java - Java 中的 Socket 和 ObjectInputStream - Android

c++ - 调用函数作为默认参数可以吗?