Heim  >  Artikel  >  Backend-Entwicklung  >  PHP RSA-Verschlüsselung, Entschlüsselung, Signatur, Signaturüberprüfung, öffentlicher Schlüssel, Beispielcode, detaillierte Erklärung

PHP RSA-Verschlüsselung, Entschlüsselung, Signatur, Signaturüberprüfung, öffentlicher Schlüssel, Beispielcode, detaillierte Erklärung

伊谢尔伦
伊谢尔伦Original
2017-07-08 10:29:321745Durchsuche

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, viel zu suchen PHP ist eine Internetversion der RSA-Verschlüsselung und -Entschlüsselung, die meisten davon eignen sich jedoch nicht zum Andocken an Java.

Die folgende PHP-Version eignet sich zum Andocken an die Java-Schnittstelle. Bei Verwendung der PHP-Sprache müssen Java-relevante Schlüssel hinzugefügt werden

-----BEGIN CERTIFICATE-----
 
-----END CERTIFICATE-----   

Verwenden Sie den Schlüssel:
Verschlüsselung Öffentlicher Schlüssel public_key.cer

Privaten Schlüssel entschlüsseln private_key.key

Privaten Schlüssel sign_key.key signieren

Öffentlichen Schlüssel überprüfen 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;
  }
  
 
}
?>

Hinweis:

Manchmal wird es nach der Verschlüsselung mit base64_encode in Form von GET an andere Seiten übertragen. Beim Entschlüsseln mit base64_decode erscheinen verstümmelte Zeichen.

Ich bin auf dieses Problem gestoßen. Als ich es las, fragte ich mich, warum einige richtig entschlüsselt werden konnten, andere jedoch verstümmelt waren.

Später stellte ich bei der Überprüfung fest, dass einige chinesische Schriftzeichen vorhanden waren Im GET-Format wurde das +-Zeichen durch Leerzeichen ersetzt.

Um verstümmelte Zeichen zu verhindern, habe ich einen Schritt zum Ersetzen durchgeführt und es dann entschlüsselt. Tatsächlich besteht das Problem der verstümmelten Zeichen nicht mehr !

Wenn Sie beispielsweise GET Eine oid-Variable im Formular übergeben, ersetzen Sie beim Entschlüsseln und Wiederherstellen zunächst die Leerzeichen durch +-Zeichen. Dann ist die Ausgabe normal.

lautet wie folgt: $oid=base64_decode(str_replace(" ","+",$_GET[oid]));

Das obige ist der detaillierte Inhalt vonPHP RSA-Verschlüsselung, Entschlüsselung, Signatur, Signaturüberprüfung, öffentlicher Schlüssel, Beispielcode, detaillierte Erklärung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn