【问题标题】:A way around my XOR Encryption requiring plaintext size一种需要明文大小的异或加密方法
【发布时间】:2013-12-28 19:25:57
【问题描述】:

我查看了一些 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 original)。

如果不彻底改变我执行算法的方式,有没有办法解决这个问题?

提前致谢!

【问题讨论】:

  • 由于 XOR 加密是在八进制/字节边界上完成的,所以 len(input) = len(output) - 或者有什么问题。
  • 普通的旧 C++ 将完全按照您所说的那样做,但我希望 PHP 可能认为它更了解您的意思。如果真的是len(input) != len(output),那么我希望 PHP 正在做一些字符集转换(也许是单字节到一些 unicode?)

标签: php c++ encryption xor


【解决方案1】:

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

在 PHP 或 C++ 中,您也不需要两级循环嵌套来执行此操作。

您的代码应该看起来更像这样:

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

我回答了另一个关于 XOR 加密的问题 here,,因为这几天似乎风靡一时。

顺便说一句,如果您尝试将此 PHP 代码反向移植回 C++,请注意(与 PHP 不同),strlen 在 ASCII NUL 处停止,并且不会执行您想要的操作。对于 C++ 版本,您最好使用 std::stringvector&lt;char&gt;。 (有关我的 C++ 代码,请参见上面的链接。)

【讨论】:

  • 不太清楚我怎么没有注意到这一点,好吧,我现在至少对它有了更好的理解!感谢您的回复!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多