Score:2

แยกแยะ IV ที่ถูกต้องจาก IV ที่ไม่ถูกต้องใน AES CBC เมื่อทราบคีย์

ธง us

ปัจจุบัน ฉันใช้ค่า IV แบบคงที่สำหรับการเข้ารหัสและถอดรหัสทั้งหมด แต่ฉันต้องการให้เป็นแบบไดนามิกสำหรับคำขอเข้ารหัส/ถอดรหัสแต่ละรายการ ดังนั้นฉันจึงเริ่มใช้ไบต์ใหม่[16] และใช้งานได้ ปัญหาคือจะตรวจจับและถอดรหัสข้อมูลเก่าได้อย่างไร ด้านล่างนี้คือรหัสของฉันที่จะถอดรหัสและฉันกำลังส่ง IV แบบคงที่ที่เก็บไว้ในความลับในคีย์วอลต์

ไบต์คงที่ส่วนตัว [] DecryptFromBytes_Aes (ไบต์ [] dataBytes, คีย์ไบต์ [], ไบต์ [] iV)
    {
        ถ้า (dataBytes == null || dataBytes.Length <= 0)
            โยน ArgumentNullException ใหม่ ("DataBytes");
        ถ้า (คีย์ == null || key.Length <= 0)
            โยน ArgumentNullException ใหม่ ("คีย์");
        ถ้า (iV == null || iV.Length <= 0)
            โยน ArgumentNullException ใหม่ ("iV");

        ไบต์ [] ผลลัพธ์ = null;
        ใช้ (AesCryptoServiceProvider aesAlg = ใหม่ AesCryptoServiceProvider())
        {
            aesAlg.Key = คีย์;
            aesAlg.IV = iV;
            aesAlg.Padding = PaddingMode.PKCS7;
            ตัวถอดรหัส ICryptoTransform = aesAlg.CreateDecryptor (aesAlg.Key, aesAlg.IV);
            ใช้ (MemoryStream memoryStream = ใหม่ MemoryStream (dataBytes))
            {
                ใช้ (CryptoStream cryptoStream = CryptoStream ใหม่ (memoryStream, decryptor, CryptoStreamMode.Read))
                {
                    ไบต์ [] decryptedBytes = ไบต์ใหม่ [dataBytes.Length];
                    int อ่าน = cryptoStream.Read (ถอดรหัส Bytes, 0, dataBytes.Length);
                    Array.Resize(อ้างอิง decryptedBytes อ่าน);
                    ผลลัพธ์ = ถอดรหัสไบต์;
                }
            }

        }

        ส่งคืนผลลัพธ์
    }
Bharat Malhotra avatar
us flag
ขอบคุณสำหรับการตอบสนองที่รวดเร็ว ฉันได้รับการบอกให้โพสต์ที่นี่ :)
Bharat Malhotra avatar
us flag
Btw ฉันกำลังเสริม แต่ฉันไม่รู้วิธีจัดการกับข้อมูลที่มีอยู่ทั้งหมด
Aman Grewal avatar
gb flag
หากมีการเติมข้อมูลเก่าไว้แล้ว ให้ตรวจสอบว่า IV ตรงกับข้อมูลคงที่หรือไม่ ถ้าเป็นเช่นนั้น ให้ถอดรหัสตามปกติ แต่สร้าง IV ใหม่เมื่อเข้ารหัส (แม้ว่าข้อมูลอื่นๆ ทั้งหมดจะเหมือนกันก็ตาม)
kelalaka avatar
in flag
@AmanGrewal ปัญหาจริงที่ฉันเห็นคือสิ่งนี้ IV แบบคงที่ไม่ได้ถูกจัดเก็บด้วยไซเฟอร์เท็กซ์และวันที่ไม่น่าเชื่อถือในการสร้างความแตกต่าง สิ่งนี้ทำให้เราสามารถแยกความแตกต่างของข้อความรหัส CBC ที่ต่อท้ายด้วย IV แบบสุ่มจากข้อความรหัส CBC ที่ไม่ได้ต่อท้าย IV การตรวจสอบช่องว่างภายในเป็นกุญแจสำคัญ
Score:4
ธง in

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

ตัวอย่างเช่น คุณสามารถมีเวทมนตร์แบบสุ่มขนาด 16 ไบต์เต็มหน้าไฟล์ที่เข้ารหัสใหม่ (แน่นอนว่าสร้างครั้งเดียว) จากนั้นหมายเลขเวอร์ชันและข้อมูลอื่นๆ รวมถึง IV แบบสุ่ม ข้อความเข้ารหัส และ HMAC เหนือส่วนหัวและข้อมูลรวมถึง IV. ด้วยวิธีนี้คุณสามารถตรวจจับได้ว่าใช้การเข้ารหัสที่ถูกต้อง (เนื่องจากการสร้างเวทมนตร์นั้นโดยบังเอิญมีโอกาสเป็น 1 ใน $2^{128}$) เพียงแค่ทำการเปรียบเทียบ คุณยังได้ปกป้องไฟล์ของคุณเพื่อความสมบูรณ์และความถูกต้องโดยใช้ HMAC (นี่เป็นทางเลือกและไม่จำเป็นอย่างยิ่งสำหรับการรักษาความลับ - แต่แนะนำเป็นอย่างยิ่ง)

