加密和解密使用RSA OAEP
问题描述:
我使用网络加密,更具体的这些例子: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;
}
答
包含在你的问题中的代码是正确的,那么这个问题将在隐藏部分。我只是说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);
});
你说你是对数据进行加密,然后解密吧...你已经显示了这样做的函数,但是你没有显示**你如何使用它们 - 也许你正在使用它们(例如,你对加密/解密函数的返回值做什么) –
encryptDataWithPublicKey效果很好,但我无法用其他功能解密。我不明白为什么。 – urb
是的,所以你已经在问题中说过了......但我要求你展示**你如何使用你的函数,因为我怀疑你做错了,我没有要求这样浪费你的时间,任何东西 –