Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript中的RSA-OAEP加密和Java中的解密_Javascript_Java_Encryption_Rsa - Fatal编程技术网

Javascript中的RSA-OAEP加密和Java中的解密

Javascript中的RSA-OAEP加密和Java中的解密,javascript,java,encryption,rsa,Javascript,Java,Encryption,Rsa,我目前正在Javascript上实现RSA-OAEP加密,并在Java上实现解密 我的javascript代码有以下内容 function stringToArrayBuffer(str){ var buf = new ArrayBuffer(str.length); var bufView = new Uint8Array(buf); for (var i=0, strLen=str.length; i<strLen; i++) {

我目前正在Javascript上实现RSA-OAEP加密,并在Java上实现解密

我的javascript代码有以下内容

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

var pem = Config.encryption.publicKey;

// fetch the part of the PEM string between header and footer
const pemHeader = "-----BEGIN PUBLIC KEY-----";
const pemFooter = "-----END PUBLIC KEY-----";
const pemContents = pem.substring(pemHeader.length, pem.length - pemFooter.length);               
// base64 decode the string to get the binary data
const binaryDerString = window.atob(pemContents);
// convert from a binary string to an ArrayBuffer
const binaryDer = stringToArrayBuffer(binaryDerString);
        
window.crypto.subtle.importKey(
                        "spki",
                        binaryDer,
                        {
                            name: "RSA-OAEP",
                            hash: { name: "SHA-256" }
                        },
                        true,
                        ["encrypt"]
                    ).then(function (publicKey) {
                        encryptDataWithPublicKey(text, publicKey).then((result) => {
                            var rdata = arrayBufferToString(result);
                            resolve(rdata);
                        });
                    }).catch(function (err) {
                        console.log(err);
                        reject(err);
                    });

然而,我在Java上不断遇到解密错误,目前仍停留在这一部分,我在Javascript上的加密是否有任何错误?

确定找到了。在发送到后端之前,我忘记在字符串中包含btoa

应该是

encryptDataWithPublicKey(text, publicKey).then((result) => {
   var rdata = arrayBufferToString(result);
   var rResult = window.btoa(rdata);
   resolve(rResult);
});
一个好主意是(即使您不需要)在相同的系统/语言上创建一个解密函数,以测试提供的凭据(密码、密钥、密文、算法…)并返回原始明文。对于您的问题,请提供一个示例数据集(PEM格式的私钥/公钥[带页眉/页脚行]、明文和加密密文)。
encryptDataWithPublicKey(text, publicKey).then((result) => {
   var rdata = arrayBufferToString(result);
   var rResult = window.btoa(rdata);
   resolve(rResult);
});