2017-04-06 13 views
4

これはthis answered questionの重複かもしれませんが、私は同じ結果を得ることはできません。ここでいくつかの指導を願っています。RSAはJSEncryptを使用して暗号化し、BouncyCastle(Java)を使用して解読します

JSEncrypt(クライアント)

let encrypt = new Encrypt.JSEncrypt(); 
encrypt.setPublicKey(this.publicKey); // retrieved from server 
encrypt.encrypt(password); 

はBouncyCastle(サーバー) - RSAキーの生成

KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA"); 
generator.initialize(1024); 
KeyPair pair = generator.generateKeyPair(); 
PublicKey pubKey = pair.getPublic(); 
PrivateKey privKey = pair.getPrivate(); 

// returned to client 
String publicKeyStr = new String(Base64.encodeBase64(pubKey.getEncoded())); 
String privateKeyStr = new String(Base64.encodeBase64(privKey.getEncoded())); 

はBouncyCastle(サーバー) - 復号

Cipher cipher = Cipher.getInstance("RSA/None/PKCS1Padding"); 
cipher.init(Cipher.DECRYPT_MODE, privateKey); 
// org.apache.commons.codec.binary.Hex 

byte[] cipherText = cipher.doFinal(Hex.decodeHex(encrypted.toCharArray())); 
decrypted = new String(cipherText, BaseConstant.ENC_UTF8); 

エラー

org.apache.commons.codec.DecoderException:インデックス0の不正な16進文字I at org.apache.commons.codec.binary.Hex.toDigit(Hex.java:178) at org.apache.commons.codec .binary.Hex.decodeHex(Hex.java:89)

サーバ側での暗号化は256

答えを生成しながら、私が気づいたことの一つは、172あるJSEncrypt、によって暗号化されたテキストの長さであります既に設定していたRSA/None/PKCS1Paddingを使うように質問されました。他に何が欠けていますか?

+0

例外は復号化とは関係ありません。例外はHex.decodeHex()によってスローされました – Egl

+1

ありがとう、しかし@Hugoによって提供された解決策は – acys

答えて

2

Hex.decodeHex()メソッドでエラーが発生します。これは、データが16進数でエンコードされた文字列ではないことを意味します。

JSEncrypt.encrypt()メソッドは、(16進文字列ではなく)Base64で暗号化されたデータを返します。解読するためには、それをbase64形式から解読する必要があります。

ので、代わりの:

byte[] cipherText = cipher.doFinal(Hex.decodeHex(encrypted.toCharArray())); 

はこれを行います。

byte[] cipherText = cipher.doFinal(Base64.decodeBase64(encrypted.toCharArray())); 
+0

Super!これは動作します! – acys

+1

素晴らしい!それが働いて、あなたが有用であると分かったなら、あなたは回答をアップヴォートしたり受け入れたりすることができます(良い練習ではありませんが、それは必須ではありません) –

+1

私はupvotingを試みましたが、十分な評判ポイントがないと言います:( – acys

関連する問題