2017-01-08 37 views
2

CryptoKeyをPEMスタイルにエクスポートしたので、インポートし直しました。 私は次のコードを使用して、私の鍵を生成:Web Cryptoを使用してPEMキーをインポート

function generate() { 
    return window.crypto.subtle.generateKey(
    { 
     name: "RSA-OAEP", 
     modulusLength: 2048, 
     publicExponent: new Uint8Array([0x01, 0x00, 0x01]), 
     hash: {name: "SHA-256"}, 
    }, 
    true, 
    ["encrypt", "decrypt"] 
    ).then(function (key) { 
     return key; 
    }) 
    .catch(function (err) { 
     console.error(err); 
    }); 
} 

をそして、私は次のコードを使用して文字列(PEM形式)である秘密鍵をインポートしようとしている。残念ながら

function importPrivateKey(pemKey) { 
return crypto.subtle.importKey("pkcs8", convertPemToBinary(pemKey), {name:"RSA-OAEP", hash:{name:"SHA-256"}}, true, ["encrypt", "decrypt"]);} 

を、それが返されますこのエラー:

SyntaxError: Cannot create a key using the specified key usages. 

UPDATE

convertPemToBinary機能convertPemToBinary機能で使用

function convertPemToBinary(pem) { 
var lines = pem.split('\n'); 
var encoded = ''; 
for (var i = 0; i < lines.length; i++) { 
    if (lines[i].trim().length > 0 && 
     lines[i].indexOf('-----BEGIN RSA PRIVATE KEY-----') < 0 && 
     lines[i].indexOf('-----BEGIN RSA PUBLIC KEY-----') < 0 && 
     lines[i].indexOf('-----BEGIN PUBLIC KEY-----') < 0 && 
     lines[i].indexOf('-----END PUBLIC KEY-----') < 0 && 
     lines[i].indexOf('-----BEGIN PRIVATE KEY-----') < 0 && 
     lines[i].indexOf('-----END PRIVATE KEY-----') < 0 && 
     lines[i].indexOf('-----END RSA PRIVATE KEY-----') < 0 && 
     lines[i].indexOf('-----END RSA PUBLIC KEY-----') < 0) { 
     encoded += lines[i].trim(); 
    } 
} 
return base64StringToArrayBuffer(encoded); 
} 

サブ機能:

function base64StringToArrayBuffer(b64str) { 
b64str = b64EncodeUnicode(b64str); 
var byteStr = atob(b64str); 
var bytes = new Uint8Array(byteStr.length); 
for (var i = 0; i < byteStr.length; i++) { 
    bytes[i] = byteStr.charCodeAt(i); 
} 
return bytes.buffer; 
} 


function b64EncodeUnicode(str) { 
    return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) { 
     return String.fromCharCode('0x' + p1); 
    })); 
} 

答えて

1

あなたは、RSA-OAEP秘密鍵で暗号化することはできません。この問題は、インポート時に鍵の使用にencryptタグを設定したことが原因です。

はwebcrypto仕様、機能base64StringToArrayBuffer

b64str = b64EncodeUnicode(b64str); 
var byteStr = atob(b64str); 

PEMは、機能b64EncodeUnicodeがコンテンツをBASE64符号化されたコード化されている正しくない

更新区画22.4 https://w3c.github.io/webcrypto/Overview.html#rsa-oaep

If the [[type]] internal slot of key is not "public", then throw an InvalidAccessError.

を参照します二度。

再び(注:ヘッダを使用せずに)RSA-OAEPキー、輸出、PEMへのエンコード、デコードおよびインポートを生成するための完全な例が含まれていることをここhttps://stackoverflow.com/a/38714970/6371459を私の答えを参照してください

に次の2行を交換してください
function b64DecodeUnicode(str) { 
    return decodeURIComponent(Array.prototype.map.call(atob(str), function(c) { 
     return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); 
    }).join('')); 
} 
+0

ええと、秘密鍵のキースロットは復号化されるべきですか? – urb

+0

はい、そうです。キーの使用法を設定する '[" decrypt "]' – pedrofb

+0

データエラーを返します。 – urb

関連する問題