>  기사  >  php教程  >  PHP RSA 암호화, 복호화, 서명, 서명 확인에 대한 자세한 설명

PHP RSA 암호화, 복호화, 서명, 서명 확인에 대한 자세한 설명

高洛峰
高洛峰원래의
2016-12-30 09:21:093167검색

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 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.