Score:3

การใช้ AES CTR อย่างเหมาะสม

ธง cn

ฉันได้อ่านแล้วว่า AES CTR จะปลอดภัยหากใช้อย่างเหมาะสมเท่านั้น ดังนั้นฉันต้องการให้แน่ใจว่าฉันใช้อย่างถูกต้อง

  1. เวกเตอร์เริ่มต้น (IV) สามารถใช้ได้เพียงครั้งเดียว ไม่จำเป็นต้องสุ่ม ปลอดภัยหรือไม่ที่จะใช้ตัวนับสำหรับส่วนหนึ่งของ IV ส่วนอื่น ๆ เป็นเพียงข้อความบางส่วน ตัวนับจะถูกส่งไปยังทุกคนด้วยข้อความที่ชัดเจน ในขณะที่ส่วนที่ละเอียดอ่อนของข้อความจะถูกเข้ารหัส เป็นปัญหาที่ IV ถัดไปสามารถคาดเดาได้หรือไม่?
  2. ฉันเข้าใจว่า IV ไม่สามารถทำซ้ำได้ แต่ในกรณีที่เงื่อนไขนี้จำเป็นต้องทำซ้ำกี่ครั้งจึงจะถอดรหัสระบบได้ ฉันหมายถึงตัวนับเดียวกันซ้ำสองครั้งหรือ 100?
  3. สุดท้าย แต่ไม่ท้ายสุด จะเพิ่มความปลอดภัยในการใช้ AES-256 เหนือ AES-128 เพื่อเข้ารหัสข้อความขนาด 16 ไบต์หรือไม่
Score:2
ธง in

ที่นี่เราสร้างความแตกต่าง $nonce \mathbin\|คู่หู$ ถือเป็น $IV$

  • เป็นปัญหาที่ IV ถัดไปสามารถคาดเดาได้หรือไม่?

ไม่ ไม่ใช่ปัญหาในโหมด CTR อ่านเพิ่มเติมใน [1]. เดอะ $IV= (ไม่ใช่\mathbin\|คู่)$ ถูกเข้ารหัสและข้อความเข้ารหัสถูก x-ored ด้วยข้อความธรรมดา

$$C_i = \operatorname{AES-CTR}(nonce\mathbin\|เข้ารหัส(i)) \oplus P_i$$

ตราบเท่าที่ $(IV,คีย์)$ คู่ไม่เคยซ้ำไม่มีปัญหาสำหรับ 16- ของคุณไบต์สมมติว่าคุณเริ่มต้นจาก 0 ในตัวนับเสมอสำหรับการเข้ารหัสทุกครั้งด้วย nonce ใหม่หรือคีย์ใหม่

หากมีการทำซ้ำความลับจะสูญหาย

ฉันเข้าใจว่า IV ไม่สามารถทำซ้ำได้ แต่ในกรณีที่เงื่อนไขนี้จำเป็นต้องทำซ้ำกี่ครั้งจึงจะถอดรหัสระบบได้ ฉันหมายถึงตัวนับเดียวกันซ้ำสองครั้งหรือ 100?

สองคู่ก็เพียงพอแล้วที่จะทำลายความลับด้วยเทคนิคการลากเปล ขณะนี้เป็นระบบอัตโนมัติ [2]. หากคุณรู้จักหนึ่งในนั้น การหาอีกอันด้วย x-or ก็ไม่ใช่เรื่องเล็กน้อย

สุดท้าย แต่ไม่ท้ายสุด จะเพิ่มความปลอดภัยในการใช้ AES256 บน AES128 เพื่อเข้ารหัสข้อความขนาด 16 ไบต์หรือไม่

โหมด CTR เป็น CPA ที่ปลอดภัยตราบเท่าที่ใช้อย่างเหมาะสม AES-128 ปลอดภัย (ส่วนใหญ่)[3] อย่างไรก็ตาม การใช้ AES-256 จะปลอดภัยแม้กระทั่งศัตรูควอนตัมที่มาพร้อมกับ Grover's Machine


โปรดทราบว่าในโหมด CTR คุณจะได้รับความปลอดภัย CPA เท่านั้น นั่นคือไม่มีความสมบูรณ์และการรับรองความถูกต้อง เพื่อให้บรรลุความสมบูรณ์และการรับรองความถูกต้อง เราสามารถใช้ AES-GCM (พร้อม SIV) โหมด SIV ใช้ข้อความเพื่อหลีกเลี่ยงปัญหา IVเมื่อ IV ทำซ้ำ มันจะรั่วไหลเฉพาะความเท่าเทียมกันของข้อความ ไม่ใช่เนื้อหา

