Maison  >  Article  >  développement back-end  >  PHP rsa cryptage, déchiffrement, signature, vérification de signature, exemple de code de clé publique, explication détaillée

PHP rsa cryptage, déchiffrement, signature, vérification de signature, exemple de code de clé publique, explication détaillée

伊谢尔伦
伊谢尔伦original
2017-07-08 10:29:321745parcourir

cryptage, décryptage, signature, vérification de signature php rsa

Étant donné que l'organisation tierce utilise la version Java de la méthode de cryptage et de décryptage rsa, je viens de commencer à rechercher beaucoup de PHP sur la version Internet du cryptage et du décryptage rsa, mais la plupart d'entre eux ne sont pas adaptés à l'amarrage avec Java.

La version php suivante convient à l'amarrage avec l'interface Java. La clé applicable à Java doit être ajoutée lors de l'utilisation du langage php

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

Utiliser la clé : <.>
cryptage Clé publique public_key.cer

Déchiffrer la clé privée private_key.key

Signer la clé privée sign_key.key

Vérifier la clé publique 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;
  }
  
 
}
?>

Remarque :

Parfois après le cryptage avec base64_encode, il est transmis à d'autres pages sous forme de GET. Lorsqu'il est déchiffré avec base64_decode, des caractères tronqués apparaissent.

J'ai rencontré ce problème Quand je l'ai lu, je me demandais pourquoi certains pouvaient être déchiffrés correctement, mais certains étaient tronqués ?

Après avoir vérifié plus tard, j'ai découvert qu'il y avait des caractères chinois lorsqu'ils étaient transmis. Au format GET, le signe + apparaissait. a été remplacé par des espaces.

Afin d'éviter les caractères tronqués, j'ai fait une étape de substitution puis je l'ai déchiffré. Effectivement, le problème des caractères tronqués n'existe plus !

Par exemple, si vous utilisez GET Une variable oid

est passée dans le formulaire, puis lors du déchiffrement et de la restauration, remplacez d'abord les espaces par des signes +. La sortie sera alors normale. 🎜>

est le suivant : $oid=base64_decode(

str_replace(" ","+",$_GET[oid]));

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn