OpenSSL_decrypt restituisce un testo cifrato errato?

0

Sto cercando di utilizzare la funzione openssl_encrypt in PHP, questo è il mio codice:

<?php

$message = hex2bin("00112233445566778899aabbccddeeff");
$key = hex2bin("000102030405060708090a0b0c0d0e0f");
$method = "AES-128-ECB";

$cyphertext = openssl_encrypt($message, $method, $key);
echo bin2hex(base64_decode($cyphertext)) . "\n";

?>

In base a FIPS 197 (vedere pagina 35) e anche questo calcolatore AES online , questo dovrebbe risultare nel seguente testo cifrato:

69c4e0d86a7b0430d8cdb78070b4c55a

ma il mio codice restituisce questa stringa:

69c4e0d86a7b0430d8cdb78070b4c55a954f64f2e4e86e9eee82d20216684899

Che cosa sto sbagliando? L'implementazione di openssl usa un differente blocco?

E sì, lo so che non dovrei usare ECB, ma questo è solo a scopo di test, non appena ho capito perché questo non funziona passerò a CBC.

Grazie mille per il tuo aiuto.

    
posta Pascal Sommer 19.03.2016 - 22:17
fonte

1 risposta

4

Per citare da i commenti dei documenti php , sottolineatura da parte mia:

In plain english, the buffer must be padded up to blockSize. If the buffer is already a multiple of blockSize, you add an entire new blockSize bytes as padding.

The value of the padding bytes MUST be the number of padding bytes as a byte...

So 5 bytes of padding will result in the following bytes added at the end of the ciphertext: [ 0x05 ][ 0x05 ][ 0x05 ][ 0x05 ][ 0x05 ]

Hope this saves someone else a few hours of their life.

Il tuo messaggio è un blocco completo. Pertanto, l'implementazione di openssl_encrypt aggiunge un blocco padding. Questo è il motivo per cui la seconda metà del tuo risultato (che non ti aspetti) decifra perfettamente in

0x10101010101010101010101010101010

usando semplici aes con quella chiave - è una spaziatura aggiunta dall'implementazione, perché la semplice aes non è la stessa di aes-cbc.

    
risposta data 19.03.2016 - 23:33
fonte

Leggi altre domande sui tag