C++ 我们得出结论,XOR字符串加密不如众所周知的加密安全(比如河豚加密),这公平吗

C++ 我们得出结论,XOR字符串加密不如众所周知的加密安全(比如河豚加密),这公平吗,c++,encryption,C++,Encryption,我想知道,是否可以公平地得出结论,XOR字符串加密比其他加密方法更不安全,比如 这是因为对于这两种方法,它们的输入都是 未加密字符串 秘钥 字符串异或(字符串值、字符串键) { 字符串retval(值); 短无符号int-klen=key.length(); 短无符号整数vlen=value.length(); 短无符号int k=0; 短无符号整数v=0; 对于(v;vXOR加密,如果您多次尝试对同一字符串进行编码,则XOR加密是非常不安全的,因为它允许恶意用户通过对其加密进行XOR恢复两条

我想知道,是否可以公平地得出结论,XOR字符串加密比其他加密方法更不安全,比如

这是因为对于这两种方法,它们的输入都是

  • 未加密字符串
  • 秘钥

  • 字符串异或(字符串值、字符串键)
    {
    字符串retval(值);
    短无符号int-klen=key.length();
    短无符号整数vlen=value.length();
    短无符号int k=0;
    短无符号整数v=0;
    
    对于(v;vXOR加密,如果您多次尝试对同一字符串进行编码,则XOR加密是非常不安全的,因为它允许恶意用户通过对其加密进行XOR恢复两条消息的XOR。如果他们能够以某种方式诱使您对已知字符串进行XOR,则他们可以恢复您的密钥并完全破坏加密

    更高级的加密算法(如Blowfish和AES)具有更强的安全保证,并且被认为是非常强大的,即使攻击者允许您加密已知数据,他们也无法恢复您的密钥或恢复任何单个位。在任何需要安全性的情况下,都应始终使用它们,而不是您自己的自定义加密重要的

    有趣的是,XOR加密在每次调用时使用一个新的(随机选择的)密钥,从信息论的角度来看,XOR加密在密码学上是不可破解的。这被称为“一次性pad”,理论上在某些设置中可能很有用。

    如果您的密钥是(a)真正随机的,(b)至少与明文一样长,以及(c)永远不要重复使用XOR加密

    如果您不能满足这些严格的标准,那么XOR加密显然比像Blowfish这样的适当加密算法弱,尽管我自己无法证明这一点。

    事实上,“XOR加密”被证明是完全安全的,可以防止窃听(当有人可以更改您的流时,您仍然会遇到麻烦),给定的加密密钥为

    • 只要要加密的字符串
    • 完全随机(位是不相关的,具有等于1和0的概率)
    • 只用一次

    否则,您将陷入困境。如果您的位不是随机的,您可以提取一些关于明文位的信息。如果您重用密钥,您可以对两个密文进行异或以获得明文的异或,或者,如果碰巧有人让您发布一条他知道的明文消息,他可以提取密钥(事实上,他们是在二战中为《谜》做这件事的,所以这并不不切实际!)。如果密钥比消息短,您可以使用统计数据-假设密钥长度为10字节,您可以将密文分成10个部分,所有部分都用相同的字节编码,并使用频率分析…仅举几个攻击的例子。

    我不知道为什么除了一次性键盘(OTP)之外很少提到它有一个主要的短消息可以通过使用RSA之类的工具来避免。想象一下,根据下午2:00得到的一些消息,您将向您的经纪人发送两条关于股票ABC的消息中的一条。您将发送买入或卖出。使用OTP,不需要进行太多的密码分析就可以确定您发送了什么,因为单是长度把它泄露出去


    嗯,最好像大多数常见的加密系统一样,在转换为密文时使用一些改变长度的东西。

    阅读施奈尔的应用密码学的第一章,其中专门讨论了为什么XOR对于加密来说毫无价值。这里有一个摘录:XOR是一种流密码。流密码是最脆弱的密码之一但这并不意味着在现实中,如果你遵守规则,它仍然很难被打破(不幸的是,人们不这样做,因此这导致了容易被打破的代码)。但你必须问问自己,你加密的对象是谁。如果是针对普通用户的版权保护,那么你应该没问题。如果你是针对工业间谍或政府的保护,那么除了最强大的密码之外,没有什么可以保护你。密码学最重要的部分是了解你的敌人。是的,河豚比XOR更安全,因为它是一种分组密码。查找分组密码和流密码之间的区别。但是,如果我知道河豚加密字符串的密钥,我可以立即使用众所周知的河豚解密方法解密加密字符串。是的,但其思想是,如果你不知道密钥,但仍然知道某些字符串的加密方式数据与该密钥一起存在,您无法恢复密钥。@Yan Cheng CHEOK:密钥始终是秘密。如果有人拥有该密钥,他可以解密密文。在任何加密方案中。这就是重点。@templatetypedef您能否提供一个真实的工作示例,说明如何从XOR加密字符串中发现密钥?@Yan Cheng CHEOK:XOR的不安全性重复使用密钥时的密码与使用相同函数的加密/解密无关。问题是,如果您猜测明文的某些部分(这通常不像听起来那么难,而且属性分析有帮助),则直接获得密钥的相应部分(很难猜出用于将已知明文转换为已知blowfish密码的密钥),这反过来可以让您解密消息/消息的其他部分,您很可能从中获得密钥的新部分。只需补充一点:如果您想知道,真正的随机指的是“来自随机源”像测量放射性同位素的衰变之类的,而不是像
    random()
    function那样的伪随机数发生器。@ninefingers:Why random()不能在这里证明自己?@YeenFei要证明安全,加密安全的PRNG也必须是安全的;只有真正的随机进程才是安全的。你的平均C库随机函数肯定不是。如果你用伪随机密钥流替换随机密钥,那么你就得到了一个流密码。因此根据这个答案,所有流密码都是安全的可以证明其安全性不如分组密码。请
    string XOR(string value,string key)
    {
        string retval(value);
    
        short unsigned int klen=key.length();
        short unsigned int vlen=value.length();
        short unsigned int k=0;
        short unsigned int v=0;
    
        for(v;v<vlen;v++)
        {
            retval[v]=value[v]^key[k];
            k=(++k<klen?k:0);
        }
    
        return retval;
    }