我正试图在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进程,并将其转换为一个名为publicKey
的ArrayBuffer。通过使用crypto.subtle.exportKey
导出并检查字节,我已经验证了JavaScript端上的密钥与Java端上的密钥匹配。以下是我用于测试加密的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端的参数以及JavaScript端的和参数。是否有任何设置可以使用内置类在Java和JavaScript之间工作?或者我应该看第三方库(例如Bouncy Castle)?