1

Javaで単純な暗号化/復号化文字列クラスを作成し、テストしました。それは正常に動作します。現在、Androidデバイスで文字列を暗号化し、サーバーに送信して復号化しようとしています。すべて同じカスタム クラスを使用します。なぜこれが機能しないのですか?単にサポートされていないのですか?この目的で文字列を簡単に暗号化/復号化するには、他に何ができますか? Base64 は受け入れられません:)

package crypto;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;


public class Crypto {
    public static byte[] encrypt(String message) throws Exception
    {
        String symmetricKey = "25Ae1f1711%z1 )1";
        SecretKeySpec aesKey = new SecretKeySpec(symmetricKey.getBytes(), "AES");
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding", "SunJCE");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        return cipher.doFinal(message.getBytes());
    }
    public static String decrypt(byte[] encryptedMessage) throws Exception
    {
        String symmetricKey = "25Ae1f1711%z1 )1";
        SecretKeySpec aesKey = new SecretKeySpec(symmetricKey.getBytes(), "AES");
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding", "SunJCE");
        cipher.init(Cipher.DECRYPT_MODE, key);
        return new String(cipher.doFinal(encryptedMessage));
    }
}

logcat では、次の例外ポップアップが表示されます: java.security.NoSuchProviderException: Provider not avalible: SunJCE

指定したプロバイダ「SunJCE」を行から削除しました。

Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding", "SunJCE");

ここでこれに対する解決策を見つけました

代わりに、サーバー側でこのエラーが発生します。

javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:750)
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:676)
    at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:317)
    at javax.crypto.Cipher.doFinal(Cipher.java:1813)
    at crypto.Crypto.decrypt(Crypto.java:20)
    at io.network.UDPServer.run(UDPServer.java:37

BCで試しましたが、まだ同じエラーがあります

4

4 に答える 4

2

これは、セキュリティ プロバイダーによって異なります。Android と JVM ではデフォルトが異なり、すべての Sun/Oracle アルゴリズムが Android にも存在するわけではありません。

私はほぼ同じ問題を抱えていて、バウンスキャッスル(BC)に切り替えることで解決していました。それは両側に存在し、まったく同じメーターで機能しています。

両側の変換として「RSA/ECB/PKCS1Padding」を使用しています。そしてその働き。

于 2013-07-29T13:54:33.533 に答える
2

コードは、Oracle 以外の Java VMでは実行されません。その理由は、「SunJCE」と呼ばれる特定の暗号化プロバイダーを要求するためです。これは、Oracle (以前の Sun) からの JCE API の参照実装です。

要求されたアルゴリズムを処理できる任意のプロバイダーを受け入れるようにコードを変更するだけです。

Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");

于 2013-07-29T13:56:50.030 に答える