PHP-RSA-Verschlüsselung, Entschlüsselung, Signatur, Signaturüberprüfung
Da die Drittorganisation die Java-Version der RSA-Verschlüsselungs- und Entschlüsselungsmethode verwendet, habe ich gerade angefangen, viele PHP-Versionen der RSA-Verschlüsselung und -Entschlüsselung zu finden Die meisten von ihnen sind jedoch nicht für das Andocken an Java geeignet.
Die folgende PHP-Version eignet sich zum Andocken an die Java-Schnittstelle. Bei Verwendung der PHP-Sprache muss der Java-Schlüssel hinzugefügt werden >Verwenden Sie den Schlüssel:
Verschlüsselung öffentlicher Schlüssel public_key.cer-----BEGIN CERTIFICATE----- -----END CERTIFICATE-----
Entschlüsselung privater Schlüssel private_key.key
Verifizierung öffentlicher Schlüssel verify.cer
Hinweis:
<?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; } } ?>
Als ich auf dieses Problem stieß, war ich verwirrt. Warum konnten einige korrekt entschlüsselt werden, andere jedoch verstümmelt?
Nachdem ich später nachgesehen hatte, stellte ich fest, dass es einige chinesische Zeichen gab. Wenn das +-Zeichen durch ein Leerzeichen ersetzt wird, habe ich einen Schritt zum Ersetzen vorgenommen und es dann tatsächlich entschlüsselt Zeichen existieren nicht mehr!
Wenn Sie beispielsweise eine OID-Variable in Form von GET übergeben, ersetzen Sie beim Entschlüsseln und Wiederherstellen zunächst die Leerzeichen durch +-Zeichen. Dann ist die Ausgabe normal.
Wie folgt: $oid=base64_decode(str_replace(" ","+",$_GET[oid]));
Vielen Dank fürs Lesen. Ich hoffe, es kann Ihnen helfen. Vielen Dank für Ihre Unterstützung dieser Website. Für weitere verwandte Inhalte bitte Achten Sie auf die chinesische PHP-Website (www.php.cn)!