2016-07-14 7 views
-1

Ich habe versucht, zwei Funktionen zu erstellen, eine zum Verschlüsseln von Parametern und eine andere zum Entschlüsseln von ihnen und ich habe ein Problem. Manchmal, wenn ich versuche, ein Wort/eine Zahl zu entschlüsseln, schlägt die Entschlüsselung fehl. Nur manchmal, also weiß ich nicht, welcher der Fehler sein kann. Möchten Sie meine Funktionen schreiben, wenn jemand will, um sie überprüfen:Fehler beim Verschlüsseln-Entschlüsseln PHP

function url_base64_decode($str){ 
return base64_decode(strtr($str, 
    array(
    '.' => '+', 
    '-' => '=', 
    '~' => '/' 
    ) 
)); 
} 

function url_base64_encode($str){ 
    return strtr(base64_encode($str), 
     array(
      '+' => '.', 
      '=' => '-', 
      '/' => '~' 
     ) 
    ); 
} 

function mdecrypt($input){ 
    $key = '4oF9B2NWXbmvIC5nNLLTbnmr5knkEBNBcrJt9m3xM3kjFyCZc3QAZbolXomtaIQSBBDDxxxAAAjTPV'; 
    $input = trim(chop($this->url_base64_decode($input))); 
    $td = mcrypt_module_open ('tripledes', '', 'ecb', ''); 
    $key = substr(md5($key),0,24); 
    $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size ($td), MCRYPT_RAND); 
    mcrypt_generic_init ($td, $key, $iv); 
    $decrypted_data = mdecrypt_generic ($td, $input); 
    mcrypt_generic_deinit ($td); 
    mcrypt_module_close ($td); 
    return trim(chop($decrypted_data)); 
} 

function mencrypt($input) { 
    $key = '4oF9B2NWXbmvIC5nNLLTbnmr5knkEBNBcrJt9m3xM3kjFyCZc3QAZbolXomtaIQSBBDDxxxAAAjTPV'; 
    $key = substr(md5($key),0,24); 
    $td = mcrypt_module_open ('tripledes', '', 'ecb', ''); 
    $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size ($td), MCRYPT_RAND); 
    mcrypt_generic_init ($td, $key, $iv); 
    $encrypted_data = mcrypt_generic ($td, $input); 
    mcrypt_generic_deinit ($td); 
    mcrypt_module_close ($td); 
    return trim(chop($this->url_base64_encode($encrypted_data))); 
} 

ich eine Schleife erstellt Zahlen zu verschlüsseln, und zum Beispiel nicht die Zahl 63 auf decrypt:

  • verschlüsselt: pECnbC3qkwg- entschlüsselt: 60
  • verschlüsselt: yOo70iZ7LKk- entschlüsselten: 61
  • verschlüsselt: GRkGYosxwO4- entschlüsselten: 62
  • verschlüsselt: AJGJzNep3YU- entschlüsselten: + ÕϤȿß
  • verschlüsselt: wvT3n6F ~ xkU- entschlüsselt: 64
  • verschlüsselt: 7p.gxcfLFcE- entschlüsselt: 65

Jeder weiß, was soll ich tun?

Vielen Dank an alle

+0

Woher wissen Sie, dass '-' durch' = 'ersetzt werden sollte und nicht' -'? –

+0

Ich würde nicht empfehlen, eine RYO-Verschlüsselungslösung tbh: http://stackoverflow.com/questions/9262109/php-simplet-two-way-encryption PHP kann auch GPG unterstützen, aber das ist möglicherweise nicht für Ihren Anwendungsfall geeignet: http://php.net/manual/en/ref.gnupg.php – CD001

+0

Es ist am besten nicht mcrypt zu verwenden, es ist abandonware, wurde nicht in Jahren aktualisiert und unterstützt nicht Standard PKCS # 7 (geb. PKCS # 5) Padding, nur Nicht-Standard-Null-Padding, das nicht einmal mit Binärdaten verwendet werden kann. mcrypt hatte viele herausragende Fehler (https://sourceforge.net/p/mcrypt/bugs/), die auf das Jahr 2003 zurückgehen. Stattdessen sollten Sie [defuse] verwenden (https://github.com/defuse/php-encryption), es wird beibehalten und ist korrekt. – zaph

Antwort

0

Frage Schlüsselableitungs- Code:

$key = substr(md5($key),0,24); 

Sie versuchen, ein 24-Byte-Schlüssel von MD5 zu schaffen, sondern MD5 liefert nur einen 16-Byte-Hash, die letzten 8 Bytes Alter wird undefiniert sein. Die letzten 8 Bytes können zwar Glück bringen, aber das ist nicht garantiert, also funktioniert es manchmal, manchmal nicht.

beste Vorschlag ist, eine Bibliothek zu verwenden, der diese ganze Arbeit für Sie, gute Optionen sind:

Hinweise:

3DES sollte nicht In neuen Arbeiten verwendet AES. Verwenden Sie nicht den ECB-Modus, es ist nicht sicher, verwenden Sie den CBC-Modus mit einem zufälligen iv, stellen Sie den iv den verschlüsselten Daten zur Entschlüsselung vor. Verwenden Sie nicht MD5 für die Kennwortableitung, verwenden Sie PBKDF2.

ECB-Modus verwendet keine iv, warum erstellen Sie eine?