我看了一些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::string
或vector<char>
。(有关我的C++代码,请参阅上面的链接。)