นั่นจะเป็น:

 MAGIC (16 ไบต์) | รุ่น | IV (16 ไบต์) | ข้อความไซเฟอร์เท็กซ์ | แท็ก

โดยที่ TAG คือแท็กการตรวจสอบสิทธิ์ที่สร้างขึ้นโดยใช้ HMAC แทนทุกอย่างก่อนหน้านี้

แน่นอนว่ามีคนจำนวนมากที่เขียนโปรโตคอลแบบนี้แล้วเช่นกัน ดังนั้นคุณอาจต้องการดูรูปแบบคอนเทนเนอร์ เช่น CMS (ซึ่งมักจะขึ้นอยู่กับการเข้ารหัสคีย์สาธารณะ / ใบรับรอง) หรือแม้กระทั่ง NaCL

Score:4
ธง in

ปัญหาคือวิธีการตรวจจับและถอดรหัสข้อมูลเก่า ด้านล่างนี้คือรหัสของฉันที่จะถอดรหัสและฉันกำลังส่ง IV แบบคงที่ที่เก็บไว้ในความลับในคีย์วอลต์

คำตอบขึ้นอยู่กับการเติมและความถูกต้องของคีย์

  • กรณี: หากคีย์ถูกต้องและ IV ไม่ถูกต้อง;

    โปรดจำไว้ว่าการถอดรหัส CBC ดำเนินการเป็น \begin{จัด} P_1 =& Dec_k(C_1) \oplus IV\ P_i =& Dec_k(C_i) \oplus C_{i-1},\;\; 1 < ฉัน \leq nb, \end{จัด}

    ดังนั้นหาก IV ไม่ถูกต้องให้บล็อกแรก $P_1$ ไม่ถูกต้อง. เราสามารถพิจารณาสิ่งนี้ได้คล้ายกับ การโจมตีแบบพลิกบิต ในบล็อกแรก บล็อกถัดไป $P_i$ จะถอดรหัสได้ถูกต้องเนื่องจากต้องอาศัยความถูกต้องของ $C_i$ และ $C_{i-1}$ และในกรณีนี้ถูกต้อง บล็อกแรกของคุณจะไม่ถูกต้องเท่านั้น การแยกแยะสิ่งนี้อาจเป็นเรื่องยากและคุณต้องเตรียมตัวกรองเพื่อแยกความแตกต่างจากคุณสมบัติของข้อความธรรมดา - ภาษาหรือรูปแบบ จำเป็นต้องมีการเปรียบเทียบทั้งสองกรณี IV แบบคงที่หรือ IV แบบสุ่ม ไม่ว่าตัวกรองของคุณจะผ่านเกณฑ์ใดอาจเป็นกรณีที่ถูกต้องและขึ้นอยู่กับข้อมูลของคุณจริงๆ

    หากบล็อกแรกของข้อความธรรมดาเป็นข้อความล้วนและมีเฉพาะอักขระจากส่วนแรกของ ASCII (เช่นค่า int ของ char < 128 ) นี่เป็นตัวแยกความแตกต่างที่ดี เพียงตรวจสอบว่าแต่ละ 16 ไบต์ < 128

    ย้ายไฟล์ทั้งหมดของคุณเป็นรูปแบบเฉพาะโดยเร็วที่สุด

  • กรณี: ถ้า คีย์ไม่ถูกต้อง จากนั้นคุณจะได้รับข้อผิดพลาดการเติม PKCS#7 ซึ่งมีความเป็นไปได้สูง

    ไบต์การเติมจะเป็นหนึ่งในสิ่งต่อไปนี้ที่ส่วนท้ายของข้อความธรรมดา ขึ้นอยู่กับขนาดของข้อความธรรมดาด้วยการเติม ขนาดจะต้องมีผลคูณขั้นต่ำของขนาดบล็อกของ AES ซึ่งมีขนาดบล็อก 16 ไบต์

      หายไป 1 ไบต์ - ไบต์ที่เติม: 01
      ไม่มี 2 ไบต์ - ไบต์ที่เติม: 02 02
      ไม่มี 3 ไบต์ - ไบต์ที่เติม: 03 03 03
      ไม่มี 4 ไบต์ - ไบต์ที่เติม: 04 04 04 04
      ไม่มี 5 ไบต์ - ไบต์ที่เติม: 05 05 05 05 05
      ไม่มี 6 ไบต์ - ไบต์ที่เติม: 06 06 06 06 06 06
      ...
      บล็อกเต็ม - การเติมไบต์: 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 
      แม้ว่าข้อความธรรมดาจะเป็นผลคูณของ 128 แต่ก็จำเป็นต้องมีบล็อกเต็มเพื่อไม่ให้ช่องว่างภายในคลุมเครือ
    

    ตรวจสอบว่าการเติมถูกต้อง

    หากไม่ถูกต้อง คุณมั่นใจได้ว่า IV ไม่ถูกต้อง ถ้าถูกต้องมีก $1/256$ ความน่าจะเป็นที่ IV สร้างความถูกต้องแบบสุ่ม 01 ช่องว่างภายในด้วย $1/(256)^2$ ความน่าจะเป็น 0202 การเติมที่ถูกต้อง และอื่นๆ หากต้องการลบความเป็นไปได้นี้ คุณต้องตรวจสอบข้อมูล ภาษาหรือรูปแบบอื่นๆ เกี่ยวกับข้อความธรรมดาอาจช่วยให้คุณกำจัดผลบวกลวงได้