การใช้ AES CTR อย่างเหมาะสม

ภาระหน้าที่ของคุณ: เป็นสัญญารักษาความปลอดภัย

  • เลือกคีย์สุ่มแบบเดียวกัน $k$ ขนาด 256 และเก็บเป็นความลับตลอดเวลา

  • เลือก IV และตรวจสอบให้แน่ใจว่า $(k,IV)$ ไม่เคยทำซ้ำแม้แต่ตัวนับที่เพิ่มขึ้น

    • ใช้ ตัวนับที่กำหนดหรือ LFSR เพื่อให้ติดตามของ $ไม่นอน$ตรวจสอบให้แน่ใจว่ามีการแลกเปลี่ยนรหัสใหม่หากมีข้อผิดพลาด/ระบบหยุดทำงาน พวกเขาอาจไม่สามารถเขียนรหัสที่ใช้ล่าสุดได้ $ไม่นอน$.

    • หรือใช้การสุ่ม $ไม่นอน$ตรวจสอบให้แน่ใจว่าคุณอยู่ในระดับต่ำในการชนกันของ $ไม่นอน$ ภายใต้คีย์เดียวกัน

    • เริ่มต้นเคาน์เตอร์เสมอจาก $0$. หากตัวนับไม่เริ่มต้นจาก $0$ มีเส้นทางอันตรายที่อาจทำให้ IV ทำซ้ำได้หาก nonce เหมือนกัน

  • เข้ารหัสข้อความและตรวจสอบให้แน่ใจว่าไม่เกิน $2^{32}$.

    • รับประกันว่าไม่มีความแตกต่างและ
    • รับประกันว่าตัวนับไม่เคยผ่านทั้ง 1 สถานะ เช่น ไม่เกินค่าสูงสุดของตัวนับ
  • เก็บไว้.

สิ่งที่คุณได้รับ

  • ความปลอดภัย Ind-CPA และไม่มีอะไรเพิ่มเติม!

แทนที่จะใช้ XChaCha20-Poly1305 กับ nonces 192 บิตที่ $(IV,คีย์)$ เกิดขึ้นเล็กน้อย คุณจะได้รับการรับรองความถูกต้องและความสมบูรณ์ด้วย และเนื่องจากโหมด CTR ได้รับการออกแบบมาสำหรับ PRF XChaCha20 จึงเหมาะที่จะใช้กับโหมด CTR ( XChaCha20 ใช้ CTR ภายใน)


