php rsa 암호화, 복호화, 서명, 서명 확인
타사 기관에서는 Java 버전의 rsa 암호화 및 복호화 방법을 사용하기 때문에 처음에는 인터넷에서 많은 PHP 버전의 rsa 암호화 및 복호화를 찾았지만 대부분 둘 다 Java에 연결되어 있지 않습니다.
다음 PHP 버전은 Java 인터페이스와의 도킹에 적합합니다. PHP 언어에서 Java 적용 키를 사용하려면 추가해야 합니다.
-----BEGIN CERTIFICATE----- -----END CERTIFICATE-----
키 사용:
암호화 공개 키 public_key.cer
복호화 개인키 private_key.key
서명 개인키 sign_key.key
확인 공개키 verify.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; } } ?>
참고:
base64_encode로 암호화한 후 GET 형식으로 다른 페이지로 전송되는 경우도 있습니다. base64_decode로 복호화하면 이상한 문자가 나타납니다.
이 문제를 만났을 때 왜 일부는 올바르게 복호화할 수 있는데 일부는 왜곡되어 있는지 혼란스러웠습니다.
나중에 확인해보니 일부 중국어 문자가 있는 것을 발견했습니다. GET 형식으로 전송되면 + 기호가 공백으로 대체됩니다.
문자 깨짐을 방지하기 위해 대체 단계를 만든 다음 해독했습니다. 당연히 문자 깨짐 문제는 더 이상 존재하지 않습니다.
예를 들어 GET 형식으로 oid변수를 전달한 다음 복호화하고 복원할 때 먼저 공백을 + 기호로 바꾸면 출력이 정상이 됩니다.
는 다음과 같습니다. $oid=base64_decode (str_replace(" ","+",$_GET[oid]));
위 내용은 PHP RSA 암호화, 복호화, 서명 및 확인 공개 키 예제 코드에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!