2

Android と Java サーブレット環境の両方で、弾む城の実装で AES 暗号化を使用しています。暗号化部分は両方のシナリオで問題ありません。ただし、同じテキストを同じキーで暗号化すると、これら 2 つのプラットフォームで異なる結果が得られます。

私の意図は、Android で暗号化を行い、Web 環境で復号化を行うことです。

これは、Android AES 実装に対して行った唯一の変更です。

    KeyGenerator kgen = KeyGenerator.getInstance("AES");
    SecureRandom sr = null;
    if (android.os.Build.VERSION.SDK_INT >= JELLY_BEAN_4_2) {
        sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");
    } else {
        sr = SecureRandom.getInstance("SHA1PRNG");
    }
    sr.setSeed(key);
    kgen.init(128, sr);
    SecretKey skey = kgen.generateKey();
    byte[] raw = skey.getEncoded();

上記では、Crypto を get インスタンスに追加するだけです。

海綿状の城の実装も使用して、これを達成できるかどうかを確認しました。それでも、Android と同じ結果が得られました。正しく読み込めたかどうかわかりません。これを API レベル 14 および 17 でテストしました。

これにより、javax.crypto.BadPaddingException: パッド ブロックが壊れています。

4

1 に答える 1

4

このスレッドを参照している人にとって、これは私がコードに加えた変更です。Android とサーバー環境で問題なく動作するようになりました。

回答は、

Android 4.2 で暗号化/復号化コードが破損し、提供されたソリューションが機能しない

ありがとう@kroot

    /* Store these things on disk used to derive key later: */
    int iterationCount = 1000;
    int saltLength = 32; // bytes; should be the same size as the output
                            // (256 / 8 = 32)
    int keyLength = 256; // 256-bits for AES-256, 128-bits for AES-128, etc
    byte[] salt = new byte[saltLength]; // Should be of saltLength

    /* When first creating the key, obtain a salt with this: */
    SecureRandom random = new SecureRandom();
    random.nextBytes(salt);

    /* Use this to derive the key from the password: */
    KeySpec keySpec = new PBEKeySpec(new String(key,
            Constants.CHAR_ENCODING).toCharArray(), key, iterationCount,
            keyLength);
    SecretKeyFactory keyFactory = SecretKeyFactory
            .getInstance("PBEWithSHA256And256BitAES-CBC-BC");
    byte[] keyBytes = keyFactory.generateSecret(keySpec).getEncoded();
    SecretKey secretKey = new SecretKeySpec(keyBytes, "AES");

    return secretKey.getEncoded();
于 2013-02-15T08:10:41.270 に答える