2017-09-15 5 views
0

I généré par clé rsa jsbn:WebCrypto: Importation clé rsa par crypto.subtle.importKey (...)

{ 
    "e": "10001", 
    "n": "74a258004dd6c338b27688c1dd13d90da3269321d6dfa3cd8d7cfd7521453d0c5a9828bd507cfc6fe004ddcc09c498d2ceea8e05c214a63ab99d33c9060236f02d5f8bd1e7b334c7f74745948664aeba1a5addf7e7d76911ebf382852aabe86e06f83e0f7669be172380069547f542d8b0848b8bcf53e57c04d5e4163820ced3e4078418efe98df9f8c54c0cda66db3262f20b81464162c44216ca8b63c8f0cfe090dfe1d1950428ad6948204f3f44ba0648de44a9c44d44b91bd8f9ff7cccaceb9f20204f3ba1e228f13249fe04a7fc69cfe57d35e8897e16bc7872f585c909fec9b95a5240ab6589c3ebbe3ad614bfbdc966218daf9d9dddb39fdf6c0d3b49", 
    ...} 

Et je veux importer par crypto.subtle.importKey.

C'est l'erreur que je trouve:

DOMException: Le membre JWK « n » ne pouvait pas être décodés ou base64url contenait un rembourrage

Est-ce que quelqu'un sait où est le problème?

Regardez le code my ci-dessous.

var keyData = { 
    kty: 'RSA', 
    e: hexToBase64(rsaJson.e), 
    n: hexToBase64(rsaJson.n), 
    alg: 'RSA-OAEP-256', 
    ext: true 
}; 

var algo = { 
    name: 'RSA-OAEP', 
    hash: {name: 'SHA-256'} 
}; 

var importedKey = crypto.subtle.importKey('jwk', keyData, algo, false, ['encrypt']).catch(function(err) { 
     console.log(err); 
    }); 

Répondre

0

Vous devez fournir une clé JWK avec des valeurs codées dans base64url qui est légèrement différent de base64. Convertir le résultat de hexToBase64 à base64url encodage

Ce code fonctionnera

var keyData = { 
    kty: 'RSA', 
    e: b64tob64u(hexToBase64(rsaJson.e)), 
    n: b64tob64u(hexToBase64(rsaJson.n)), 
    alg: 'RSA-OAEP-256', 
    ext: true 
}; 

var algo = { 
    name: 'RSA-OAEP', 
    hash: {name: 'SHA-256'} 
}; 

crypto.subtle.importKey('jwk', keyData, algo, false, ['encrypt']) 
.then (function (importedKey){ 
    console.log(importedKey); 
}).catch(function(err) { 
    console.log(err); 
}); 

function b64tob64u(a){ 
    a=a.replace(/\=/g,""); 
    a=a.replace(/\+/g,"-"); 
    a=a.replace(/\//g,"_"); 
    return a 
} 

Notez également WebCryptographyApi fonctionne avec des promesses et est async. J'ai changé

var importedKey = crypto.subtle.importKey(params...) 

avec

crypto.subtle.importKey(params...).then (function (importedKey) 
+0

Grand. Cela fonctionne pour moi. Merci pour votre note, j'utilise déjà la fonction "then". – Ana

+0

Salut. Cela fonctionne si j'importe une clé publique pour le cryptage, savez-vous pourquoi cela ne fonctionne pas pour l'importation de clé privée pour le décryptage? – Ana

+0

Cela devrait fonctionner de la même manière. J'ai répondu à votre nouvelle question. – pedrofb