cryptage, décryptage, signature, vérification de signature php rsa
Étant donné que l'organisation tierce utilise la version Java de la méthode de cryptage et de décryptage rsa, je viens de commencer à rechercher beaucoup de PHP sur la version Internet du cryptage et du décryptage rsa, mais la plupart d'entre eux ne sont pas adaptés à l'amarrage avec Java.
La version php suivante convient à l'amarrage avec l'interface Java. La clé applicable à Java doit être ajoutée lors de l'utilisation du langage php
-----BEGIN CERTIFICATE----- -----END CERTIFICATE-----
Utiliser la clé : <. 🎜>
cryptage Clé publique public_key.cer
<?php class RSAUtils{ //加密公钥 function redPukey() { //拼接加密公钥路径 $encryptionKeyPath="D:/encryptions.cer"; $encryptionKey4Server = file_get_contents($encryptionKeyPath); $pem = chunk_split(base64_encode($encryptionKey4Server),64,"\n");//转换为pem格式的公钥 $pem = "-----BEGIN CERTIFICATE-----\n".$pem."-----END CERTIFICATE-----\n"; $publicKey = openssl_pkey_get_public($pem); return $publicKey; } //解密私钥 function redPikey() { //拼接解密私钥路径 $decryptKeyPath="D:/decrypts.key"; $decryptKey4Server = file_get_contents($decryptKeyPath); $pem = chunk_split($decryptKey4Server,64,"\n");//转换为pem格式的私钥 $pem = "-----BEGIN PRIVATE KEY-----\n".$pem."-----END PRIVATE KEY-----\n"; $privateKey = openssl_pkey_get_private($pem); return $privateKey; } //签名私钥 function redSignkey() { //拼接签名路径 $signKeyPath="D:/DEMO/sign.key"; $signKey4Server = file_get_contents($signKeyPath); $pem = chunk_split($signKey4Server,64,"\n");//转换为pem格式的私钥 $pem = "-----BEGIN PRIVATE KEY-----\n".$pem."-----END PRIVATE KEY-----\n"; $signKey = openssl_pkey_get_private($pem); return $signKey; } //验签公钥 function redVerifykey() { //拼接验签路径 $verifyKeyPath="D:/DEMO/verify.cer"; $verifyKey4Server = file_get_contents($verifyKeyPath); $pem = chunk_split(base64_encode($verifyKey4Server),64,"\n");//转换为pem格式的公钥 $pem = "-----BEGIN CERTIFICATE-----\n".$pem."-----END CERTIFICATE-----\n"; $verifyKey = openssl_pkey_get_public($pem); return $verifyKey; } //公钥加密 function pubkeyEncrypt($source_data, $pu_key) { $data = ""; $dataArray = str_split($source_data, 117); foreach ($dataArray as $value) { $encryptedTemp = ""; openssl_public_encrypt($value,$encryptedTemp,$pu_key);//公钥加密 $data .= base64_encode($encryptedTemp); } return $data; } //私钥解密 function pikeyDecrypt($eccryptData,$decryptKey) { $decrypted = ""; $decodeStr = base64_decode($eccryptData); $enArray = str_split($decodeStr, 256); foreach ($enArray as $va) { openssl_private_decrypt($va,$decryptedTemp,$decryptKey);//私钥解密 $decrypted .= $decryptedTemp; } return $decrypted; } } ?>
Remarque :
Parfois après le cryptage avec base64_encode, il est transmis à d'autres pages sous forme de GET. Lorsqu'il est déchiffré avec base64_decode, des caractères tronqués apparaissent.J'ai rencontré ce problème Quand je l'ai lu, je me demandais pourquoi certains pouvaient être déchiffrés correctement, mais certains étaient tronqués ?Après avoir vérifié plus tard, j'ai découvert qu'il y avait des caractères chinois lorsqu'ils étaient transmis. Au format GET, le signe + apparaissait. a été remplacé par des espaces.Afin d'éviter les caractères tronqués, j'ai fait une étape de substitution puis je l'ai déchiffré. Effectivement, le problème des caractères tronqués n'existe plus ! Par exemple, si vous utilisez GET Une variable oid est le suivant : $oid=base64_decode(
str_replace(" ","+",$_GET[oid]));
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!