使用Java和JavaScript之间的OAEP进行RSA加密

问题描述 投票:0回答:1

我试图在JavaScript中加密一个短字符串并用Java解密它。解密失败,我认为这是因为两个平台之间的块模式和/或填充不同。我尝试在Java和JavaScript中加密相同的字符串,并得到不同的结果,这表明确实存在差异。以下是创建密钥的Java代码:

KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(1024);
KeyPair keyPair = kpg.generateKeyPair();

这是我用来测试加密的Java代码:

Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());
byte[] bytes = cipher.doFinal("asdf".getBytes());

我将公钥发送到JavaScript进程,并将其转换为ArrayBuffer,变量名为publicKey。我已经验证了JavaScript端的密钥与Java端的密钥匹配(通过crypto.subtle.exportKey导出并检查字节)。这是我用来测试加密的JavaScript代码:

crypto.subtle.importKey('spki', publicKey,
                        {hash: 'SHA-256', name: 'RSA-OAEP'}, true,
                        ['encrypt'])
      .then((key) => {
        crypto.subtle.encrypt({name: 'RSA-OAEP'}, key,
                              new TextEncoder().encode('asdf'))
              .then((buffer) => {

              });
      });

Java中的字节数组和JavaScript中的数组缓冲区的内容不尽相同。我不确定的设置是Java端的Cipher#getInstance参数和JavaScript端的importKeyencrypt的参数。是否有任何设置可以使用内置类在Java和JavaScript之间工作?或者我应该看看第三方图书馆(例如,Bouncy Castle)?

javascript java encryption rsa
1个回答
0
投票

看起来JavaScript和Java中的内置加密/解密没有RSA加密的兼容设置。一个可行的解决方案似乎是来自github(forge on github)的伪造库。关键设置在github页面上描述如下(RSA examples):

// encrypt data with a public key using RSAES-OAEP/SHA-256/MGF1-SHA-1
// compatible with Java's RSA/ECB/OAEPWithSHA-256AndMGF1Padding
var encrypted = publicKey.encrypt(bytes, 'RSA-OAEP', {
  md: forge.md.sha256.create(),
  mgf1: {
    md: forge.md.sha1.create()
  }
});
© www.soinside.com 2019 - 2024. All rights reserved.