我的XOR加密需要明文大小


A way around my XOR Encryption requiring plaintext size

我看了一些XOR示例,但找不到答案。

这是我在PHP中使用的代码:

 for($i=0;$i<strlen($text);)
 {
     for($j=0;($j<strlen($key) && $i<strlen($text));$j++,$i++)
     {
         $outText .= $text{$i} ^ $key{$j};
         //echo 'i='.$i.', '.'j='.$j.', '.$outText{$i}.'<br />'; //for debugging
     }
 }  

以及在C++中解密的结果代码:

for (int i = 0; i < original.size();)
{
    for (int j = 0; (j < key.size() && i < original.size()); j++, i++)
    {
        decrypted += encrypted[i] ^ key[j];
    }
}

我很难绕过对明文大小的需求(在这种情况下是std::string原始)。

如果不彻底改变我的算法,有办法解决这个问题吗?

提前感谢!

密文和明文的长度相同。所以两种尺寸都可以。

在PHP或C++中,您也不需要两个级别的循环嵌套就可以做到这一点。

你的代码应该更像这样:

 $textlen = strlen($text);
 $keylen  = strlen($key);
 for ($i = 0; $i < $textlen; $i++)
 {
     $outText .= chr( ord( $text{$i} ) ^ ord ( $key{$i % $keylen} ) );
 }  

我在这里回答了另一个关于XOR加密的问题,因为它最近似乎很流行。

顺便说一句,如果你试图将这个PHP代码移植回C++,请注意(与PHP不同),strlen停止在ASCII NUL,不会做你想做的事。对于C++版本,最好使用std::stringvector<char>。(有关我的C++代码,请参阅上面的链接。)