2017-01-10 391 views
2

我使用網絡加密,更具體的這些例子: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

你說你是對數據進行加密,然後解密吧...你已經顯示了這樣做的函數,但是你沒有顯示**你如何使用它們 - 也許你正在使用它們(例如,你對加密/解密函數的返回值做什麼) –

+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); 
});