我查看了一些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)。
如果没有,希望彻底改变我的算法方式,有没有办法解决这个问题呢?
提前致谢!
答案 0 :(得分:2)
密文和明文的长度相同。所以这两种尺寸都可以。
在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::string
或vector<char>
。 (请参阅上面的链接了解我的C ++代码。)