Je suis tombé sur d'autres fils de discussion avec des questions similaires, mais en raison des récents changements apportés à PHP (c'est-à-dire la suppression de mcrypt ), je cherche des conseils sur la meilleure façon de procéder en utilisant OpenSSL en 2017/18.
En utilisant echo 'this string will be encrypted' | openssl enc -aes-256-cbc -a -pass pass:123
le terminal Mac, j'ai pu crypter la chaîne par mot de passe et j'aimerais maintenant la transmettre (en tant que paramètre) à une fonction PHP côté serveur pour la décrypter.
Après avoir étudié cette question, je peux voir que c'est possible mais il utilise la fonction mcrypt maintenant supprimée . Pour en savoir plus dans le manuel PHP , je ne suis pas plus proche de savoir comment inverser cette commande de cryptage en son équivalent de décryptage PHP.
Cette réponse récente est ce que j'ai implémenté jusqu'à présent, encore une fois, cela ne fonctionnera tout simplement pas avec un cryptage généré par Terminal, un seul qui a été créé en PHP (non montré ici).
<?php
$encrypted_string = $_GET['data'];
$password = '123';
$decrypted_data = openssl_decrypt($encrypted_string, "AES-256-CBC", $password);
print "Decrypted Data: <$decrypted_data>\n";
?>
Le manuel PHP OpenSSL indique que du texte brut ou des chaînes encodées en base64 peuvent être transmises et déchiffrées. Comme j'ai utilisé le -a
drapeau pendant le chiffrement, je m'attendrais à ce que base64 soit transmis, éliminant ainsi la source comme raison potentielle pour laquelle aucune donnée déchiffrée n'est renvoyée.
J'ai pris soin de l'encodage des URL de telle sorte que tous les symboles + produits par l'algorithme de cryptage soient remplacés par leur équivalent - %2B - URL-Safe car ils seraient autrement transformés en un caractère espace, brisant ainsi la chaîne de paramètre. Cela garantit en outre que la chaîne d'entrée codée est correctement adressée par l'algorithme de décryptage.
Questions : Pourquoi ma fonction PHP ne déchiffre-t-elle pas la chaîne générée par la commande de terminal, bien que les deux utilisent la même méthode et le même mot de passe ? Qu'est-ce qui manque dans mon code PHP pour que cela fonctionne ?
Bravo à tous.
METTRE À JOUR
J'utilise maintenant la commande Terminal :
echo 'blah' | openssl enc -aes-256-cbc -a -K B374A26A71490437AA024E4FADD5B497FDFF1A8EA6FF12F6FB65AF2720B59CCF -iv 64299685b2cc8da5
qui crypte pour :Y4xelTtEJPUHytB5ARwUHQ==
Je passe ceci à PHP en utilisant www.example.com/?data=Y4xelTtEJPUHytB5ARwUHQ==
PHP devrait prendre les paramètres de données et les décrypter. Actuellement, cette fonction ressemble à ceci :
<?php
$encrypted_string = base64_decode($_GET['data']);
$key = 'B374A26A71490437AA024E4FADD5B497FDFF1A8EA6FF12F6FB65AF2720B59CCF';
$iv = '64299685b2cc8da5';
$output = openssl_decrypt($encrypted_string, 'AES-256-CBC', hex2bin($key), OPENSSL_RAW_DATA, hex2bin($iv));
print "Decrypted Data: <$output>\n";
?>
OpenSSL utilise un KDF propriétaire que vous ne voulez probablement pas faire l'effort de reproduire en code PHP. Cependant, vous pouvez plutôt passer votre clé en hexadécimal pur, en évitant le KDF, en utilisant le -K
drapeau :
echo 'blah' | openssl enc -aes-256-cbc -K 0000000000000000000000000000000000000000000000000000000000000000
Ici, la grande chaîne hexadécimale est votre clé 256 bits, codée en hexadécimal. Cette opération de cryptage sera compatible avec votre PHP.
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots