2016-10-28 3 views
2

Я использую WebCrypto с RSASSA-PKCS1-v1_5 (https://github.com/diafygi/webcrypto-examples#rsassa-pkcs1-v1_5---sign), и мне нужно экспортировать открытый ключ в формат PEM, используя код javascript.Экспорт ключа webcrypto в формат PEM

В документации говорится, что можно экспортировать ключ таким образом: https://github.com/diafygi/webcrypto-examples#rsassa-pkcs1-v1_5---exportkey , но мне нужен другой формат.

Любая идея?

Заранее спасибо.

С уважением

ответ

4

Экспорт открытого ключа в spki

window.crypto.subtle.exportKey("spki",keys.publicKey); 

и преобразовывать полученный буфер массива в base64 добавляя заголовки PEM -----BEGIN PUBLIC KEY----- и -----END PUBLIC KEY-----. Ниже я приведу функцию spkiToPEM с полным примером

crypto.subtle.generateKey(
    { 
     name: "RSASSA-PKCS1-v1_5", 
     modulusLength: 2048, 
     publicExponent: new Uint8Array([0x01, 0x00, 0x01]), 
     hash: {name: "SHA-256"}, 
    }, 
    false, 
    ["sign", "verify"] 
).then(function(keys){  
    return window.crypto.subtle.exportKey("spki",keys.publicKey); 
}).then (function(keydata){ 
    var pem = spkiToPEM(keydata); 
    console.log(pem); 
}).catch(function(err){ 
    console.error(err); 
}); 

function spkiToPEM(keydata){ 
    var keydataS = arrayBufferToString(keydata); 
    var keydataB64 = window.btoa(keydataS); 
    var keydataB64Pem = formatAsPem(keydataB64); 
    return keydataB64Pem; 
} 

function arrayBufferToString(buffer) { 
    var binary = ''; 
    var bytes = new Uint8Array(buffer); 
    var len = bytes.byteLength; 
    for (var i = 0; i < len; i++) { 
     binary += String.fromCharCode(bytes[ i ]); 
    } 
    return binary; 
} 


function formatAsPem(str) { 
    var finalString = '-----BEGIN PUBLIC KEY-----\n'; 

    while(str.length > 0) { 
     finalString += str.substring(0, 64) + '\n'; 
     str = str.substring(64); 
    } 

    finalString = finalString + "-----END PUBLIC KEY-----"; 

    return finalString; 
} 
Смежные вопросы