Manish Adhikari avatar
us flag
ฉันขาดอะไรไปหรือมีข้อแนะนำในคำถามที่ว่าข้อความเข้ารหัสประกอบด้วยบล็อกเดียว หากมีมากกว่าหนึ่งบล็อก การตรวจสอบช่องว่างภายในจะผ่านเสมอ ฉันจะได้เฉพาะบล็อกแรกที่เสียหาย ถ้า IV ไม่ถูกต้อง
Manish Adhikari avatar
us flag
ฉันไม่ใช่ OP ฉันแค่ระบุว่าการตรวจสอบ IV ผ่านความถูกต้องของการเติมจะใช้งานได้ก็ต่อเมื่อสร้างไซเฟอร์เท็กซ์บล็อกเดียว ดังนั้นฉันแค่สงสัยว่ามีข้อเสนอแนะเล็กน้อยที่ฉันพลาดไปหรือไม่ ขอบคุณที่อัปเดตคำตอบของคุณ
kelalaka avatar
in flag
@ManishAdhikari ใช่คุณไม่ใช่ OP :)
Bharat Malhotra avatar
us flag
ขอบคุณที่แบ่งปันความคิดของคุณเกี่ยวกับเรื่องนี้ :) ฉันไม่ได้มีความรู้มากมายในการแก้ไขปัญหานี้ ดังนั้นฉันแค่สงสัยว่าเคล็ดลับในการระบุบล็อคแรกเป็น IV ในสตริงที่เข้ารหัสจะเพียงพอสำหรับฉันที่จะเปลี่ยนไปใช้ IV แบบเก่าหรือไม่ ฉันคิดว่า AesCryptoServiceProvider บันทึก IV ก่อนสตริงที่เข้ารหัส
kelalaka avatar
in flag
@BharatMalhotra หากคุณคาดหวังว่าจะเป็นข้อความธรรมดาตรวจสอบให้แน่ใจว่าไบต์นั้นน้อยกว่า 128? ธรรมเนียมปฏิบัติคือร่วมกันออม ฉันไม่เห็นมันจากเอกสารประกอบ คุณสามารถทดสอบได้ด้วยตัวเองง่ายมาก ขนาดของไซเฟอร์เท็กซ์สามารถระบุสิ่งนี้ได้เข้ารหัสตัวอักษรหนึ่งตัว ถ้าไซเฟอร์เท็กซ์เป็น 16 ไบต์ จะไม่มีการบันทึก IV ,,,,
Bharat Malhotra avatar
us flag
ขอบคุณ ฉันคิดว่าคุณพูดถูก มันไม่ได้บันทึก IV ด้วยสตริงที่เข้ารหัส ลิงก์ใด ๆ ที่จะอ้างถึงเพื่อดูว่าเราจะทำอย่างไรเพื่อให้ฉันสามารถตรวจพบข้อมูลใหม่ในภายหลังได้
kelalaka avatar
in flag
นี่เป็นแนวทางปฏิบัติของซอฟต์แวร์ คุณสามารถเพิ่มหมายเลขวิเศษตามที่ [Maarten](https://crypto.stackexchange.com/a/96527/18298) แนะนำ ซึ่งแสดงว่า IV เป็นแบบคงที่หรือแบบสุ่ม โปรดทราบว่าเมื่อสร้างซอฟต์แวร์ คุณต้องแน่ใจว่าคุณสามารถแยกความแตกต่างของเวอร์ชันของข้อมูลได้หากจำเป็น การอัพเดทควรพิจารณาทุกกรณี...

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา