当前位置: 首页 > 知识库问答 >
问题:

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

翟嘉祥
2023-03-14

我目前正在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函数来解密文本。假设“rsoaepciphertext”是字符串文本。

Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPPadding");
OAEPParameterSpec oaepParams = new OAEPParameterSpec("SHA-256", "MGF1", new MGF1ParameterSpec("SHA-256"), PSource.PSpecified.DEFAULT);
cipher.init(Cipher.DECRYPT_MODE, getPrivateKey(), oaepParams);
return new String(cipher.doFinal(Base64.decodeBase64(rsaOaepCipherText)), "UTF-8");

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

共有1个答案

鱼阳伯
2023-03-14

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

应该是这样的

encryptDataWithPublicKey(text, publicKey).then((result) => {
   var rdata = arrayBufferToString(result);
   var rResult = window.btoa(rdata);
   resolve(rResult);
});
 类似资料:
  • 我试图用JavaScript加密一个短字符串,用Java解密它。解密失败,我认为这是因为两个平台之间的块模式和/或填充不同。我尝试在Java和JavaScript中加密相同的字符串,结果不同,这表明确实存在差异。以下是创建键的Java代码: 这是我用来测试加密的Java代码: 我将公钥发送到JavaScript进程,并将其转换为ArrayBuffer,变量名为publicKey。我已经验证了Jav

  • 我使用的是Web加密,更具体地说,这些示例是:https://github.com/diafygi/webcrypto-examples/#rsa-oaep 更新

  • 我正在尝试使用java对用户电子邮件id进行RSA加密,并尝试使用php进行解密。但我没有成功。以下是详细信息 java中的源代码: 私钥: RSA 加密输出: 和Bas64编码输出: php解密代码 php输出返回none。。。

  • 问题内容: 我想用RSA加密对String进行加密。我的公钥/私钥已生成并存储在DB中。在android中,我使用以下代码: 出于调试目的,我尝试使用相同的参数调用此方法两次,并且String结果相似(符合预期)。 我想在Java中生成相同的加密字符串。但是,“ android.util.Base64”类在Java中不可用,因此我尝试使用默认的Base64类: 但是Android中生成的Strin

  • 我有一条在java上使用以下代码加密的kafka消息: 现在我正在尝试在我已经知道私钥的解码消息上使用python对其进行解码。我尝试使用(因为我使用的是python3和仅适用于2. x)像在他们的文档中一样使用此代码,但它不起作用: 我得到了这个错误代码:我试图寻找一种方法使私钥成为JWK对象,但找不到。 我知道我的消息是JWE,因为它被4个点分割,当我对第一部分进行base64解码时,我得到了

  • 问题内容: 我有一个现有的网络服务,可以使用AES进行加密和解密,现在我必须以与Java相同的方式进行加密,但是要使用javascript。我已经阅读了有关在javascript中执行此操作的所有主题,但尚未找到任何有用的解决方案。Javascript总是以不同的方式加密,我找不到原因。 这是现有的java代码: 这是我倾向于使用的javascript代码,但是提供了不同的加密(CryptoJS)