ข้อผิดพลาด BouncyCastle AES เมื่ออัปเกรดเป็น 1.45

เพิ่งอัปเกรดจาก 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

มันอาจไม่เกี่ยวข้องกับ BouncyCastle (ฉันกำลังทดสอบบน Android 2.3)


person sehugg    schedule 10.12.2010    source แหล่งที่มา


คำตอบ (3)


ฉันเพิ่งติดตามเรื่องนี้เสร็จ เป็นเพราะการแก้ไขข้อบกพร่องในบรรทัด 320 (ในซอร์ส Gingerbread) ของ SHA1PRNG_SecureRandomImpl.java ในเมธอด engineNextBytes() โดยที่

bits = seedLength << 3 + 64;

ถูกเปลี่ยนเป็น

bits = (seedLength << 3) + 64;

เห็นได้ชัดว่ามันเป็นข้อบกพร่องที่ได้รับการแก้ไขแล้ว แต่นั่นหมายความว่า SecureRandom จะสร้างข้อมูลที่แตกต่างกันทั้งก่อนและหลัง Gingerbread เมื่อได้รับเมล็ดพันธุ์เดียวกัน

ฉันมี "วิธีแก้ไข" สำหรับมัน ฉันขโมยโค้ดเพียงพอจาก android-7 เพื่อให้สามารถสร้างไบต์สุ่มในลักษณะเดียวกับที่ SecureRandom ทำ ฉันพยายามถอดรหัสข้อมูลของฉัน และหากล้มเหลว ให้ใช้ SecureRandom ที่แจ็คอัพของฉันเพื่อถอดรหัส จากนั้นฉันก็สามารถเข้ารหัสใหม่ได้อย่างชัดเจนโดยใช้ SecureRandom รุ่นใหม่ แม้ว่าฉันจะคิดที่จะเลิกใช้ SecureRandom โดยสิ้นเชิงก็ตาม...

person Ben Demboski    schedule 18.03.2011
comment
ฉันกำลังพยายามใช้สิ่งเดียวกัน... คุณสร้างผู้ให้บริการได้อย่างไร - person William Melani; 01.07.2011
comment
@Ben Demboski คุณช่วยโพสต์วิธีแก้ปัญหาของคุณได้ไหม? นั่นจะเป็นประโยชน์มากที่สุด - person pandre; 18.11.2012

ดูเหมือนว่าปัญหาคือ SecureRandom ไม่สามารถพกพาข้ามขอบเขต Froyo-Gingerbread ได้ โพสต์นี้อธิบายปัญหาที่คล้ายกัน:

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

ฉันไม่แน่ใจว่ามีอะไรเปลี่ยนแปลงไปบ้างใน SecureRandom แต่วิธีเดียวที่ฉันพบที่จะแก้ไขได้คือเข้ารหัสข้อมูลอีกครั้งด้วยคีย์ที่สร้างขึ้นโดยใช้วิธีพกพา

person sehugg    schedule 10.12.2010
comment
คุณถูก. สัญญาสำหรับ SecureRandom ไม่ได้สัญญาว่าเมล็ดพันธุ์ที่คุณจัดหาด้วยตนเองจะเป็นเมล็ดพันธุ์ เท่านั้น ที่ใช้ มันจะใช้แหล่งข้อมูลอื่น เช่น /dev/random บน linux/bsd - person President James K. Polk; 11.12.2010
comment
สำหรับผู้อ่านในอนาคต: กล่าวอีกนัยหนึ่ง ให้ใช้วิธีการรับคีย์ที่รู้จักกันดีแทน เช่น PBKDF2 - person Maarten Bodewes; 14.02.2012

ตามบันทึกประจำรุ่น การแก้ไขนี้รวมอยู่ในเวอร์ชัน 1.40:

การตรวจสอบความถูกต้องของ PKCS7Padding จะไม่ล้มเหลวหากความยาวของแพดเป็น 0 ซึ่งได้รับการแก้ไขแล้ว

ดูเหมือนว่ามันอาจจะเกี่ยวข้อง

person caf    schedule 10.12.2010