2017-01-08 3 views
2

CryptoKey를 PEM 스타일로 내 보낸 다음 다시 가져 오려고합니다. 나는 다음과 같은 코드를 사용하여 내 키를 생성 :웹 암호를 사용하여 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 콘텐츠를베이스 64 부호화 된 부호화된다 올바르지

UPDATED 섹션 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.

참조 두번.

이러한 두 줄을 바꾸기 : (사용 헤더없이 주)

여기에 다시 PEM, 디코딩 및 수입에 대한 RSA-OAEP 키, 수출, 인코딩을 생성하는 전체 예제를 포함 https://stackoverflow.com/a/38714970/6371459을 내 대답을 참조하십시오

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