2016-01-17 18 views
5

私は、RSA鍵ペアをjavascriptで生成し、公開鍵をサーバ側のデータベースに(文字列として)格納し、 Javaのサーバ側では、格納されている公開鍵で文字列を暗号化し、それをクライアント側に送信します。クライアント側では、その文字列を秘密鍵で復号化します。RSA Java暗号化とNode.js復号化が機能していない

クライアントブラウザでbrowsifiedバージョンの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); 

そして、それうまく動作し、Base64では、私はそれをで文字列を解読しようとするこの

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

のように暗号化された文字列をエンコードされた私を返し

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

でテキストを暗号化しますクライアント側

まず、ノード-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での暗号化を解除しようとする。これは、問題が発生した場合には、JavaScriptを有効にしてエラー

Uncaught Error: Error during decryption (probably incorrect key). Original error: Error: Error decoding message, the lHash calculated from the label provided and the lHash in the encrypted data do not match.(…) However i have tested that if i encrypt and decrypt the text just within javascript, it works just fine. This makes me think that it's some difference between the way i encrypted it at java and how it's done at javascript

は、誰もがそのI間違いを指摘でしスローで暗号化された文字列に

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

をエンコードここで作られた?

答えて

4

私は解決策を見つけました。それは暗号化方法の違いでした。

は、私はちょうどノード-RSA

に一致するように

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

代わりの

Cipher.getInstance("RSA"); 

で暗号を初期化しなければなりませんでした