2013-02-03 83 views
13

Tôi đang nghiên cứu mã hóa. Và tôi gặp vấn đề như thế này:Mã hóa/giải mã bằng XOR trong PHP

Sau khi XOR viết rõ bằng một khóa, tôi nhận được một crypt, "010e010c15061b4117030f54060e54040e0642181b17", dưới dạng loại hex. Nếu tôi muốn nhận được bản tóm tắt từ crypt này, tôi nên làm gì trong PHP?

Tôi đã thử chuyển đổi nó thành chuỗi/int và sau đó đưa chúng đến XOR bằng khóa (ba chữ cái). Nhưng nó không hoạt động.

Đây là mã:

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, '================='; 

Và đây là kết quả:

Đây là thử nghiệm -------------

PHP Chú ý: Uninitialized chuỗi bù đắp: 29 trong C: \ Users \ Administrator \ Desktop \ test.php trên dòng 210 PHP Stack dấu vết: PHP 1. {main}() C: \ Users \ Administrator \ Desktop \ test.php: 0 PHP 2. xor_this() C: \ Users \ Administrator \ Desktop \ test .php: 239

Chú ý: string uninitialized offset: 29 trong C: \ Users \ Administrator \ Desktop \ test.p hp trên đường dây 210

Call Stack: 0,0005 674.280 1. {} chính() C: \ Users \ Administrator \ Desktop \ test.php: 0 0.0022 674848 2. xor_this() C: \ Users \ Administrator \ Desktop \ test.php: 23 9

UBE^A►WEAVA►WEAV @ ◄ WEARAFWECWB ++++++++

Đây là zs $ fs☺ =================

Tại sao? "UBE^A►WEAVA►WEAV @ ◄WEARAFWECWB ++++++++" là kết quả mà tôi gặp khó khăn trong công việc thực sự của mình.

Trả lời

23

Hãy thử điều này:

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; 
} 

Về cơ bản để trở lại văn bản trở lại (thậm chí con số này tại), bạn có thể sử dụng các chức năng tương tự:

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

Tôi sẽ bỏ phiếu lên nếu bạn giải thích một số chi tiết :) –

+1

những gì bạn muốn biết? –

+0

Nó không hoạt động. Nguyên nhân khóa của tôi chỉ là 3 chữ cái, vì vậy Crypt phải được chia thành nhóm 3 trước khi xor. Và một điều nữa, Crypt là hexa, vì vậy chúng ta phải chuyển đổi nó trước hết - tôi nghĩ điều đó nhưng không chắc chắn - Đó là vấn đề của tôi :) – JoeNguyen

8

Thậm chí dễ dàng hơn:

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

Dựa trên đoạn mã trên tôi đã tạo 2 hàm để xor mã hóa chuỗi JSON bằng cách sử dụng javascript và sau đó giải mã nó trên phía máy chủ bằng cách sử dụng PHP.

!!! Quan trọng: Nếu bạn có các ký tự khác ASCII (như tiếng Trung, Chữ Kirin, Ký hiệu ...) trong chuỗi JSON, bạn phải hoặc viết một số mã bằng PHP hoặc JS để sửa cách các ký tự này được mã hóa/giải mã (ord/chr trong PHP tạo ra kết quả khác nhau so với JS charCodeAt/String.fromCharCode) hoặc chỉ base64_encode chuỗi JSON và sau đó xor mã hóa nó.

Cá nhân tôi sử dụng xor_string(base64_encode(JSON.stringify(object)), 'xor_key') trong JS và PHP phụ:

$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(''); 
} 
+0

Tất nhiên phần lớn thế giới không phải là ASCII nên điều này rất hạn chế. Copnsider một soltion mà nó thường sử dụng được. – zaph

+0

Có thể sử dụng được, tôi đã đề cập rằng tôi sử dụng để mã hóa chuỗi thành base64 và sau đó XOR, tôi sẽ không đăng bài này nếu nó không hoạt động – Stalingrad

+0

Xem tuyên bố từ chối "quan trọng" trong câu trả lời. – zaph