MCrypt rijndael-128 à OpenSSL aes-128-bce conversion
Depuis Mcrypt est obsolète, je veux utiliser OpenSSL au lieu de cela dans mon code puisque nous avons déjà l'utilisation de php 7.0.17 dans notre serveur et il n'y a pas dire quand ils le mettre à jour.
La troisième partie de l'API (hébergé sur PHP 5.x probablement et à l'aide de mcrypt), est la prise de données chiffrées. Elles ont fourni des méthodes qu'ils utilisent pour crypter/décrypter des chaînes.
Ici sont-ils
$secret = 'a0a7e7997b6d5fcd55f4b5c32611b87c' ;
public function encrypt128($str)
{
$block = mcrypt_get_block_size("rijndael_128", "ecb");
$pad = $block - (strlen($str) % $block);
$str .= str_repeat(chr($pad), $pad);
return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $secret, $str, MCRYPT_MODE_ECB));
}
public function decrypt128($str)
{
$str = base64_decode($str);
$str = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $secret, $str, MCRYPT_MODE_ECB);
$len = strlen($str);
$pad = ord($str[$len - 1]);
return substr($str, 0, strlen($str) - $pad);
}
l'utilisation de ces méthodes chaîne small1
si chiffré devient v7IXp5vVaFVXXlt/MN8BVw==
Nous voulons utiliser openssl_encrypt
de notre côté, de telle sorte que si nous chiffrons la même chaîne avec OpenSSL, il doit donner les mêmes résultats qu'Mcrypt. J'ai fait des recherches que mcrypt à l'aide de rijndael-128 Mode bce doit être compatible avec OpenSSL aes-128-ecb
.
Pour les dernières heures, j'ai essayé de faire ma propre méthode pour chiffrer des chaînes servant le même résultat en utilisant OpenSSL. Jusqu'à présent, je suis venu à ce
public function sslEncrypt128($str)
{
$secret = 'a0a7e7997b6d5fcd55f4b5c32611b87c';
return base64_encode(openssl_encrypt($str, 'aes-128-ecb', $secret, OPENSSL_RAW_DATA));
}
Mais elle produit différents chaîne SxJ3+EdaeItZx3/EwGTUbw==
de même qu'au-dessus de l'entrée. Je ne sais pas si c'est l'indicateur d'un problème ou le rembourrage, les pointeurs seront les bienvenus.
J'ai ajouté le code ici pour tester en ligne https://3v4l.org/v2J2N
Merci d'avance.
- Mode ECB a quelques problèmes de sécurité graves. Être très assurez-vous qu'il est approprié pour votre application spécifique. Généralement le mode CBC ou CTR mode sera plus sûr. Voir Electronic Codebook pour une illustration (littéralement) du problème.
- Voir aussi la mise à jour de ma bibliothèque de cryptage de Mcrypt pour OpenSSL, Remplacer Mcrypt avec OpenSSL et Préparer le retrait de Mcrypt en PHP 7.2, l'Utilisation openssl_encrypt pour remplacer Mcrypt pour 3DES-BCE chiffrement (il utilise le mode ECM).
- Remarque: les données Base64 est très bien pour les ordinateurs, mais pour les développeurs à comprendre quoi que ce soit à partir des données de chaque octet de la représentation est nécessaire, hex répond à ce besoin, en Base64 n'est pas.
- Dans votre exemple de code j'ai été en mesure de produire le même résultat en sslEncrypt128 en changeant
aes-128-ecb
àaes-256-ecb
. - Merci @MichaelButler. Il a résolu mon problème.
MCRYPT_RIJNDAEL_128
avecMCRYPT_MODE_ECB
mode est le même que open sslaes-256-ecb
. Vous pouvez Poster vos trouver comme Réponse et je vais l'accepter.
Vous devez vous connecter pour publier un commentaire.
Dans votre exemple, j'ai trouvé que par l'évolution de la
aes-128-ecb
àaes-256-ecb
, il produit le même résultat que l'héritagemcrypt_encrypt
.MCRYPT_RIJNDAEL_128
est probablement référence à Rijndael 128 bits, la taille du bloc, qui est AES. La taille de la clé est une autre affaire, et c'est ce que l'256
dénote dans OpenSSL estAES-256-CBC
. Si à l'aide d'un Algorithme de Chiffrement Nom (SCAN), puis Mcrypt nom de l'algorithme de chiffrement instance serait semblable àRijndael-128(256)/CBC
.Voici ce qui a fonctionné pour moi:
Probablement la clé a été prévu pour être utilisé comme hex (il l'est déjà en format hex) non pas comme une chaîne de caractères à être converti en hexadécimal.
mcrypt:
mcrypt
ne prend pas en charge la norme PKCS#7 (née PKCS#5) rembourrage, seul non-standard null rembourrage mais le remplissage est explicitement ajouté avant mcrypt.Le chiffrement
v7IXp5vVaFVXXlt/MN8BVw==
est la bonne chiffrement basé sur fichier PKCS#7 rembourrage. BCE mode et de la clé en tant que chaîne.Voir: mcrypt - AES CALCULATRICE.
Dans l'hexagone, notez les données rembourrage est clairement visible:
key: 6130613765373939376236643566636435356634623563333236313162383763
data: 736D616C6C310A0A0A0A0A0A0A0A0A0A
encrypted: BFB217A79BD56855575E5B7F30DF0157
En Base64:
encrypted: v7IXp5vVaFVXXlt/MN8BVw==
OpenSSL:
Avis la clé de 256 bits, mais la OpenSSL appel avec des "aes-128-bce" semble impliquer une 128-mais la clé. Si les touches ne correspondent pas.
Voir: OpenSSL - AES CALCULATRICE
Dans l'hexagone, notez les données rembourrage est clairement visible:
key: 61306137653739393762366435666364
data: 736D616C6C310A0A0A0A0A0A0A0A0A0A
encrypted: 4B1277F8475A788B59C77FC4C064D46F
En Base64:
encrypted: SxJ3+EdaeItZx3/EwGTUbw==