26

私はRSAを使用して、Androidでユーザー名とパスワードを暗号化し、サーバー(tomcat 6、java 1.6)で復号化します。Android暗号化:

    PublicKey pubKey = readPublicKeyFromFile(mod, ex);
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.ENCRYPT_MODE, pubKey);
    byte[] cipherData = cipher.doFinal(data);
    return cipherData;

Java Tomcatの復号化:

    PrivateKey pubKey = readPrivateKeyFromFile(mod, ex);
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.DECRYPT_MODE, pubKey);
    byte[] cipherData = cipher.doFinal(data);
    return cipherData;

androidの部分OUTSIDEandroid(mainメソッドだけで)を使用すると、正常に動作します。しかし、私のアンドロイド(エミュレーター)の中にはありません。サーバー側では、次のエラーが発生します。

javax.crypto.BadPaddingException: Blocktype mismatch: 0
    at sun.security.rsa.RSAPadding.unpadV15(RSAPadding.java:311)
    at sun.security.rsa.RSAPadding.unpad(RSAPadding.java:255)
    at com.sun.crypto.provider.RSACipher.a(DashoA13*..)
    at com.sun.crypto.provider.RSACipher.engineDoFinal(DashoA13*..)
    at javax.crypto.Cipher.doFinal(DashoA13*..)

modとexをBigIntegers定数として保持しているので、ファイルに書き込みません。java1.6とjava1.5の暗号化には違いがあることを知っているので、どちらもjava1.6でコンパイルされます。

いくつかのデバッグ情報:

Androidでのデバッグ中に、pubKeyに16進数のモジュラスと指数が含まれていることがわかります。また、メインメソッド(同じコード)でデバッグすると、pubKeyに10進数のモジュラスと指数が含まれていることがわかります。

私は何が間違っているのですか?

ありがとう

4

3 に答える 3

43

Android 2.2以降でRSA Encryptを実行し、Tomcat 6 Java 1.6サーバーで復号化します。

私はこの正確な問題を抱えていて、あちこちを読んでいました.@Femiの答えのおかげで、必要なものに出くわしました。

解決策は、Cipher に次のアルゴリズム仕様を使用することでした。

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

これは、Android スマートフォンと BlackBerry スマートフォンの両方から暗号化を行うことで機能します。質問が出されてから 4 か月が経過していることは承知していますが、念のため、他の誰かがこの問題に遭遇した場合に備えて。

于 2011-10-13T21:00:10.893 に答える
12

特定の暗号の初期化を使用することをお勧めします。例として、

Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding");

両方で動作します。デフォルトの暗号初期化パディングがデスクトップ JVM と Android JVM で異なるように見えるため、取得している例外 ( BadPaddingException ) が発生しています。

于 2011-05-23T08:32:44.060 に答える
1

まず、公開鍵で両方の暗号を初期化しているようです。暗号化には公開鍵、復号化には秘密鍵を使用します。それが単なるタイプミスであることを願っています。

RSA 暗号化に関しても、多くの問題があり、試行錯誤の連続でした。別のプロバイダを試すことをお勧めします。BouncyCastle を使用して RSA を実装することができました。

Cipher wrapper = Cipher.getInstance("RSA", "BC");
wrapper.init(Cipher.ENCRYPT_MODE, publicKey);
encryptedData= wrapper.doFinal(unencryptedData);

ただし、これはセッション暗号化であるため、独自のキーペアを生成しました。

kpg = KeyPairGenerator.getInstance("RSA");
        kpg.initialize(1024);
        KeyPair kp = kpg.genKeyPair();
        publicKey = kp.getPublic();
        privateKey = kp.getPrivate();
于 2011-05-23T08:15:52.383 に答える