Gilles 'SO- stop being evil' avatar
ไม่! สำหรับ CTR นั้นไม่เพียงพอสำหรับ IV ที่จะไม่ทำซ้ำ **ตัวนับ** ต้องไม่ทำซ้ำ
kelalaka avatar
in flag
@Gilles'SO-stopbbingevil' หยุดเป็นชื่อเล่นของคุณ ประการแรกเรากำลังพูดถึง 16 ไบต์ ประการที่สองฉันพูดว่า "รับประกันว่าตัวนับไม่เคยผ่าน 1 สถานะ" ไหนบอกว่าต่อค่าตัวนับ?
Maarten Bodewes avatar
in flag
ฉันเห็นว่าการใช้คำว่า IV ใช้สำหรับตัวนับ Nonce + อย่างไร เนื่องจาก IV ใช้เป็นค่าเริ่มต้นเท่านั้น - มันเป็นเวกเตอร์เริ่มต้นหลังจากทั้งหมด ตามที่กำหนดไว้ 16 ไบต์จะตั้งชื่อได้ดีกว่า *counter block* ซึ่งประกอบด้วย nonce + counter@Gilles'SO-stopbeingevil' หากคุณปฏิบัติตามคำจำกัดความของ NIST การทำซ้ำตัวนับนั้นไม่เพียงพอเช่นกัน เนื่องจากนั่นเป็นเพียงส่วนหนึ่งของอินพุต / บล็อกตัวนับ ดังนั้นใช่ คำศัพท์
Gilles 'SO- stop being evil' avatar
@MaartenBodewes หากคุณแยกตัวนับบล็อกออกเป็น nonce ต่อข้อความและค่าตัวนับต่อบล็อก ข้อกำหนดจะกลายเป็นว่า nonce ต่อข้อความไม่ทำซ้ำและค่าตัวนับต่อบล็อกจะไม่ล้น ไม่ใช่งานนำเสนอทั้งหมดของโหมด CTR ที่ทำเช่นนั้น คำตอบนี้กำหนด âIVâ อย่างชัดเจนว่าเป็นบล็อกเริ่มต้นทั้งหมดซึ่งประกอบด้วย nonce ที่เชื่อมกับตัวนับ และ _that_ จะไม่ซ้ำกันนั้นไม่เพียงพอ: ส่วน nonce จะต้องไม่ซ้ำกัน การทำซ้ำ nonce ด้วยค่าตัวนับเริ่มต้นที่แตกต่างกันนั้นไม่เพียงพอ
kelalaka avatar
in flag
@ Gilles'SO-stopbeevil' ประเด็นคือฉันทราบดีถึงปัญหานั้นและสำหรับ 16 ไบต์นั้นไม่ใช่ปัญหา ฉันไม่เคยบอกว่าจะใช้ค่าตัวนับต่อไปหรือใช้ค่าตัวนับอื่น ตัวนับเริ่มต้นจาก 0 การต่อไปยังตัวนับเป็นเส้นทางที่อันตรายและไม่ใช่มุมมองด้านความปลอดภัยที่ดีที่จะเพิ่มจำนวนข้อผิดพลาด ตอนนี้ ฉันได้สร้างความแตกต่างระหว่างส่วนเคาน์เตอร์และส่วนเคาน์เตอร์ของ IV
Gilles 'SO- stop being evil' avatar
ในกรณีที่ข้อความทั้งหมดยาว (มากที่สุด) หนึ่งช่วงตึก ดังนั้น ค่า IV และตัวนับจะเหมือนกัน แต่นั่นเป็นกรณีพิเศษมากซึ่งคำถามไม่ได้ถูกจำกัดอย่างชัดเจน (คำถามย่อยจะเกิดขึ้นเพียงคำถามเดียว) คำตอบของคุณถูกต้องแล้วจากมุมมองทางคณิตศาสตร์ที่เคร่งครัด แต่ก็ยังคงทำให้เข้าใจผิดได้อย่างมาก เนื่องจากข้อเท็จจริงที่ว่ามันเฉพาะเจาะจงกับกรณีของข้อความบล็อกเดียว ซึ่งเป็นสถานการณ์ที่ไม่ค่อยพบบ่อยนัก
kelalaka avatar
in flag
@Gilles'SO-stopbeevil' ฉันได้ให้กรณีทั่วไปในสัญญาความปลอดภัย ฉันไม่ชอบความคิดเรื่องความต่อเนื่องของตัวนับ ในสภาพแวดล้อมที่มีข้อจำกัดบางอย่าง ผู้คนต้องการมันเพื่อที่พวกเขาจะได้แลกเปลี่ยนกุญแจน้อยลง ถึงกระนั้นฉันก็ไม่พิจารณาพวกเขาที่นี่ เริ่มนับจาก 0 ตรวจสอบถ้อยคำซ้ำแล้วซ้ำอีกเพื่อไม่ให้เข้าใจผิด...
Gilles 'SO- stop being evil' avatar
ไม่ ในกรณีทั่วไป โครงสร้างบล็อกเคาน์เตอร์เป็นแบบ nonce||คู่เทียบ (ซึ่งไม่ใช่การนำเสนอและการใช้งาน CTR ทั้งหมด) ภาระผูกพันคือ nonce จะไม่ทำซ้ำและเนื่องจากขนาดที่จำกัดของ nonce จึงจำเป็นต้องติดตาม nonce ที่ใช้ก่อนหน้านี้ ซึ่งไม่สามารถทำได้เสมอไป เป็นหลุมพรางของ CTR ซึ่งผู้ใช้มักจะเข้าใจผิด และคำตอบของคุณกระตุ้นให้พวกเขาเข้าใจผิด
kelalaka avatar
in flag
@Gilles'SO-stopbeingevil' เป็นไปได้ที่ใคร ๆ ก็สามารถรวมการสุ่มและคอนเทนเนอร์เพื่อสร้าง nonce ได้ แม้ว่าสิ่งนี้จะต้องใช้การคำนวณและนั่นต้องการอายุการใช้งานของคีย์และจำนวนข้อความต่อคีย์ อย่างที่บอกถ้ามีปัญหาก็เปลี่ยนกุญแจใหม่ คำแนะนำทั่วไปของฉันคือใช้ xChaCha เนื่องจากมีช่วง nonce ที่ดีกว่า ดังที่ลินเดลล์เคยกล่าวไว้ บล็อก 256 บิตเป็นสิ่งจำเป็นเพื่อให้เรามีขอบเขต CTR และ GCM ที่ดีขึ้น ฉันไม่คิดว่าฉันกำลังนำพวกเขาไปสู่หลุมพราง ฉันได้จำกัดไม่ให้พวกเขาตกหลุมพรางแล้ว
au flag
โปรดทราบว่า (ต่อการออกแบบ) CTR ใช้อัลกอริทึมเดียวกันสำหรับการเข้ารหัสและถอดรหัส สิ่งนี้อาจนำไปสู่การถอดรหัสโดยไม่ได้รับอนุญาตในบางบริบท (แม้ว่าจะต้องมีการทำซ้ำ IV)
Score:1

