2017-01-10 8 views
2

Я использую веб-Crypto, более конкретно эти примеры: https://github.com/diafygi/webcrypto-examples/#rsa-oaepшифровать и дешифровать с RSA OAEP

Моя главная цель состоит в том, чтобы зашифровать строку с моим открытым ключом и расшифровать его с моим секретным ключом.

Шифрование с открытым ключом работает хорошо, но когда я пытаюсь расшифровать зашифрованную строку с помощью закрытого ключа, она возвращает следующую ошибку: OperationError и пустую строку.

Я использую следующие функции:

function encryptDataWithPublicKey(data, key) { 
    data = stringToArrayBuffer(data); 
    return window.crypto.subtle.encrypt(
    { 
     name: "RSA-OAEP", 
     //label: Uint8Array([...]) //optional 
    }, 
    key, //from generateKey or importKey above 
    data //ArrayBuffer of data you want to encrypt 
); 
} 


function decryptDataWithPrivateKey(data, key) { 
    data = stringToArrayBuffer(data); 
    return window.crypto.subtle.decrypt(
     { 
      name: "RSA-OAEP", 
      //label: Uint8Array([...]) //optional 
     }, 
     key, //from generateKey or importKey above 
     data //ArrayBuffer of data you want to encrypt 
    ); 
} 

function stringToArrayBuffer(str){ 
    var buf = new ArrayBuffer(str.length); 
    var bufView = new Uint8Array(buf); 
    for (var i=0, strLen=str.length; i<strLen; i++) { 
     bufView[i] = str.charCodeAt(i); 
    } 
    return buf; 
} 

UPDATE

var data = "example"; 
encryptDataWithPublicKey(data, publicKey).then((result) => { 
    var rdata = arrayBufferToString(result); 
    return decryptDataWithPrivateKey(rdata, privateKey).then((result) => { 
     var result = arrayBufferToString(result); 
    }); 
}); 

function arrayBufferToString(str){ 
    var byteArray = new Uint8Array(str); 
    var byteString = ''; 
    for(var i=0; i < byteArray.byteLength; i++) { 
     byteString += String.fromCodePoint(byteArray[i]); 
    } 
    return byteString; 
} 
+1

вы говорите, шифрование данных, то расшифровка ... Вам 've показал функции, которые делают это, но вы не показывали **, как ** вы их используете, возможно, вы используете их неправильно (то есть, что вы делаете с возвращаемым значением из ваших функций шифрования/дешифрования) –

+0

EncryptDataWithPublicKey работает хорошо, но я не могу расшифровать его с помощью другой функции. Я не понимаю, почему. – urb

+0

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

ответ

2

код включен в ваш вопрос правильно, так что этот вопрос будет находиться в скрытой части. Я просто добавил window.crypto.subtle.generateKey в код для генерации ключей RSA-OAEP и работаю

Пожалуйста, обратите внимание на полный пример

function stringToArrayBuffer(str){ 
    var buf = new ArrayBuffer(str.length); 
    var bufView = new Uint8Array(buf); 
    for (var i=0, strLen=str.length; i<strLen; i++) { 
     bufView[i] = str.charCodeAt(i); 
    } 
    return buf; 
} 

function arrayBufferToString(str){ 
    var byteArray = new Uint8Array(str); 
    var byteString = ''; 
    for(var i=0; i < byteArray.byteLength; i++) { 
     byteString += String.fromCodePoint(byteArray[i]); 
    } 
    return byteString; 
} 

function encryptDataWithPublicKey(data, key) { 
    data = stringToArrayBuffer(data); 
    return window.crypto.subtle.encrypt(
    { 
     name: "RSA-OAEP", 
     //label: Uint8Array([...]) //optional 
    }, 
    key, //from generateKey or importKey above 
    data //ArrayBuffer of data you want to encrypt 
); 
} 


function decryptDataWithPrivateKey(data, key) { 
    data = stringToArrayBuffer(data); 
    return window.crypto.subtle.decrypt(
     { 
      name: "RSA-OAEP", 
      //label: Uint8Array([...]) //optional 
     }, 
     key, //from generateKey or importKey above 
     data //ArrayBuffer of data you want to encrypt 
    ); 
} 


window.crypto.subtle.generateKey(
    { 
     name: "RSA-OAEP", 
     modulusLength: 2048, 
     publicExponent: new Uint8Array([0x01, 0x00, 0x01]), 
     hash: {name: "SHA-256"} 
    }, 
    true, 
    ["encrypt", "decrypt"] 
).then(function(keyPair) { 

    var data = "example"; 
    encryptDataWithPublicKey(data, keyPair.publicKey).then((result) => { 
     var rdata = arrayBufferToString(result); 
     return decryptDataWithPrivateKey(rdata, keyPair.privateKey).then((result) => { 
      var result = arrayBufferToString(result); 
      console.log(result); 
     }); 
    }); 
}).catch (function (err){ 
    console.log(err); 
}); 

 Смежные вопросы

  • Нет связанных вопросов^_^