10

私はAndroidアプリとスタンドアロンのJavaアプリで以下を使用しています:

private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {
    SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
    byte[] encrypted = cipher.doFinal(clear);
    ...

Android とスタンドアロンの Java アプリで異なる暗号化文字列を取得します (両方とも同じコードとキーを使用します)。この質問と同じ例外 (javax.crypto.BadPaddingException: Blocktype mismatch: 0) が発生します。

RSA 暗号化: Java と Android の違い

推奨される解決策は、次のようなパディング戦略を指定することです。

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

しかし、「RSA」ではなく「AES」を使用しており、AES と組み合わせてパディングを指定する方法がわかりません。その場合、Cipher.getInstance() に渡される文字列をどのように構築すればよいでしょうか? 私はこれを試してみました:

Cipher cipher = Cipher.getInstance("AES/PKCS1Padding");

しかし、それが無効であるという例外が発生します。

ありがとう

4

3 に答える 3

4

簡潔な答え:

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

長い答え

于 2013-02-04T21:57:41.387 に答える
2

これが私がやった方法です:

keyGenerator.init(new
                KeyGenParameterSpec.Builder(KEY_NAME,
                KeyProperties.PURPOSE_ENCRYPT |
                        KeyProperties.PURPOSE_DECRYPT)
                .setBlockModes(KeyProperties.BLOCK_MODE_CBC)
                .setUserAuthenticationRequired(true)
                .setEncryptionPaddings(
                        KeyProperties.ENCRYPTION_PADDING_PKCS7)
                .build());

cipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/" + KeyProperties.BLOCK_MODE_CBC + "/" + KeyProperties.ENCRYPTION_PADDING_PKCS7);
于 2017-02-24T09:34:16.503 に答える