Maison  >  Article  >  php教程  >  Explication détaillée du cryptage, du décryptage, de la signature et de la vérification de la signature php rsa

Explication détaillée du cryptage, du décryptage, de la signature et de la vérification de la signature php rsa

高洛峰
高洛峰original
2016-12-30 09:21:093167parcourir

Chiffrement, 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 à trouver de nombreuses versions PHP de cryptage et de décryptage rsa sur Internet. 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é Java applicable doit être ajoutée lors de l'utilisation du langage php

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


Utilisez la clé :

Clé publique de chiffrement public_key.cer

Clé privée de décryptage private_key.key

Clé privée de signature sign_key.key

Clé publique de vérification 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 :

est parfois crypté avec base64_encode et transmis à d'autres pages sous forme de GET une fois déchiffré. avec base64_decode, un message d'erreur apparaît.

Lorsque j'ai rencontré ce problème, je me demandais pourquoi certains pouvaient être décryptés correctement, mais certains étaient tronqués

Après avoir vérifié plus tard, j'ai trouvé ? qu'il y avait des caractères chinois, une fois passé sous la forme GET, le nombre sera 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é. de caractères tronqués n'existe plus !

Par exemple, si vous transmettez une variable oid sous la forme de GET, alors lors du décryptage et de la restauration, remplacez d'abord les espaces par des nombres. Ensuite, la sortie sera normale. >

Comme suit : $oid=base64_decode(str_replace (" "," ",$_GET[oid]));


Merci d'avoir lu, j'espère que cela pourra aider tout le monde, merci vous pour votre soutien à ce site !

Pour plus d'articles sur le chiffrement, le décryptage, la signature et la vérification de signature php rsa, veuillez faire attention au site Web PHP 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