web-dev-qa-db-fra.com

Crypter/décrypter avec XOR dans PHP

J'étudie le cryptage. Et j'ai un problème comme celui-ci:

Après avoir _ XOR texte en clair avec une clé, j'obtiens un cryptage, "010e010c15061b4117030f54060e54040e0642181b17", sous forme hexadécimale. Que dois-je faire en PHP pour obtenir du texte en clair depuis cette cryptage?

J'ai essayé de le convertir en chaîne/int et ensuite de les amener à XOR avec la clé (trois lettres). Mais ça ne marche pas.

C'est le code:

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

Et voici le résultat:

C'est le test -------------

Avis PHP: Décalage de chaîne non initialisé: 29 dans C:\ Utilisateurs\Administrateur\Bureau\test.php à la ligne 210 PHP Suivi de pile: PHP 1. {main} () C:\Utilisateurs\Administrateur\Bureau\test.php: 0 PHP 2. xor_this () C:\Utilisateurs\Administrateur\Bureau\test.php: 239

Remarque: décalage de chaîne non initialisé: 29 en C:\Utilisateurs\Administrateur\Bureau\test.p hp à la ligne 210

Pile d’appels: 0.0005 674280 1. {main} () C:\Utilisateurs\Administrateur\Bureau\test.php: 0 0.0022 674848 2. xor_this () C:\Utilisateurs\Administrateur\Bureau\test.php: 23 9

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

C'est zs $ fs☺ =================

Pourquoi? "UBE ^ A►WEAVA►WEAV @ ◄ WEARAFWECWB +++++++++" en est le résultat, ce qui m'a posé problème dans mon vrai travail.

14
JoeNguyen

Essaye ça:

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

En gros, pour revenir au texte (même les nombres sont entrés), vous pouvez utiliser la même fonction:

$textToObfuscate = "Some Text 12345";
$obfuscatedText = xor_this($textToObfuscate);
$restoredText = xor_this($obfuscatedText);
23
One Man Crew

Encore plus facile:

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

Sur la base du code ci-dessus, j'ai créé 2 fonctions pour encoder une chaîne JSON en utilisant javascript, puis la décoder côté serveur en utilisant PHP.

!!! Important: Si vous avez des caractères différents d’ASCII (tels que le chinois, le cyrillique, les symboles ...) dans votre chaîne JSON, vous Devez soit écrire du code dans PHP ou JS pour corriger la manière dont ces caractères sont codés/décodés (ord/chr dans PHP produisent différents résultats en comparaison avec JS charCodeAt/String.fromCharCode) ou juste base64_encode la chaîne JSON et ensuite encodez-la.

Personnellement, j'utilise xor_string(base64_encode(JSON.stringify(object)), 'xor_key') en JS et sur le côté 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('');
}
2
Stalingrad