使用Java和JavaScript之间的OAEP进行RSA加密
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Java和JavaScript之间的OAEP进行RSA加密相关的知识,希望对你有一定的参考价值。
我试图在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端的importKey
和encrypt
的参数。是否有任何设置可以使用内置类在Java和JavaScript之间工作?或者我应该看看第三方图书馆(例如,Bouncy Castle)?
看起来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()
}
});
以上是关于使用Java和JavaScript之间的OAEP进行RSA加密的主要内容,如果未能解决你的问题,请参考以下文章
在 JavaScript 中解密 OAEP RSA(如 PHP 的 openssl_private_decrypt)
RSA OAEP、Golang 加密、Java 解密 -BadPaddingException:解密错误
使用RSASSA-PSS和RSAES-OAEP与MailKit
Bouncycastle和PKCS#1 v2.1,使用RSASSA-PSS进行签名并使用带有RSAES-OAEP的AES CBC进行加密