Domanda

Non so molto di crittografia, ma sono stato in grado di ottenere AES lavoro in PHP ... un po '. Qui ci sono un paio di funzioni che sto usando:

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

Questi sono leggermente modificato da un commento sulla pagina di documentazione di PHP per mcrypt . (Ho cambiato da dev_urandom a rand, come lo sono io sulla scatola una finestra, dove dev_urandom non è disponibile.)

In ogni caso l'uso chiave che in questa funzione è definita in questo modo:

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

io chiamo la mia funzione come questa:

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

Ora, i primi 16 byte (32 cifre) della stringa esadecimale risultante sono soddisfacenti. I successivi 16 byte non corrispondono cosa ci si aspetta.

Ecco, io sto inviando questi dati ad un webservice esterno che poi decifra. I (purtroppo) non posso dare il caso un test che ho senza distribuire la chiave di crittografia e dei dati. Sono terribilmente dispiaciuto per questo, ma sto sperando che qualcuno familiarità con mcrypt può guardare a questo e dirmi che cosa sto facendo male.

Anche in questo caso, mi dispiace per la mancanza di un banco di prova solida, ma io sono molto riconoscente di tutto l'aiuto che si può dare!

Modifica Sembra che il mio provider che sto postando è utilizzando un nulla IV. Seguendo il consiglio di Rook, ho commutato in modalità CBC, e rimosso il codice inutile relativo alla chiave. Qui sono le mie nuove funzioni:

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); 
}
È stato utile?

Soluzione

E 'probabile che questo servizio di crittografia utilizza una diversa modalità cifrario a blocchi di funzionamento come CBC. Se un iv nullo viene utilizzata con modalità CBC quindi il primo blocco (in questo caso 16 byte) del BCE e CBC produrrà lo stesso testo cifrato. Modalità BCE non dovrebbe mai essere utilizzato da chiunque, per qualsiasi motivo.

Ecco un messaggio cifrato modalità esemplificativa BCE:

alt text

Altri suggerimenti

Io e un collegio di miniera dove codifica un'applicazione per iPhone e dove utilizzando i metodi di cui sopra per criptare e Decrypt dati. Ma abbiamo trovato un problema quando ero la crittografia dei dati da leggere dal suo iPhone. L'iPhone utilizzato PKCS7 imbottitura. Il codice di cui sopra è stata aggiunta chilo in più questo potrebbe causare il metodo di decrittazione iPhone al sicuro. Abbiamo modificato il codice per risolvere il problema corrente:

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")); 
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top