6

秘密の pem キー ファイルがあり、そのファイルを使用してデータの署名と暗号化を行っています。署名は正常に機能し、別のプラットフォームでも検証できますが、データの暗号化中に次のエラーが発生します。

04-04 09:55:51.821: E/AndroidRuntime(2725): FATAL EXCEPTION: Thread-102
04-04 09:55:51.821: E/AndroidRuntime(2725): java.lang.ArrayIndexOutOfBoundsException: too much data for RSA block
04-04 09:55:51.821: E/AndroidRuntime(2725):     at com.android.org.bouncycastle.jce.provider.JCERSACipher.engineDoFinal(JCERSACipher.java:457)
04-04 09:55:51.821: E/AndroidRuntime(2725):     at javax.crypto.Cipher.doFinal(Cipher.java:1106)
04-04 09:55:51.821: E/AndroidRuntime(2725):     at com.example.testsigning.MainActivity.rsaEncrypt(MainActivity.java:185)
04-04 09:55:51.821: E/AndroidRuntime(2725):     at com.example.testsigning.MainActivity$1.run(MainActivity.java:51)
04-04 09:55:51.821: E/AndroidRuntime(2725):     at java.lang.Thread.run(Thread.java:856)

以下は、プライベート ファイルからキーを抽出するためのコード スニペットです。

// Read the file into string
String privKeyPEM = readFile("/mnt/sdcard/rsa_key");

privKeyPEM = privKeyPEM.replace("-----BEGIN RSA PRIVATE KEY-----", "");
privKeyPEM = privKeyPEM.replace("-----END RSA PRIVATE KEY-----", "");

// Base64 decode the data
byte[] encoded = Base64.decode(privKeyPEM, Base64.DEFAULT);

// PKCS8 decode the encoded RSA private key
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded);
KeyFactory kf = KeyFactory.getInstance("RSA");
mPrivKey = kf.generatePrivate(keySpec);

RSAPrivateCrtKey privk = (RSAPrivateCrtKey) mPrivKey;

RSAPublicKeySpec pubKeySpec = new java.security.spec.RSAPublicKeySpec(
        privk.getPublicExponent(), privk.getModulus());

mPubKey = kf.generatePublic(pubKeySpec);

以下は、データを暗号化するためのコード スニペットです。

Cipher cipher = Cipher.getInstance("RSA/None/OAEPWithSHA1AndMGF1Padding", "BC");
cipher.init(Cipher.ENCRYPT_MODE, mPubKey);
return cipher.doFinal("Hello World".getBytes()); // here is the problem

問題を解決するための助けをいただければ幸いです。

よろしく、ユヴィ

4

3 に答える 3

1

問題は、秘密鍵から公開鍵を取得することにありました。次のようになります。

RSAPublicKeySpec pubKeySpec = new java.security.spec.RSAPublicKeySpec(
                privk.getModulus(), privk.getPublicExponent());

それ以外の :

RSAPublicKeySpec pubKeySpec = new java.security.spec.RSAPublicKeySpec(
        privk.getPublicExponent(), privk.getModulus());
于 2013-04-04T13:08:17.220 に答える
0

このエラー メッセージは、入力バッファが暗号の入力ブロック サイズより大きい場合に発生します。これほど短い入力文字列の場合はそうはなりそうにないので、最初に確認するのは前の行です。暗号が適切に初期化されていないか、例外がスローされていないため、期待どおりではないと思います。呼び出し後に暗号オブジェクトのデバッグ出力を行うことから始めinit()ます。

于 2013-04-04T12:56:02.770 に答える