Outils pour utilisateurs

Outils du site


notes:webcrypto

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
notes:webcrypto [2020/02/27 06:55]
etienne [Génération de clés]
notes:webcrypto [2021/05/28 15:12] (Version actuelle)
etienne
Ligne 9: Ligne 9:
  
 ==== Conversion de clés ==== ==== Conversion de clés ====
 +
 +==== Clé publique de PEM vers DER ====
 +<code shell>
 +$ openssl pkey  -pubin -in rsapub.pem -out rsapub.der -outform DER
 +</code>
 +
 +
 +=== OpenSSH ===
 +
 +Pour convertir une clé SSH vers RSA (pour ensuite être utilisée avec OpenSSL)
 +<code shell>
 +$ ssh-keygen -p -m PEM -f ssh-rsa.key
 +</code>
 +
 +Ensuite on extrait sa clé publique et on la converti en PKCS#8
 +<code shell>
 +$ openssl rsa -in ssh-rsa.key -pubout > ssh-rsa.pub
 +$ openssl pkcs8 -topk8 -nocrypt -in ssh-rsa.key -out ssh-rsa.pkcs8
 +</code>
  
 === OpenSSL === === OpenSSL ===
Ligne 81: Ligne 100:
 OpenSSH génère des clé au format RFC4716. OpenSSH génère des clé au format RFC4716.
 <code shell> <code shell>
-$ ssh-keygen -t rsa -b 2048 -f ssh-rsa+$ ssh-keygen -t rsa -b 2048 -f ssh-rsa.key
 </code> </code>
  
Ligne 149: Ligne 168:
    }    }
 </code> </code>
 +
 +=== PHP/phpseclib 2 ===
 +
 +Signature avec [[http://phpseclib.sourceforge.net/|phpseclib]]
 +
 +<code php>
 +<?PHP
 +require('phpseclib/autoload.php');
 +use phpseclib\Crypt\RSA;
 +
 +$rsa = new RSA();
 +$rsa->loadKey(file_get_contents('fromjs.key'));
 +$rsa->setHash('sha256');
 +$rsa->setMGFHash('sha256');
 +$rsa->setSaltLength(0);
 +$rsa->setSignatureMode(RSA::SIGNATURE_PSS);
 +$text = 'Texte à signer';
 +$signature = $rsa->sign($text);
 +echo base64_encode($signature);
 +?>
 +</code>
 +
 +=== C/OpenSSL EVP ===
 +
 +<code c>
 +/* Pour lire la clé :
 + 
 + * FILE * fp = fopen("pkey.pem", "r");
 + * sign(PEM_read_PrivateKey(fp, NULL, NULL, NULL), ...);
 + */
 +
 +void sign (EVP_PKEY * pkey, const char * text, unsigned char ** stext, size_t * slen) {
 +  size_t siglen = 0;
 +  EVP_PKEY_CTX * kctx = NULL;
 +  EVP_MD_CTX * mctx = NULL;
 +
 +  mctx = EVP_MD_CTX_new();
 +  if (!mctx) { return; }
 +  
 +  kctx = EVP_PKEY_CTX_new(pkey, NULL);
 +  if (kctx) {
 +    /* ordre important ici */
 +    EVP_MD_CTX_set_pkey_ctx(mctx, kctx);
 +    EVP_DigestSignInit(mctx, NULL, EVP_sha256(), NULL, NULL);
 +
 +    EVP_PKEY_CTX_set_rsa_padding(kctx, RSA_PKCS1_PSS_PADDING);
 +    EVP_PKEY_CTX_set_signature_md(kctx, EVP_sha256());
 +    EVP_PKEY_CTX_set_rsa_mgf1_md(kctx, EVP_sha256());
 +    EVP_PKEY_CTX_set_rsa_pss_saltlen(kctx, 0);
 +
 +    EVP_DigestSignUpdate(mctx, text, strlen(text));
 +    EVP_DigestSignFinal(mctx, NULL, &siglen);
 +    
 +    *stext = calloc(siglen, sizeof(**stext));
 +    if (*stext == NULL) {
 +      EVP_MD_CTX_free(mctx);
 +      return;
 +    }
 +    EVP_DigestSignFinal(mctx, *stext, &siglen);
 +    *slen = siglen;
 +  }
 +  EVP_MD_CTX_free(mctx);
 +  
 +  return;
 +}
 +</code>
 +
 ==== Vérification de signature ==== ==== Vérification de signature ====
  
Ligne 188: Ligne 274:
    }    }
 </code> </code>
 +
 +=== PHP/phpseclib 2 ===
 +
 +L'ordre des opérations (setHash, setMGFHash, loadKey, ...) n'est pas déterminant.
 +
 +<code php>
 +<?PHP
 +$rsa = new RSA();
 +$rsa->loadKey(file_get_contents('fromjs.pem'));
 +$rsa->setHash('sha256');
 +$rsa->setMGFHash('sha256');
 +$rsa->setSaltLength(0);
 +$rsa->setSignatureMode(RSA::SIGNATURE_PSS);
 +$text = 'Texte à signer';
 +echo $rsa->verify($text, base64_decode(file_get_contents('fromjs.sig'))) ? 'Valide' : 'Invalide';
 +?>
 +</code>
 +
notes/webcrypto.1582782939.txt.gz · Dernière modification: 2020/02/27 06:55 de etienne