Questa domanda è la continuazione della mia ultima, riguardante How to make Ruby AES-256-CBC and PHP MCRYPT_RIJNDAEL_128 play well together. Ora funziona, ma sto ancora lottando per andare nella direzione opposta. Il crittogramma generato da PHP sembra avere tutte le informazioni fornite, ma non posso ottenere il codice Ruby per decodificarlo senza errori.Parte II: Come far giocare bene Ruby AES-256-CBC e PHP MCRYPT_RIJNDAEL_128
Ecco il codice PHP che sto usando per generare il crittogramma:
$cleartext = "Who's the clever boy?";
$key = base64_decode("6sEwMG/aKdBk5Fa2rR6vVw==\n");
$iv = base64_decode("vCkaypm5tPmtP3TF7aWrug==");
$cryptogram = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $cleartext, MCRYPT_MODE_CBC, $iv);
$result = base64_encode($cryptogram);
print "\n'$result'\n";
RESULT
'JM0OxMINPTnF1vwXdI3XdKI0KlVx210CvpJllFja+GM='
Poi ecco il tentativo di decifrare in Ruby:
>> cipher = OpenSSL::Cipher::Cipher.new('aes-128-cbc')
>> cipher.key = Base64.decode64("6sEwMG/aKdBk5Fa2rR6vVw==\n")
>> cipher.iv = Base64.decode64("vCkaypm5tPmtP3TF7aWrug==")
>> cryptogram = Base64.decode64('JM0OxMINPTnF1vwXdI3XdKI0KlVx210CvpJllFja+GM=')
>> cleartext = cipher.update(cryptogram)
=> "Who's the clever"
>> cleartext << cipher.final
OpenSSL::Cipher::CipherError: bad decrypt
from (irb):100:in `final'
from (irb):100
La cosa veramente frustrante di questo è che è possibile ottenere l'intero testo chiaro da quella stringa crittografata. Ripetendo quanto sopra, ma l'aggiunta di un pad senza senso per il crittogramma:
>> cleartext = cipher.update(cryptogram + 'pad')
=> "Who's the clever boy?\000\000\000\000\000\000\000\000\000\000\000"
>> cleartext << cipher.final
OpenSSL::Cipher::CipherError: bad decrypt
from (irb):119:in `final'
from (irb):119
Nel mio caso uso effettivo del testo in chiaro è strutturato (una stringa JSON, dal momento che si chiede), così ho stare tranquillo un questo punto che ho potuto dire utilizzare questo schema e rilevare input scarsamente codificati senza eseguire lo cipher.final
. Tuttavia, non posso tollerare questo tipo di kludge nel mio codice, quindi mi piacerebbe capire come rendere il codice ruby gestire il blocco finale con grazia.
Grazie per i vostri pensieri, caf. Aggiungere testo al testo in chiaro è solo creare una stringa diversa da crittografare; non cambia il risultato. Concordo sul fatto che il problema abbia a che fare con il modo in cui le due implementazioni riguardano l'ultimo blocco del flusso crittografato. L'output dei due algoritmi è identico fino all'ultimo blocco a 32 byte, in cui gli ultimi 16 byte sono completamente diversi. Ho esaurito la pazienza con il problema, quindi a meno che qualche samaritano non arrivi e lo risolva per me, vado con il kludge qui sopra. – dondo
Il testo aggiunto alla fine del cleartext (padding) deve essere di una forma molto specifica, che il lato Ruby si aspetta. Analizzerò il metodo di riempimento utilizzato e aggiornerò la risposta. – caf
... il padding PKCS funziona aggiungendo n byte padding di valore n per rendere la lunghezza totale dei ** dati cifrati ** un multiplo della dimensione del blocco ... – dondo