RSA Javaencryption和Node.js解密不起作用

我有一个系统需要在javascript中生成RSA密钥对,然后将公钥存储在服务器端的数据库中(作为string),然后在Java中的服务器端将使用存储的公共密钥encryptionstring密钥并发送到客户端,用私钥解密string。

我在客户端浏览器上使用节点rsa的browsified版本。

首先在客户端,我生成一个密钥对并导出密钥,将它们存储为string

var NodeRSA = require('node-rsa'); var key = new NodeRSA({b: 1024}); key.exportKey("pkcs8-private"); key.exportKey("pkcs8-public-pem"); 

导出的私钥存储在服务器的客户端和公共端

接下来,我用java来encryption一个接收到公钥的string,所以我把pkcs8公钥parsing成一个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); 

并用它encryption文本

 byte[] cipherText; Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, pk); cipherText = cipher.doFinal("Hello World!".getBytes()); return Base64.encodeBase64String(cipherText); 

这很好地工作,并返回我这样一个Base64编码的encryptionstring

 WTS1J2f4w5icsUOCtulyHDaBmB5lN7D8mnj0QWMDBkUGiPHkM8nHVx9pd0MtbQAQNasQS2X8kisLMYyEMPasFZtDH0zX1e8lNYaW0xMKsg++ge87f+95nl+TmxDy6S1m7Ce/n0wXno+0MbSv8YsJtsUcAleyyfQX2bxqX8u7Gjs= 

然后我尝试解密它在客户端的string

首先我重新导入存储在节点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编码的encryptionstring

 key.decrypt("<Base64 Encoded Encrypted>", 'utf-8'); 

这是问题发生的地方,JavaScript引发这个错误

未捕获错误:解密期间出错(可能是不正确的键)。 原来的错误:错误:错误解码消息,从提供的标签计算出来的lHash和encryption数据中的lHash不匹配(…)然而,我已经testing,如果我encryption和解密文本只是在JavaScript,它的工作就好。 这使我认为这是我在java上encryption的方式和在javascript中完成的方式之间的区别

任何人都可以指出我在这里所犯的错误吗?

哦,我find了解决scheme。 这是在encryption方法的差异。

我只需要初始化密码

 Cipher.getInstance("RSA/ECB/OAEPWithSHA1AndMGF1Padding"); 

代替

 Cipher.getInstance("RSA"); 

匹配node-rsa