3

J'ai le code JavaScript suivant pour implémenter le chiffrement de clé publique à l'aide de l'API Web Cryptography. Cela fonctionne pour Firefox et Chrome mais échoue pour Microsoft Edge. L'erreur que j'obtiens de Edge est "Impossible de terminer l'opération en raison de l'erreur 80700011." Qu'ai-je manqué?Chiffrement de clé publique dans Microsoft Edge

<script> 
    var data = new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); 

    var crypto = window.crypto || window.msCrypto; 
    var cryptoSubtle = crypto.subtle; 

    cryptoSubtle.generateKey(
     { 
      name: "RSA-OAEP", 
      modulusLength: 2048, 
      publicExponent: new Uint8Array([0x01, 0x00, 0x01]), 
      hash: { name: "SHA-256" }, 
     }, 
     true, 
     ["encrypt", "decrypt"] 
    ).then(function (key) { 
     console.log(key); 
     console.log(key.publicKey); 
     return cryptoSubtle.encrypt(
      { 
       name: "RSA-OAEP" 
      }, 
      key.publicKey, 
      data 
      ); 
    }).then(function (encrypted) { 
     console.log(new Uint8Array(encrypted)); 
    }).catch(function (err) { 
     console.error(err); 
    }); 
</script> 
+1

"W3CException_DOM_TYPE_MISMATCH_ERR: Le type de noeud est incompatible avec le type de paramètre attendu." Pas très utile peut-être, mais c'est tout ce que j'ai pu trouver. Peut-être que cela suggère que le problème est ailleurs dans votre code. –

+0

Merci @JamesKPolk. Il n'y a rien d'autre. C'est une page vide avec le code ci-dessus. En outre, cela fonctionne bien avec Firefox et Chrome. – FengHuang

Répondre

6

J'ai trouvé la cause de ce problème. Je dois ajouter le champ de hachage lors de l'appel de la fonction Encrypt:

 return cryptoSubtle.encrypt(
      { 
       name: "RSA-OAEP", 
       hash: { name: "SHA-256" } 
      }, 
      key.publicKey, 
      data 
      ); 

Cela ne correspond pas à la Web Cryptography API Spec mais il fonctionne.

+1

Si ce comportement Edge n'est pas spécifié ici, pensez à déposer un bogue sur Edge et à publier un lien vers ce bogue si possible. – sideshowbarker

+0

Ca marche aussi pour le safari – nuno

0

Même problème avec crypto.subtle.sign. Nécessaire d'ajouter l'algorithme de hachage (même problème dans Safari)

Remplacer

crypto.subtle.sign(
      { 
       name: "RSASSA-PKCS1-v1_5" 
      }, 
      cryptoKey, 
      digestToSignBuf); 

avec

crypto.subtle.sign(
      { 
       name: "RSASSA-PKCS1-v1_5", 
       hash: "SHA-256" 
      }, 
      cryptoKey, 
      digestToSignBuf);