【问题标题】:8192 bit XOR encryption? [closed]8192位异或加密? [关闭]
【发布时间】:2013-09-11 11:42:05
【问题描述】:

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

【问题讨论】:

  • 这个问题似乎是题外话,因为它是关于加密,而不是编程。它可能是关于Cryptography 的话题。
  • @Adriano:默默无闻几乎没有安全性。使用唯一随机密钥对数据进行异或运算可能是安全的(只要该密钥从未被重复使用并且至少与消息一样长)
  • @Adriano - 你知道一次性便笺本是什么吗??
  • 我同意 OP 的原始方案使用“默默无闻的安全性”,但一次性垫没有“默默无闻的安全性”问题。有一个“共享秘密”,但任何双向密码都是如此,当然保护“秘密”至关重要。
  • @Adriano:通过使用 AES (CTR mode) 加密计数器生成的密钥流对您的数据进行异或运算是相当安全且众所周知的。 XOR 不是问题。

标签: c++ c encryption


【解决方案1】:

首先,您的算法并没有像您认为的那样做。您最终会将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++;
    }
}

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

您可能要查找的是one-time pad,它至少需要输入长度的密钥。

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

【讨论】:

  • 可能应该删除第二个 i++..
  • 用 Key[i % 1024] 代替嵌套循环。
  • 好的建议,谢谢。
  • 即使用下一个字符加密每个字符也可以很好地工作(并且考虑到解码可能有点棘手,因为相同的字符将在不同的文本中以不同的方式编码(例如“THIS”和“那个”,使用固定密钥,两个 H 都将被编码为相同的值,但使用他的“技巧”,它们不会)。也就是说,它应该是安全加密吗?您想存储您的家庭银行敏感数据在具有这种加密的程序中?。他应该首先说他需要加密的地方以及为什么。此外,现代几乎每个操作系统都具有易于使用的功能,可以更安全地加密......
  • +1 很好的答案。指出 OP 的错误突出了一个事实,即最简单的加密错误很容易发生。一次性垫的链接很有帮助。
猜你喜欢
  • 2011-11-03
  • 2012-05-28
  • 2020-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-01
相关资源
最近更新 更多