通过XOR加密数据有比这更快的选项吗?
private static function getBinary($string)
{
$output = '';
for($i = 0; $i < strlen($string); $i++)
{
$value = decbin(ord($string[$i]));
$binary = str_pad($value, 8, '0', STR_PAD_LEFT);
$output .= $binary;
}
return ($output);
}
private static function getCrypted($key, $value)
{
$output = '';
$key_index = 0;
$max = strlen($key);
for($i = 0; $i < strlen($value); $i++)
{
if($key_index >= $max){ $key_index = 0;}
$output .= ($key[$key_index] XOR $value[$i]) ? '1' : '0';
$key_index++;
}
return ($output);
}
对于小文本,它相对较快,但我需要加密大文本(3MB数据)。但是对于这个文件,getCrypted()函数需要10-20秒,这是不可接受的。
$bin_text = self::getBinary($text); // cca 4 sec.
$bin_key = self::getBinary("12345"); // 0 sec.
return self::getCrypted($bin_key, $bin_text); // 11 sec+
那么,它有什么最快的方法吗?也许将文本转换为二进制而不使用0和1创建另一个字符串?我不知道......谢谢你的回复。
答案 0 :(得分:0)
解决方案不是传输位,而是字节... @CBroe
$byte_text = unpack('C*', 'asasdkasndaksdnkas');
$byte_key = unpack('C*', '12345');
$output = '';
$key_index = 1;
for($i = 1; $i < count($byte_text)+1; $i++)
{
if($key_index > count($byte_key)){ $key_index = 1;}
$output .= dechex(($byte_text[$i] ^ $byte_key[$key_index]));
$key_index++;
}
echo $output;
这就是全部,谢谢。