RSA Java 加密和 Node.js 解密不起作用
Posted
技术标签:
【中文标题】RSA Java 加密和 Node.js 解密不起作用【英文标题】:RSA Java encryption and Node.js decryption is not working 【发布时间】:2016-04-22 11:51:16 【问题描述】:我有一个系统需要在 javascript 中生成 RSA 密钥对,然后将公钥存储在服务器端的数据库中(作为字符串),然后在 Java 中的服务器端将使用存储的公钥并将其发送到客户端,客户端将使用私钥解密字符串。
我在客户端浏览器上使用浏览版的 node-rsa。
首先在客户端我生成一个密钥对并导出密钥,将它们存储为字符串
var NodeRSA = require('node-rsa');
var key = new NodeRSA(b: 1024);
key.exportKey("pkcs8-private");
key.exportKey("pkcs8-public-pem");
导出的私钥存储在客户端,公共存储在服务器端
接下来我使用 java 用收到的公钥加密一个字符串,所以我将 pkcs8 公钥解析为一个 Java PublicKey 对象。
String pubKey = "<Retrieved pkcs8 public key>";
pubKey = pubKey.replaceAll("(-+BEGIN PUBLIC KEY-+\\r?\\n|-+END PUBLIC KEY-+\\r?\\n?)", "");
byte[] keyBytes = Base64.decodeBase64(pubKey);
X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
KeyFactory kf = KeyFactory.getInstance("RSA");
PublicKey pk = kf.generatePublic(spec);
并用它加密文本
byte[] cipherText;
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, pk);
cipherText = cipher.doFinal("Hello World!".getBytes());
return Base64.encodeBase64String(cipherText);
这很好用,并返回一个像这样的 Base64 编码的加密字符串
WTS1J2f4w5icsUOCtulyHDaBmB5lN7D8mnj0QWMDBkUGiPHkM8nHVx9pd0MtbQAQNasQS2X8kisLMYyEMPasFZtDH0zX1e8lNYaW0xMKsg++ge87f+95nl+TmxDy6S1m7Ce/n0wXno+0MbSv8YsJtsUcAleyyfQX2bxqX8u7Gjs=
然后我尝试在客户端解密它的字符串
首先我重新导入 node-rsa 中存储的密钥
var NodeRSA = require('node-rsa');
var key = new NodeRSA();
key.importKey("<exported private key string>","pkcs8-private");
key.importKey("<exported public key string>","pkcs8-public-pem");
然后我尝试解密 Base64 编码的加密字符串
key.decrypt("<Base64 Encoded Encrypted>", 'utf-8');
这是问题发生的地方,javascript会抛出这个错误
未捕获的错误:解密期间出错(可能是不正确的密钥)。原始错误:错误:错误解码消息,根据提供的标签计算的lHash与加密数据中的lHash不匹配。(...) 但是我已经测试过,如果我只在 javascript 中加密和解密文本,它就可以正常工作。这让我觉得我在 java 中加密它的方式和在 javascript 中的加密方式有些不同
谁能指出我在这里犯的错误?
【问题讨论】:
【参考方案1】:哦,我找到了解决方案。这是加密方法的不同。
我只需要初始化密码
Cipher.getInstance("RSA/ECB/OAEPWithSHA1AndMGF1Padding");
而不是
Cipher.getInstance("RSA");
匹配node-rsa
【讨论】:
你能用NodeRsa做同样的加密吗? 仅此一项对我不起作用,我还必须添加密码初始化参数:cipher.init(Cipher.DECRYPT_MODE, privKey, new OAEPParameterSpec("SHA-1", "MGF1", MGF1ParameterSpec. SHA1, PSource.PSpecified.DEFAULT));以上是关于RSA Java 加密和 Node.js 解密不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Node.js 和 webcrypto 之间的 RSA 加密
Python 和 Golang 之间的 RSA 加密/解密不起作用? [关闭]