ฉันรู้ว่าพวกเขาต้องสุ่ม
ชนิดของ แม่นยำยิ่งขึ้น พวกเขาต้องเป็น แยกไม่ออกจากการสุ่ม.
เป้าหมายในการเลือกคีย์คือฝ่ายตรงข้าม ("ตัวร้าย") จะไม่สามารถหาคีย์ได้ เนื่องจากฝ่ายตรงข้ามอาจรู้ว่าระบบของเราทำงานอย่างไร (หลักการของเคิร์กฮอฟฟ์) เราต้องหาวิธีสร้างคีย์ที่ไม่ได้ขึ้นอยู่กับการคำนวณเชิงกำหนดเท่านั้น (ซึ่งฝ่ายตรงข้ามสามารถทำซ้ำได้) ดังนั้นกุญแจทั้งหมดต้องขึ้นอยู่กับบางสิ่งที่ฝ่ายตรงข้ามไม่รู้ สิ่งนี้เรียกว่าค่าสุ่ม âจริงâ
สามารถสร้างค่าสุ่มได้โดยใช้กระบวนการทางกายภาพที่คาดเดาไม่ได้ต่างๆ อุปกรณ์ที่ใช้กระบวนการดังกล่าวเรียกว่า ฮาร์ดแวร์หรือตัวสร้างตัวเลขสุ่ม âtrueâ (HRNG หรือ TRNG). สมาร์ทโฟนและพีซีสมัยใหม่เกือบทุกชนิด และอุปกรณ์ฝังตัวที่เพิ่มจำนวนขึ้น รวมถึง HRNG
เมื่อระบบได้รับ 'seeded' ด้วยค่าสุ่มจริงแล้ว ระบบจะสามารถใช้การคำนวณเชิงกำหนดที่เรียกว่า ตัวสร้างสุ่มหลอกที่ปลอดภัยแบบเข้ารหัส (CSPRNG) (เรียกสั้น ๆ ว่าตัวสร้างสุ่มเทียม) เพื่อสร้างกระแสค่าสุ่มที่ไม่มีที่สิ้นสุดในทางปฏิบัติ ค่าเหล่านี้เป็นค่าสุ่มในแง่ที่ว่าศัตรูที่มีพลังการประมวลผลจำกัดไม่สามารถแยกค่าเหล่านี้ออกจากค่าสุ่ม "จริง" ในบริบทการเข้ารหัส ตัวสร้างแบบสุ่ม (RNG) คือ CSPRNG ที่เพาะโดย HRNG
นั่นคือคุณสมบัติทั้งหมดที่จำเป็นหรือไม่?
แต่ละคีย์ต้องแยกไม่ออกจากการสุ่ม จากมุมมองของผู้ที่อาจเป็นปฏิปักษ์ นี่อาจหมายความว่าคีย์ถูกสร้างขึ้นแบบสุ่ม (ตามที่อธิบายไว้ด้านบน) แต่ไม่ใช่ว่าคีย์ทั้งหมดจะถูกสร้างขึ้นแบบสุ่ม: บางคีย์จะถูกคำนวณตามระดับที่กำหนดจากส่วนผสมของคีย์และอินพุตอื่นๆ กระบวนการดังกล่าวเรียกว่า ที่มาของคีย์. HKDF เป็นตัวอย่างของฟังก์ชันการได้มาของคีย์ ฟังก์ชันสุ่มเทียม (PRF) สามารถเป็นแบบเอกสารสำเร็จรูปสำหรับ KDF ตัวอย่างเช่น เมื่อคอมพิวเตอร์สองเครื่องสื่อสารผ่านช่องสัญญาณที่เข้ารหัส โดยทั่วไปแล้วจะได้รับคีย์เดียวกันจากความลับที่ใช้ร่วมกัน
“การสุ่ม” สำหรับคีย์ หมายถึงใกล้เคียงที่สุดเท่าที่จะเป็นไปได้ในการสุ่มแบบสม่ำเสมอระหว่างชุดคีย์ที่เป็นไปได้ ความหมายนี้ขึ้นอยู่กับประเภทของคีย์
โดยทั่วไป การเข้ารหัสแบบสมมาตรจะใช้คีย์ที่เป็นเพียงอาร์เรย์ของไบต์ และทำให้เกิด $n$คีย์ -bit หมายถึงการสร้าง $n$ บิตสุ่มและเรียกสิ่งนั้นว่าคีย์ สิ่งนี้เป็นจริง ตัวอย่างเช่น ของรหัสบล็อกเช่น AES และ Camellia ของรหัสสตรีม เช่น Chacha20 ของอัลกอริทึม MAC เช่น HMAC และ Poly1305 เป็นต้น
การเข้ารหัสแบบอสมมาตรแบบคลาสสิกใช้คีย์ที่เป็นตัวเลขที่มีคุณสมบัติบางอย่าง ดังนั้นการสร้างคีย์ดังกล่าวจึงต้องมีการคำนวณเพิ่มเติม วิธีทั่วไปในการสร้างคีย์ที่สามารถแสดงโดย $n$สตริงบิตคือการสร้าง $n$ บิตสุ่ม ตรวจสอบว่านี่แสดงถึงคีย์ที่ถูกต้องหรือไม่ และถ้าไม่ลองอีกครั้ง (ซึ่งถือว่าการแทนค่านั้นไม่ซ้ำกัน นั่นคือไม่มีคีย์ที่เหมือนกันสองคีย์ที่มีการแทนค่าแบบเดียวกัน) วิธีการนี้ใช้ได้ดีกับแบบทั่วไป อี.ซี.ซี คีย์ โดยที่คีย์ส่วนตัวคือตัวเลขระหว่าง $1$ และ $2^n - a$ กับ $a \ll 2^n$ดังนั้นจึงทำงานได้ดีในการสร้างการสุ่ม $n$บิตสตริงและตีความเป็นตัวเลขระหว่าง $0$ และ $2^n-1$ และลองอีกครั้งหากคุณพบหนึ่งในค่าที่ไม่ถูกต้อง cryptosystems อื่น ๆ เช่น อาร์.เอส.เอซึ่งเกี่ยวข้องกับกระบวนการสร้างคีย์ที่ซับซ้อนกว่ามาก แต่ถึงอย่างนั้น ก็ยังใช้ “สร้างสตริงบิตแบบสุ่ม” และ “ลองอีกครั้งหากค่าไม่เหมาะสม” เป็นส่วนประกอบ