2017-03-27 15 views
-1

XOR経由でデータを暗号化するより高速なオプションがありますか?PHP - 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を使って別の文字列を作成せずにテキストをバイナリに変換できますか?私は知らない...返事をありがとう。

+1

「XOR」は暗号化ではありません。 – axiac

+0

@axiac http://www.tech-faq.com/xor-encryption.html –

+0

'^'演算子を使用して、バイト単位ではなく、これをビット単位で実行する理由は何ですか? – CBroe

答えて

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; 

、感謝します。