สำหรับ CTR ข้อกำหนดคือว่า ค่าเคาน์เตอร์ ไม่ทำซ้ำ (สำหรับคีย์ที่กำหนด) gotcha ที่ใหญ่ที่สุดด้วยโหมดเคาน์เตอร์คือมันไม่เพียงพอสำหรับ IV (ที่ อักษรย่อ ค่าของตัวนับ) ไม่ให้ทำซ้ำ

ไม่สำคัญว่าค่าตัวนับจะสามารถคาดเดาได้หรือไม่ หากคุณสามารถกำหนดให้ตัวนับเริ่มต้นที่ 0 และเพิ่มทีละ 1 สำหรับบล็อกข้อความแต่ละบล็อก นั่นเป็นวิธีที่ดีมากในการใช้ CTR โปรดทราบว่าข้อความหลายข้อความหมายความว่าข้อความแรกใช้ค่าตัวนับ $0, 1, 2, \ldots, a$จากนั้นข้อความที่สองจะใช้ค่าตัวนับ $a+1, a+2, \ldots, b$, ข้อความที่สามใช้ $b+1, b+2, \ldots, c$และอื่น ๆ

ให้ฉันอธิบายสิ่งที่ผิดพลาดกับค่าตัวนับซ้ำ อนุญาต $E$ เป็นฟังก์ชั่นการเข้ารหัสบล็อกและเขียน $\langle n\range$ สำหรับการเข้ารหัสค่าตัวนับ $n$ เป็นบล็อก หากคุณส่งข้อความสองบล็อกสองข้อความ $P_0||P_1$ และ $P'_0||พี่_1$ (ที่ละ $P^{(ญ)}_i$ แทนหนึ่งบล็อก) หนึ่งอันที่มี IV $n$ และอันต่อไปกับ IV $n+1$จากนั้นไซเฟอร์เท็กซ์ที่เกี่ยวข้องคือ $C_0||C_1 = (E(\langle n\rangle) \oplus P_0) || (E(\langle n+1\range) \oplus P_1)$ และ $C'_0||C'_1 = (E(\langle n+1\range) \oplus P'_0) || (E(\langle n+2\range) \oplus P_1)$. สังเกตว่าข้อความไซเฟอร์ทั้งสองนี้ใช้อย่างไร $E(\langle n+1\range)$. ฝ่ายตรงข้ามสามารถ xor บล็อกข้อความเข้ารหัสสองบล็อกที่ใช้ค่าตัวนับเดียวกัน และมาสก์การเข้ารหัสจะยกเลิก: $C_1 \oบวก C'_0 = P_1 \oบวก P'_0$. ซึ่งมักจะเพียงพอที่จะเดาบล็อกข้อความธรรมดาบางส่วนหรือทั้งหมด ตัวอย่างเช่น ข้อความจำนวนมากมีส่วนหัวที่รู้จักหรือส่วนใหญ่รู้จัก และในตัวอย่างนี้ของการทำซ้ำค่าตัวนับ จะกลายเป็นการเปิดเผยเนื้อหาของสิ่งที่อยู่หลังส่วนหัว 16 ไบต์ในข้อความแรก

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

ในกรณีส่วนใหญ่ คุณควรใช้มาตรฐาน การเข้ารหัสรับรองความถูกต้อง (AEAD) โหมดแทน เช่น SIV หรือ หรือ GCM-SIV หรือ GCM หรือ CCM สิ่งนี้มีประโยชน์สองประการ หนึ่งคือข้อความเข้ารหัสได้รับการพิสูจน์ตัวตน: เมื่อถอดรหัส คุณสามารถตรวจสอบได้ว่าข้อความเข้ารหัสไม่มีการเปลี่ยนแปลง (เป็นไปไม่ได้ที่จะตรวจสอบความถูกต้องของข้อความไซเฟอร์โดยไม่มีรหัสลับ ฝ่ายตรงข้ามยังสามารถสลับข้อความของแท้สองข้อความได้ ดังนั้น ความถูกต้องจึงไม่ได้บ่งบอกถึงความสมบูรณ์) ข้อดีอื่นๆ ของการใช้โหมด AEAD มาตรฐานคือ ค่าตัวนับก็เพียงพอสำหรับการรักษาความปลอดภัย ไม่ทำซ้ำ: ไม่มีเงื่อนไขที่ละเอียดอ่อนอื่น ๆ โหมด SIV มีข้อได้เปรียบที่แม้ว่า IV จะทำซ้ำโดยบังเอิญ แต่สิ่งนี้สามารถเปิดเผยได้ว่าข้อความนั้นเหมือนกันเท่านั้น แต่จะไม่เปิดเผยอะไรเกี่ยวกับเนื้อหา

