Шифрование / расшифровка с помощью XOR в PHP

Я изучаю шифрование. И у меня возникла такая проблема:

После IST открытого текста с ключом, я получаю крипту, «010e010c15061b4117030f54060e54040e0642181b17», как шестнадцатеричный тип. Если я хочу получить открытый текст из этого склепа, что мне делать в PHP?

Я попытался преобразовать его в строку / int и после этого передать их в XOR с помощью ключа (три буквы). Но это не сработает.

Это код:

function xor_this($string) { // Let's define our key here $key = 'fpt'; // Our plaintext/ciphertext $text = $string; // Our output text $outText = ''; // Iterate through each character for($i=0; $i<strlen($text); ) { for($j=0; $j<strlen($key); $j++,$i++) { $outText .= ($text[$i] ^ $key[$j]); //echo 'i=' . $i . ', ' . 'j=' . $j . ', ' . $outText{$i} . '<br />'; // For debugging } } return $outText; } function strToHex($string) { $hex = ''; for ($i=0; $i < strlen($string); $i++) { $hex .= dechex(ord($string[$i])); } return $hex; } function hexToStr($hex) { $string = ''; for ($i=0; $i < strlen($hex)-1; $i+=2) { $string .= chr(hexdec($hex[$i].$hex[$i+1])); } return $string; } $a = "This is the test"; $b = xor_this($a); echo xor_this($b), '-------------'; // $c = strToHex($b); $e = xor_this($c); echo $e, '++++++++'; // $d = hexToStr($c); $f = xor_this($d); echo $f, '================='; 

И это результат:

Это тест ————-

PHP Примечание: Неинициализированное смещение строки: 29 в C: \ Users \ Administrator \ Desktop \ test.php в строке 210 PHP Stack trace: PHP 1. {main} () C: \ Users \ Administrator \ Desktop \ test.php: 0 PHP 2. xor_this () C: \ Users \ Administrator \ Desktop \ test.php: 239

Примечание. Неинициализированное смещение строки: 29 в C: \ Users \ Administrator \ Desktop \ test.p hp в строке 210

Вызов стека: 0.0005 674280 1. {main} () C: \ Users \ Administrator \ Desktop \ test.php: 0 0.0022 674848 2. xor_this () C: \ Users \ Administrator \ Desktop \ test.php: 23 9

ВБО ^ A►WEAVA►WEAV @ ◄WEARAFWECWB ++++++++

Это zs $ fs☺ =================

Зачем? Результатом является «UBE ^ A►WEAVA►WEAV @ ◄WEARAFWECWB ++++++++», и у меня возникли проблемы в моей реальной работе.

Попробуй это:

 function xor_this($string) { // Let's define our key here $key = ('magic_key'); // Our plaintext/ciphertext $text = $string; // Our output text $outText = ''; // Iterate through each character 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 } } return $outText; } 

В основном, чтобы вернуть текст назад (четные числа), вы можете использовать одну и ту же функцию:

 $textToObfuscate = "Some Text 12345"; $obfuscatedText = xor_this($textToObfuscate); $restoredText = xor_this($obfuscatedText); 

Еще проще:

 function xor_string($string, $key) { for($i = 0; $i < strlen($string); $i++) $string[$i] = ($string[$i] ^ $key[$i % strlen($key)]); return $string; } 

Основываясь на вышеприведенном коде, я создал 2 функции для кодирования строки JSON с использованием javascript и затем декодировать ее на стороне сервера с помощью PHP.

!!! Важно: если у вас будут символы, отличные от ASCII (например, китайские, кириллицы, символы …) в строке JSON, вы должны либо написать код в PHP или JS, чтобы исправить, как эти символы кодируются / декодируются (ord / chr in PHP дает разные результаты по сравнению с JS charCodeAt / String.fromCharCode) или просто base64_encode строку JSON и после этого кодирует ее.

Лично я использую xor_string(base64_encode(JSON.stringify(object)), 'xor_key') в JS и на стороне PHP:

 $json = json_decode(base64_decode( xor_string(file_get_contents("php://input"), 'xor_key') ), true); 

PHP:

 function xor_string($string, $key) { $str_len = strlen($string); $key_len = strlen($key); for($i = 0; $i < $str_len; $i++) { $string[$i] = $string[$i] ^ $key[$i % $key_len]; } return $string; } 

Javascript:

 function xor_string(string, key) { string = string.split(''); key = key.split(''); var str_len = string.length; var key_len = key.length; var String_fromCharCode = String.fromCharCode; for(var i = 0; i < str_len; i++) { string[i] = String_fromCharCode(string[i].charCodeAt(0) ^ key[i % key_len].charCodeAt(0)); } return string.join(''); }