Frage

Ich weiß nicht viel über die Verschlüsselung, aber ich war in der Lage AES Arbeits in PHP ... etwas zu bekommen. Hier sind ein paar Funktionen, dass ich bin mit:

function aes_decrypt($val,$ky) 
{ 
    $key="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; 
    for($a=0;$a<strlen($ky);$a++) 
      $key[$a%16]=chr(ord($key[$a%16]) ^ ord($ky[$a])); 
    $mode = MCRYPT_MODE_ECB; 
    $enc = MCRYPT_RIJNDAEL_128; 
    $dec = @mcrypt_decrypt($enc, $key, $val, $mode, @mcrypt_create_iv( @mcrypt_get_iv_size($enc, $mode), MCRYPT_RAND) ); 
    return rtrim($dec,(( ord(substr($dec,strlen($dec)-1,1))>=0 and ord(substr($dec, strlen($dec)-1,1))<=16)? chr(ord( substr($dec,strlen($dec)-1,1))):null)); 
} 

function aes_encrypt($val,$ky) 
{ 
    $key="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; 
    for($a=0;$a<strlen($ky);$a++) 
      $key[$a%16]=chr(ord($key[$a%16]) ^ ord($ky[$a])); 
    $mode=MCRYPT_MODE_ECB; 
    $enc=MCRYPT_RIJNDAEL_128; 
    $val=str_pad($val, (16*(floor(strlen($val) / 16)+(strlen($val) % 16==0?2:1))), chr(16-(strlen($val) % 16))); 
    return mcrypt_encrypt($enc, $key, $val, $mode, mcrypt_create_iv( mcrypt_get_iv_size($enc, $mode), MCRYPT_RAND)); 
} 

Diese leicht modifiziert von einem Kommentar auf der PHP-Dokumentation Seite für mcrypt . (I von dev_urandom zu rand geändert, wie ich bin auf einem Windows-, wo dev_urandom nicht verfügbar ist.)

Wie auch immer der Schlüssel ich den Einsatz in diesen Funktionen wie folgt definiert ist:

define("PSK", pack("H*", "abcd7b5ca46e12345678a8161fdacee9"));

Ich nenne meine Funktion wie folgt aus:

echo bin2hex(aes_encrypt("wootwootwootwootwootwootwoo", PSK));

Nun werden die ersten 16 Byte (32-stellig) des resultierenden Hexstring sind in Ordnung. Die nächsten 16 Bytes nicht übereinstimmen, was erwartet wird.

Siehe, ich bin Entsendung diese Daten an einen externen Webservice, dass es dann entschlüsselt. Ich (leider) nicht geben kann, die einen Testfall ich ohne Austeilen meine Verschlüsselungsschlüssel und Daten haben. Ich bin schrecklich leid, aber ich bin der Hoffnung, jemand vertraut mit mcrypt dies betrachten und sagen Sie mir, was ich falsch mache.

Auch hier, sorry über das Fehlen eines festen Testfall, aber ich bin sehr dankbar für jede Hilfe können Sie geben!

EDIT: Es scheint, meinen Provider, dass ich bin Entsendung eines Null-IV verwendet. Rook Rat folgende, ich habe auf CBC-Modus umgeschaltet, und den unnötigen Code entfernt, um den Schlüssel zusammen. Hier sind meine neue Funktionen:

function aes_decrypt($val,$key)
{
    $mode = MCRYPT_MODE_CBC;
    $enc = MCRYPT_RIJNDAEL_128; 
    $dec = @mcrypt_decrypt($enc, $key, $val, $mode, null); 
    return rtrim($dec,(( ord(substr($dec,strlen($dec)-1,1))>=0 and ord(substr($dec, strlen($dec)-1,1))<=16)? chr(ord( substr($dec,strlen($dec)-1,1))):null)); 
}

function aes_encrypt($val,$key) 
{
    $mode = MCRYPT_MODE_CBC;
    $enc=MCRYPT_RIJNDAEL_128; 
    $val=str_pad($val, (16*(floor(strlen($val) / 16)+(strlen($val) % 16==0?2:1))), chr(16-(strlen($val) % 16))); 
    return mcrypt_encrypt($enc, $key, $val, $mode, null); 
}
War es hilfreich?

Lösung

Es ist wahrscheinlich, dass dieser Verschlüsselungsdienst einer andere Blockchiffre Betriebsart wie CBC verwendet. Wenn ein Null-IV wird dann (in diesem Fall 16 Bytes) von ECB und CBC dem erste Block mit CBC-Modus verwendet wird, wird den gleichen Chiffretext erzeugen. ECB-Modus sollte nie von jemand aus irgendeinem Grund verwendet werden.

Hier ist ein Beispiel ECB-Modus verschlüsselte Nachricht:

alt text

Andere Tipps

Ich und ein College von mir, wo Codierung eine iPhone App und wo Daten unter Verwendung der obigen Verfahren zum Verschlüsseln und Entschlüsseln. Aber wir fanden ein Problem, wenn ich die Daten wurden verschlüsselt von seinem iPhone gelesen werden. Das iPhone verwendet PKCS7 Polsterung. Der obige Code wurde das Hinzufügen zusätzliche Polsterung dies das iPhone Entschlüsselungsverfahren verursachen würde zum Scheitern verurteilt. Wir geändert, um den Code das aktuelle Problem zu beheben:

public static function  aes128Encrypt($key,$val) 
{
    $mode = MCRYPT_MODE_CBC;
    $enc=MCRYPT_RIJNDAEL_128; 
    $blocksize= mcrypt_get_block_size($enc,$mode);
    $stringLength = strlen($val);
    $paddingLength =$blocksize-($stringLength%$blocksize);
    $val=str_pad($val,$paddingLength+$stringLength,chr($paddingLength));
    return base64_encode(mcrypt_encrypt($enc, $key, $val, $mode, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")); 
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top