ปัญหาในการถอดรหัส AES / ECB ที่เสริมโดยใช้ PCKS5 ใน C #


ฉันต้องถอดรหัสภาพที่มาจากบริการออนไลน์ (ซึ่งไม่ใช่ของฉัน ดังนั้นฉันจึงต้องใช้วิธีการเข้ารหัสนี้)
รูปภาพนี้ถูกเข้ารหัสโดยใช้ AES/ECB ด้วยคีย์ซิงโครนัสเดียวและเสริมด้วย PKCS5

ฉันลองหลายวิธีเพื่อให้บรรลุเป้าหมายนี้ แต่ก็ไม่ได้ผลเลย ฉันใช้ไลบรารีการเข้ารหัส BoucyCastle

นี่คือรหัสถอดรหัสของฉัน:

    public static byte[] Decrypt(string input)
    {
        var cipher = CipherUtilities.GetCipher("AES/ECB/PKCS5Padding");
        cipher.Init(false, new KeyParameter(Encoding.UTF8.GetBytes(KEY)));
        byte[] todo = Encoding.UTF8.GetBytes(Pad(input));
        byte[] bytes = cipher.ProcessBytes(todo);
        byte[] final = cipher.DoFinal();

        // Write the decrypt bytes & final to memory...
        var decryptedStream = new MemoryStream(bytes.Length);
        decryptedStream.Write(bytes, 0, bytes.Length);
        decryptedStream.Write(final, 0, final.Length);
        decryptedStream.Flush();

        var decryptedData = new byte[decryptedStream.Length];
        decryptedStream.Read(decryptedData, 0, (int)decryptedStream.Length);
        return decryptedData;
    }

    private static string Pad(string data)
    {
        int len = data.Length;
        int toAdd = (16 - len % 16);
        for (int i = 0; i < toAdd; i++)
        {
            data += (char)toAdd;
        }
        return data;
    }

เมื่อฉันลอง มันทำให้เกิด InvalidCipherTextExpression พร้อมข้อความ "pad block เสียหาย" ที่บรรทัด byte[] final = cipher.DoFinal();
ฉันทดสอบฟังก์ชันการเติมและดูเหมือนว่าจะทำงานได้อย่างที่คาดไว้
ฉันพยายามดูภายในซอร์สโค้ด BouncyCastle เพื่อค้นหาข้อผิดพลาดของฉัน และสิ่งที่ฉันพบคือบล็อกสุดท้ายไม่มีช่องว่างภายใน และนั่นคือสิ่งที่ทำให้เกิดข้อผิดพลาด ดังนั้นฉันสงสัยว่าฉันกำลังทำอะไรผิดที่อื่นหรือเปล่าเพราะมันอาจไม่มาจากช่องว่างภายใน
อาจเป็นสตริงอินพุตซึ่งดึงมาจากเซิร์ฟเวอร์ http ด้วยสิ่งนี้:

        // grab te response and print it out to the console along with the status code
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        return new StreamReader(response.GetResponseStream()).ReadToEnd();

สิ่งที่ฉันต้องการบรรลุคือสิ่งเดียวกันกับที่นี่ทุกประการ: C# Decrypting AES /ECB Paddded โดยใช้ PKCS#5
แต่ไม่มีผู้แจ้งเนื่องจากผู้ถามไม่ได้ลองอะไรเลย..

ขอบคุณล่วงหน้า และฉันขอโทษจริงๆ สำหรับภาษาอังกฤษที่ไม่ดีของฉัน


person Rom11    schedule 13.01.2014    source แหล่งที่มา
comment
ด้วยคีย์ซิงโครนัสเดียว คีย์ซิงโครนัสคืออะไร?   -  person Duncan Jones    schedule 13.01.2014
comment
ฉันไม่รู้จริงๆ นั่นคือสิ่งที่ฉันพบในเอกสารประกอบ   -  person Rom11    schedule 13.01.2014
comment
ตกลง. หากสนใจ คุณสามารถลิงก์ไปยังเอกสารประกอบได้หรือไม่   -  person Duncan Jones    schedule 13.01.2014
comment
gibsonsec.org/snapchat/fulldisclosure/#encrypting-normal-snaps ฉัน พบสิ่งนี้ที่นี่ (ฉันไม่รู้ว่าฉันได้รับอนุญาตให้โพสต์สิ่งนี้ที่นี่หรือไม่ เนื่องจากนี่ไม่ใช่เอกสารอย่างเป็นทางการ .. )   -  person Rom11    schedule 13.01.2014
comment
ทำไมคุณถึงเติมก่อนถอดรหัส? ลำดับการดำเนินการควรเป็น pad -› เข้ารหัส - › ส่ง - › ถอดรหัส - › unpad   -  person wallenborn    schedule 13.01.2014
comment
@wallenborn ถูกต้อง ที่จริงแล้ว คุณไม่ต้องกังวลกับการถอดช่องว่างออกเลย เพราะ BouncyCastle lib จะทำสิ่งนั้นให้กับคุณ   -  person Duncan Jones    schedule 13.01.2014
comment
ฉันกำลังขยายก่อนที่จะถอดรหัสเมื่อฉันเห็นสิ่งนี้ในการใช้งานอื่นใน Python และทำงานได้ดี เมื่อฉันพยายามถอดรหัสโดยไม่มีช่องว่างภายใน ฉันได้รับข้อผิดพลาดอื่น: บล็อกสุดท้ายไม่สมบูรณ์ในการถอดรหัส   -  person Rom11    schedule 13.01.2014


คำตอบ (1)


คุณมีไซเฟอร์เท็กซ์ที่ไม่สมบูรณ์ - ข้อมูลที่เข้ารหัสด้วย AES-128 จะเป็นผลคูณของ 128/8 = 16 ไบต์เสมอ เช่น. Last block incomplete in decryption หมายความว่าคุณมีไซเฟอร์เท็กซ์ 127 ไบต์แทนที่จะเป็น 128

ดังที่กล่าวไว้ในความคิดเห็น คุณต้องไม่แพดไซเฟอร์เท็กซ์ก่อนที่จะถอดรหัส "มันใช้งานได้" เพราะฟังก์ชันของคุณไม่ได้แพดอะไรเลย - เนื่องจากเหตุผลที่เน้นไว้ข้างต้น

คุณแน่ใจหรือว่าคุณกำลังใช้ AES รสชาติ "bitness" แบบเดียวกัน (ตัวอย่างเช่น อาจเป็นได้ว่าคุณถอดรหัสข้อความเข้ารหัส AES-128 ด้วย AES-192)

ป.ล. ในบันทึกที่ไม่เกี่ยวข้อง cipher.Init(false, new KeyParameter(Encoding.UTF8.GetBytes(KEY))); ก็ดูน่าสงสัยเช่นกัน คุณแน่ใจหรือว่าไม่ใช่ Base64 หรือคล้ายกัน?

person DarkWanderer    schedule 13.01.2014
comment
นั่นคือสิ่งนี้จริงๆ ขอบคุณ ! ปัญหามาจากการที่ฉันได้รับไบต์จากสตริง และสูญเสียบางส่วนไป ตอนนี้ฉันได้รับไบต์โดยตรงจากสตรีมตอบกลับ HTTP! - person Rom11; 13.01.2014