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/26 17:17]
etienne Génération et vérification
notes:webcrypto [2021/05/28 15:12] (Version actuelle)
etienne
Ligne 1: Ligne 1:
 ====== WebCrypto ====== ====== WebCrypto ======
  
-Cette page résume des opérations similaires entre WebCrypto et d'autres outils+Comme il est parfois difficile de faire le lien entre les formats, les algorithmes et les divers paramètres, cette page à pour but de montrer le lien qu'il existe entre des opérations avec l'API WebCrypto et d'autres outils et langages. 
 +Elle ne reflète en aucun cas des méthodes devant être appliquée mais bien des exemples comme générer un clé privée avec OpenSSL et l'utiliser avec WebCrypto. 
 ===== RSA-PSS pour signature ===== ===== RSA-PSS pour signature =====
 +
 +[[https://artnum.ch/code/demos/webcrypto/sign.html|Démonstration]]
  
 ==== 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 61: Ligne 84:
  
 ==== Génération de clés ==== ==== Génération de clés ====
 +
 +
  
 === OpenSSL === === OpenSSL ===
Ligne 70: Ligne 95:
 $ openssl rsa -in rsakey.pem -pubout > rsapub.pem # clé publique $ openssl rsa -in rsakey.pem -pubout > rsapub.pem # clé publique
 </code> </code>
 +
 +=== SSH ===
 +
 +OpenSSH génère des clé au format RFC4716.
 +<code shell>
 +$ ssh-keygen -t rsa -b 2048 -f ssh-rsa.key
 +</code>
 +
 +Avec l'option "-m PEM" on peut avoir directement une clé PKCS#1
  
 === JavaScript === === JavaScript ===
Ligne 134: 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 173: 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.1582733863.txt.gz · Dernière modification: 2020/02/26 17:17 de etienne