次のようなメッセージを暗号化/復号化します:文字列の暗号化->base64エンコードバイト->文字列のシリアル化->文字列の逆シリアル化->b64のデコード->バイトの復号化。
暗号化は次のようになります。
PublicKey pubKey = readPublicKey();
Cipher cipher;
cipher = Cipher.getInstance(CRYPTO_ALG);
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
byte[] cipherData;
cipherData = cipher.doFinal(message.getBytes());
return cipherData;
復号化は次のように行われます。
PrivateKey pk = readPrivateKey();
Cipher cipher = Cipher.getInstance(CRYPTO_ALG);
cipher.init(Cipher.DECRYPT_MODE, pk);
return new String(cipher.doFinal(data));
キーは次のように読み取られます。
ObjectInputStream oin =
new ObjectInputStream(new BufferedInputStream(is));
BigInteger m = (BigInteger) oin.readObject();
BigInteger e = (BigInteger) oin.readObject();
RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(m, e);
KeyFactory fact = KeyFactory.getInstance("RSA");
PrivateKey privKey = fact.generatePrivate(keySpec);
return privKey;
ここではb64のものを省略しましたが、問題がそのコードに影響を与えないことを確認しました。
今起こっていることは、私が実際に正しい答えを得るということですが、それはバイナリのジブリッシュが前に付けられています。「TESTDATA」を暗号化すると、TESTDATAが取得されます。コードはプレーンJavaでは正常に機能しますが、Androidでは失敗します。誰かがこれを修正する方法を知っていますか?
編集:RSA / NONE/NoPaddingを使用した暗号化/復号化は役に立たないようです。また、プレーンJREではorg.bouncycastleを使用します。