Maison >développement back-end >tutoriel php >Exemple d'analyse de MD5 combiné avec RSA pour implémenter un algorithme de signature en PHP

Exemple d'analyse de MD5 combiné avec RSA pour implémenter un algorithme de signature en PHP

黄舟
黄舟original
2017-10-09 09:10:532156parcourir

Cet article présente principalement l'algorithme de signature MD5 combiné avec RSA implémenté par PHP, et analyse les techniques de fonctionnement pertinentes de l'algorithme de signature implémenté par PHP en utilisant md5 combiné avec RSA sous forme d'exemples. Il est également accompagné d'instructions pertinentes pour le. Clé publique et clé privée RSA. Les amis peuvent se référer à

Cet article décrit le MD5 combiné à l'algorithme de signature RSA implémenté en PHP. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :


<?php
class Md5RSA{
  /**
   * 利用约定数据和私钥生成数字签名
   * @param $data 待签数据
   * @return String 返回签名
   */
  public function sign($data=&#39;&#39;)
  {
    if (empty($data))
    {
      return False;
    }
    $private_key = file_get_contents(dirname(__FILE__).&#39;/rsa_private_key.pem&#39;);
    if (empty($private_key))
    {
      echo "Private Key error!";
      return False;
    }
    $pkeyid = openssl_get_privatekey($private_key);
    if (empty($pkeyid))
    {
      echo "private key resource identifier False!";
      return False;
    }
    $verify = openssl_sign($data, $signature, $pkeyid, OPENSSL_ALGO_MD5);
    openssl_free_key($pkeyid);
    return $signature;
  }
  /**
   * 利用公钥和数字签名以及约定数据验证合法性
   * @param $data 待验证数据
   * @param $signature 数字签名
   * @return -1:error验证错误 1:correct验证成功 0:incorrect验证失败
   */
  public function isValid($data=&#39;&#39;, $signature=&#39;&#39;)
  {
    if (empty($data) || empty($signature))
    {
      return False;
    }
    $public_key = file_get_contents(dirname(__FILE__).&#39;/rsa_public_key.pem&#39;);
    if (empty($public_key))
    {
      echo "Public Key error!";
      return False;
    }
    $pkeyid = openssl_get_publickey($public_key);
    if (empty($pkeyid))
    {
      echo "public key resource identifier False!";
      return False;
    }
    $ret = openssl_verify($data, $signature, $pkeyid, OPENSSL_ALGO_MD5);
    switch ($ret)
    {
      case -1:
        echo "error";
        break;
      default:
        echo $ret==1 ? "correct" : "incorrect";//0:incorrect
        break;
    }
    return $ret;
  }
}

Pièce jointe : Instructions pour générer des certificats avec openssl et obtenir des certificats publics et clés privées

1. Méthode RSA

1) Créer le certificat racine de l'autorité de certification 1) Créer le répertoire RSA 2) Créer les sous-répertoires suivants certs, crl. , newcerts 3) Dans Exécutez les opérations suivantes dans le répertoire RSA :

echo 01 > serial
touch index.txt
openssl req -new -x509 -newkey rsa:1024 - keyout CA.key -out CA .pem (générer un certificat CA auto-signé)

2. Demande de certificat client

openssl req -new -newkey rsa:1024 - keyout ddmdd_a.key -out ddmdd_a .req (générer la demande de clé et de certificat pour ddmdd_a, remarque : les informations utilisateur renseignées ici doivent être complètement cohérentes avec les informations du certificat CA)
openssl rsa -in ddmdd_a.key -pubout - out ddmdd_a.pub (exporter la clé publique)

3. Émettre des certificats pour les clients

openssl ca -keyfile CA.key -cert CA.pem -in ddmdd_a.req -out ddmdd_a.pem -notext (utilisez la clé CA et le certificat sont émis pour le certificat ddmdd_a ddmdd_a.pem)
openssl ca -keyfile CA.key -cert CA.pem -in subca_rsareq.pem -out subca.pem -notext ( délivrance du certificat d'autorité de certification secondaire)

4. Convertir le format du certificat

openssl x509 -inform pem -outform der -in ddmdd_a.pem -out ddmdd_a.der
openssl pkcs12 -export -in ddmdd_a.pem -inkey ddmdd_a_rsakey.pem -out ddmdd_a.pfx
openssl pkcs12 -in ddmdd_a.pfx -out ddmdd_a.pem
openssl rsa -in ddmdd_a.key -out ddmdd_a_open. clé ( supprimer le mot de passe de la clé privée)

5. Générer une liste de révocation de certificats

echo 01 > révoquer ddmdd_a.pem (révoquer du certificat CA ddmdd_a.pem)
openssl ca -gencrl -keyfile CA.key -cert CA.pem -out CA.crl (Générer ou mettre à jour la liste de révocation de certificats)

6. Afficher les informations du certificat

openssl x509 -in CA.pem -noout –text

Méthode DSA

1. Créer le certificat racine de l'AC 1) Créer le répertoire DSA 2) Créer les sous-répertoires suivants certs, crl, newcerts 3) Effectuer les opérations suivantes dans le répertoire DSA :

echo 01 > touch index.txt
openssl dsaparam -out CA.para 1024 (générer un fichier de paramètres dsa)
openssl req -new -x509 -newkey dsa:CA.para -keyout CA.key -out CA.pem (utilisez les paramètres dsa pour générer un certificat CA auto-signé)

2. Demande de certificat client

openssl dsaparam -out ddmdd_b.para 1024 (générer un fichier de paramètres dsa) openssl req -new -newkey dsa:ddmdd_b .para -keyout ddmdd_b.key -out ddmdd_b.req (Utilisez le paramètre dsa pour générer la demande de clé et de certificat pour ddmdd_b. Remarque : les informations utilisateur renseignées ici doivent être entièrement cohérent avec les informations du certificat CA)
openssl dsa -in ddmdd_b. key -pubout -out ddmdd_b.pub (Exporter la clé publique)

3. Émettre des certificats pour les clients

openssl ca -keyfile CA.key -cert CA.pem - in ddmdd_b.req -out ddmdd_b.pem -notext (utilisez la clé CA et le certificat pour émettre le certificat ddmdd_b.pem pour ddmdd_b)

3. Obtenez la clé publique et la clé privée

a) Si vous générez un certificat via la méthode ci-dessus, vous pouvez obtenir la clé publique et la clé privée via les commandes suivantes.

Exporter la clé publique :

Mode DSA :

openssl dsa -in ddmdd_b.key -pubout -out ddmdd_b.pub.pem

Mode RSA :

openssl rsa -in ddmdd_a.key -pubout -out ddmdd_a.pub.pem

Exporter la clé privée :

openssl rsa -in server.key -text > private.pem

b) Générer directement les clés publiques et privées :

openssl genrsa -out private.pem 1024openssl pkcs8 -nocrypt -topk8 - dans private.pem -out pkcs8.pem
openssl rsa -pubout -in private.pem public.pem

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
Article précédent:Fonctions communes PHPArticle suivant:Fonctions communes PHP