【发布时间】:2017-05-24 09:50:24
【问题描述】:
我正在使用 Web Crypto,更具体地说,这些示例:https://github.com/diafygi/webcrypto-examples/#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;
}
更新
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;
}
【问题讨论】:
-
你说你正在加密数据,然后解密它......你已经展示了这样做的功能,但你没有展示如何你使用它们 -也许你用错了(即你对加密/解密函数的返回值做了什么)
-
encryptDataWithPublicKey 运行良好,但我无法使用其他函数对其进行解密。我不明白为什么。
-
是的,所以你已经在问题中说过......但我要求你展示如何你正在使用你的功能,因为我怀疑你做错了,我没有要求这个浪费你的时间或任何东西
-
是的,我感觉问题出在 arrayBufferToString 和 stringToArrayBuffer 转换中......但我无法解决
-
大多数系统将密文从原始字节编码为十六进制或 Base64 编码,以实现可传输性和稳定性(您将获得像
54686973206973206120706c61696e74657874206d6573736167652e0a或 @987654326 这样的“安全”字符串@)。然后在解密原始字节之前解码该字符串。
标签: javascript encryption cryptography rsa webcrypto-api