การใช้ AES-256 แทนที่จะเป็น AES-128 ช่วยเพิ่มความปลอดภัยให้กับคอมพิวเตอร์ควอนตัมในกรณีที่ใช้งานได้จริงเท่านั้น

kelalaka avatar
in flag
เรากำลังพูดถึง 16 ไบต์!
Maarten Bodewes avatar
in flag
การสุ่ม IV อย่างสมบูรณ์จะทำให้ตัวนับเกิดซ้ำก่อนหน้านี้เท่านั้น แม้ว่าความแตกต่างจะค่อนข้างน้อย - การใช้งานมักจะเพิ่มโมดูล $2^{128}$ ของทั้งบล็อก ดังนั้นหากส่วนเคาน์เตอร์หนึ่งมีค่าสูงและหนึ่งในค่าที่ไม่ใช่ค่าถัดไปใน ลำดับต่ำ คุณจะมีการชนกันก่อนที่จะใช้ค่าตัวนับที่เป็นไปได้ทั้งหมด การแยก nonce และตัวนับน่าจะเป็นวิธีที่ดีที่สุดในการดำเนินการ โดยตัวนับเริ่มต้นสามารถเริ่มต้นเป็นศูนย์ทั้งหมดได้
Gilles 'SO- stop being evil' avatar
@MaartenBodewes âการสุ่ม IV อย่างเต็มที่จะทำให้ตัวนับทำซ้ำก่อนหน้านี้เท่านั้น â ซึ่งไม่ถูกต้อง ตัวอย่างเช่น หากคุณใช้กรณีสุดขีดของการแยก 1/127 บิตระหว่างตัวนับต่อข้อความ nonce และตัวนับต่อบล็อก สิ่งนี้รับประกันได้ว่าค่าของตัวนับซ้ำในข้อความที่สามเป็นส่วนใหญ่
Maarten Bodewes avatar
in flag
สมมติว่าคุณมีขนาดข้อความสูงสุด 2^32 บล็อก จากนั้นคุณใช้ 96 บิตที่เหลือเป็น nonce (สุ่ม) และถ้าคุณใช้ตัวนับ 32 บิตให้คงอยู่ภายใน nonce ด้วยวิธีนี้การเพิ่มขึ้นของตัวนับไม่สามารถสร้างการชนกับบล็อกตัวนับที่มี nonce อื่นได้อย่างไรก็ตาม สิ่งนี้อาจเกิดขึ้นได้หากคุณสุ่มบล็อกตัวนับทั้งหมด เนื่องจากระยะห่างระหว่างตัวนับของสอง nonce ที่ตามมาจะแตกต่างกันไป แน่นอนว่าไม่ใช่คำถามที่รับประกันว่าจะเกิดซ้ำเมื่อใด แต่เป็นคำถามที่เป็นไปได้หรือมีโอกาสเป็นไปได้
Gilles 'SO- stop being evil' avatar
@MaartenBodewes สิ่งนี้ถือว่าคุณสามารถติดตามว่ามีการใช้ nonce ใดก่อนหน้านี้ ฉันแนะนำให้ใช้ IV แบบสุ่มเท่านั้น (ใช้เต็มบล็อก) สำหรับกรณีที่คุณ _cannot_ ติดตามว่า nonce ใดถูกใช้ไป ดังนั้นสิ่งที่ดีที่สุดที่คุณสามารถทำได้คือค่าที่ไม่ซ้ำกันจะไม่ซ้ำกันทางสถิติ มีสถานการณ์ที่ตัวนับ nonce เชิงกำหนด + ต่อข้อความดีกว่า ซึ่งก็คือเมื่อคุณสามารถติดตามหมายเลขลำดับข้อความแต่ไม่ทราบความยาวของข้อความล่วงหน้า ซึ่งเป็นเรื่องปกติในโปรโตคอลการสื่อสาร แต่มันเกินขอบเขตสำหรับคำตอบของฉันที่นี่

โพสต์คำตอบ

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