php rsa 암호화, 복호화, 서명, 서명 확인
타사 기관에서 Java 버전의 rsa 암호화 및 복호화 방법을 사용하기 때문에 최근에 rsa 암호화 및 복호화의 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 변수를 전달한 경우 암호 해독 및 복원 시 먼저 공백을 + 기호로 바꾸면 다음과 같이 출력됩니다. Normal.
다음과 같습니다: $oid=base64_decode (str_replace(" ","+",$_GET[oid]));
읽어주셔서 감사합니다. 모두에게 도움이 될 수 있습니다. 이 사이트를 지원해 주셔서 감사합니다!
더 많은 PHP RSA 암호화, 복호화, 서명, 서명 확인 관련 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!