6

最近、BC 1.34 から 1.45 にアップグレードされました。以前にエンコードされたデータを次のようにデコードしています。

    SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.DECRYPT_MODE, skeySpec);
    byte[] decrypted = cipher.doFinal(encrypted);

BC 1.45 を使用すると、次の例外が発生します。

javax.crypto.BadPaddingException: pad block corrupted
 at org.bouncycastle.jce.provider.JCEBlockCipher.engineDoFinal(JCEBlockCipher.java:715)
 at javax.crypto.Cipher.doFinal(Cipher.java:1090)

編集: この問題の詳細。以下を使用して、パスフレーズから生のキーを生成しています。

    KeyGenerator kgen = KeyGenerator.getInstance("AES", "BC");
    SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");
    sr.setSeed(seed);
    kgen.init(128, sr);
    SecretKey skey = kgen.generateKey();
    byte[] raw = skey.getEncoded();

私が見つけたのは、これにより BC 1.34 と 1.45 の 2 つの異なる値が得られるということです。

また、BouncyCastle に関連していない可能性もあります (Android 2.3 でテストしています)。

4

3 に答える 3

6

私はこれを追跡し終えました。これは、engineNextBytes() メソッドの SHA1PRNG_SecureRandomImpl.java の 320 行目 (Gingerbread ソース内) のバグ修正によるものです。

bits = seedLength << 3 + 64;

に変更されました

bits = (seedLength << 3) + 64;

修正されたのは明らかにバグでしたが、同じシードが与えられた場合、SecureRandom はジンジャーブレッドの前後で異なるデータを生成することを意味します。

私にはそれに対する「修正」があります。SecureRandom と同じ方法でランダムなバイトを生成できるように、android-7 から十分なコードを盗みました。私は自分の情報を復号化しようとしますが、失敗した場合は、ジャックアップした SecureRandom を使用して復号化します。その後、新しい SecureRandom を使用して明らかに再暗号化できますが、SecureRandom から完全に離れることを考えています...

于 2011-03-18T02:53:27.490 に答える
3

Froyo と Gingerbread の境界を越えて SecureRandom を移植できないことが問題のようです。この投稿では、同様の問題について説明しています。

http://groups.google.com/group/android-security-discuss/browse_thread/thread/6ec015a33784b925

SecureRandom で正確に何が変更されたのかはわかりませんが、それを修正する唯一の方法は、移植可能な方法を使用して生成されたキーでデータを再暗号化することでした。

于 2010-12-10T22:06:13.003 に答える
0

リリースノートによると、この修正はバージョン1.40に含まれていました。

パッドの長さが0の場合、PKCS7Paddingの検証は失敗しませんでした。これは修正されました。

これは適切かもしれないように聞こえます。

于 2010-12-10T07:07:48.870 に答える