2016-12-29 16 views
3

Я использую службу, разработанную на Java в приложении AngularJS. Эта служба возвращает мне байты открытого ключа RSA. Мне нужно установить ключ через байты в JavaScript. В итоге мне нужно сделать в JavaScript, что делается в Java, как показано ниже:Как загрузить PublicKey RSA из байтов с помощью JavaScript

public static PublicKey loadPublicKey(String stored){ 
    byte[] data = Base64.decode(stored); 
    X509EncodedKeySpec spec = new X509EncodedKeySpec(data); 
    KeyFactory fact = KeyFactory.getInstance("RSA"); 
    return fact.generatePublic(spec); 
} 

Может кто-нибудь мне помочь?

ответ

3

Вы можете использовать стандартный javascript WebCryptographyApi, чтобы импортировать открытый ключ для шифрования или подтвердить подпись. Вы должны установить алгоритм и разрешенные операции в зависимости от использования ожидаемого ключа.

Шифрование

//Convert the public key in base 64 (DER encoded) to array buffer 
var publicKeyAB = str2ab(atob(publicKeyB64)); 

//import key to encrypt with RSA-OAEP 
crypto.subtle.importKey(
    "spki",  
     publicKeyAB, 
     { name: "RSA-OAEP", hash: {name: "SHA-256"}}, 
     false, 
     ["encrypt"]) 
.then(function(key){ 
    //do something with the key    
}).catch(function(err) { 
    console.log(err); 
}); 

Проверка подписи

//Convert the public key in base 64 (DER encoded) to array buffer 
var publicKeyAB = str2ab(atob(publicKeyB64)); 

//import the key to verify RSA signature with SHA 256 
crypto.subtle.importKey(
    "spki",  
     publicKeyAB, 
     {name: 'RSASSA-PKCS1-v1_5', hash: { name: 'SHA-256' }}, 
     false, 
     ["verify"]) 
.then(function(key){ 
    //do something with the key    
}).catch(function(err) { 
    console.log(err); 
}); 

функции Подсобные

function str2ab(str) { 
    var arrBuff = new ArrayBuffer(str.length); 
    var bytes = new Uint8Array(arrBuff); 
    for (var iii = 0; iii < str.length; iii++) { 
    bytes[iii] = str.charCodeAt(iii); 
    } 
    return bytes; 
} 

См м примеры руды here