Cette question est une continuation de mon dernier, concernant How to make Ruby AES-256-CBC and PHP MCRYPT_RIJNDAEL_128 play well together. Je travaille maintenant, mais je me bats encore pour aller dans l'autre direction. Le cryptogramme généré par PHP semble avoir toutes les informations fournies, mais je ne peux pas obtenir le code Ruby pour le déchiffrer sans erreur.Partie II: Comment faire Ruby AES-256-CBC et PHP MCRYPT_RIJNDAEL_128 jouent bien ensemble
Voici le code PHP que je utilise pour générer le cryptogramme:
$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='
Alors voici la tentative de déchiffrer dans 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
Ce qui est vraiment frustrant à ce sujet est qu'il est possible de récupère tout le texte en clair de cette chaîne cryptée. En répétant ce qui précède, mais en ajoutant un tampon non-sens au cryptogramme:
Dans mon cas réel d'utilisation>> 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
le texte clair est structuré (une chaîne JSON, puisque vous me demandez), donc je me sens à l'aise un ce point que je pourrais dire utiliser ce schéma et détecter les entrées mal cryptées sans effectuer le cipher.final
. Cependant, je ne peux pas tolérer ce genre de kludge dans mon code, donc je voudrais comprendre comment faire pour que le code ruby gère le bloc final avec élégance.
Merci pour vos commentaires, caf. L'ajout de texte au texte en clair crée simplement une chaîne différente à chiffrer; ça ne change pas le résultat. Je suis d'accord que le problème a quelque chose à voir avec la façon dont les deux implémentations traitent avec le dernier bloc du flux crypté. La sortie des deux algorithmes est identique jusqu'au dernier bloc de 32 octets, où les 16 derniers octets sont complètement différents. Je n'ai plus de patience avec le problème, donc à moins qu'un samaritain ne vienne et ne le résout pour moi, je vais avec le kludge ci-dessus. – dondo
Le texte ajouté à la fin du cleartext (padding) doit être d'une forme très spécifique, que le côté Ruby attend. J'étudierai la méthode de remplissage utilisée et mettra à jour la réponse. – caf
... Le remplissage PKCS fonctionne en ajoutant n octets de remplissage de valeur n pour que la longueur totale des données ** chiffrées ** soit un multiple de la taille du bloc ... – dondo