Maison >développement back-end >tutoriel php >Un article expliquant en détail comment implémenter le chiffrement AES-128-CBC-PKCS5Padding en PHP
La demande de l'autre partie est de
encoder les données commerciales de l'interface et de soumettre la chaîne résultante, ainsi que de fournir la clé (clé) et le vecteur d'initialisation (offset) correspondant à la méthode de cryptage.AES-128-CBC-PKCS5Padding
加密,然后再做 Base64
Après avoir vu cette méthode de cryptage pour la première fois, j'ai cherché dans la bibliothèque de fonctions PHP pour voir s'il existait une fonction de cryptage correspondante. Cependant, après avoir cherché, j'ai découvert qu'il n'y en avait pas et j'ai dû l'implémenter moi-même. que je pourrais utiliser la fonction mcrypt. Implémentation de l'extension, mais la fonction mcrypt a été abandonnée depuis PHP 7.1.0. Il est fortement recommandé de ne pas utiliser cette fonction. Je dois rechercher d'autres bibliothèques de fonctions de chiffrement sur. au bas du manuel. J'ai découvert que cela peut être fait en comprenant la fonction openssl_encrypt (données cryptées). Pour mettre en œuvre les exigences, veuillez lire le manuel pour l'utilisation spécifique de openssl_encrypt [Recommandé :
function encrypt($input, $key, $iv){
return base64_encode(openssl_encrypt($input, 'AES-128-CBC', $key, OPENSSL_RAW_DATA,$iv));
}
// 解密
function decrypt($input, $key, $iv){
return openssl_decrypt(base64_decode($input), 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
}
// 测试加密 (我这里用的是json字符串)
$dataJson = '[{"Code": "123123", "Name": "Bob", "Address": "\u94f6\u5ddd\u5e02"}, {"Code": "464776", "Name": "Hello", "Address": "\u5317\u4eac\u5e02"}]';
print_r(encrypt($dataJson, $key, $iv));
//u9Bd8oHXDGvjZcTIX9HK1r1q+aSu+/48gsfoGVrxoScZuX8yaj/xco8F2yHt2T987JNHil9LwjAmu9o5NJaicWQDaiKwMD5o70k1A9bGjDd71xb4hXRx3ddZwI85oTQQEUQLadR5C759SdaN8AOxlzH+yGlAWTOaEleulKoRTwaknG1NCM/qIRQ8gI5lzv+D
// 测试解密
$strr = 'u9Bd8oHXDGvjZcTIX9HK1r1q+aSu+/48gsfoGVrxoScZuX8yaj/xco8F2yHt2T987JNHil9LwjAmu9o5NJaicWQDaiKwMD5o70k1A9bGjDd71xb4hXRx3ddZwI85oTQQEUQLadR5C759SdaN8AOxlzH+yGlAWTOaEleulKoRTwaknG1NCM/qIRQ8gI5lzv+D';
print_r(decrypt($strr, $key, $iv));
// [{"Code": "123123", "Name": "Bob", "Address": "\u94f6\u5ddd\u5e02"}, {"Code": "464776", "Name": "Hello", "Address": "\u5317\u4eac\u5e02"}]
J'ai réussi l'auto-test, je me suis assis et j'ai attendu le débogage commun avec un visage fier. Ensuite, j'ai commencé à écrire sur d'autres affaires. Après quelques jours, un débogage conjoint a révélé que l'autre partie ne pouvait pas déchiffrer ce que j'avais chiffré, et je ne pouvais pas déchiffrer ce que l'autre partie avait chiffré. L'algorithme de cryptage ne correspondait pas (je me suis gratté la tête). Après avoir recherché des problèmes connexes sur Google, j'ai trouvé une phrase : La signification générale est que dans la bibliothèque de chiffrement mcrypt abandonnée, 128 fait en fait référence à la taille du bloc plutôt qu'à la taille de la clé, mais dans aes-128-cbc dans openssl, 128 fait référence. à la taille de la clé, c'est-à-dire que lorsque vous utilisez des clés valides de 256 bits, elles sont toutes aes-256, et si vous souhaitez convertir mcrypt en méthode de cryptage d'openssl, le 128 de mcrypt doit être écrit comme le 256 d'openssl, j'ai donc changé avec l'attitude de l'essayer. aes-128-cbc est aes-256-cbc, puis débogué, et a finalement constaté que le débogage commun avait réussi. Cependant, les détails techniques spécifiques ne sont pas encore clairs. et étudiez-le plus tard quand nous aurons le temps
> **解决的方案,是把加密方式 AES-128-CBC 替换成 AES-256-CBC**
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!