ขนาดคีย์สำหรับ AES ถูกเลือกเป็น 256 เนื่องจากถือว่าเป็นขนาดคีย์ขั้นต่ำที่สามารถป้องกันการโจมตีด้วยกำลังดุร้ายได้ เช่น $2^{256}$ พยายาม
ไม่ถูกต้อง $2^{128}$ หรือ - แม่นยำกว่า - ขนาดคีย์ 128 บิตสำหรับ $2^{127}$ ความพยายามโดยเฉลี่ยถือว่าเพียงพอต่อการโจมตีจริง
อย่างไรก็ตาม ในทางปฏิบัติ สำหรับแอปพลิเคชันจำนวนมาก รหัสผ่านที่ผู้ใช้เลือกจะถูกใช้เพื่อรับคีย์ขนาด 256 โดยใช้ KDF สมมติว่าแอปพลิเคชันกำหนดรหัสผ่าน 8 อักขระ - นั่นคือรหัสผ่าน 64 บิต - ดังนั้นกำลังเดรัจฉานจึงลดลงเหลือ $2^{64}$ พยายาม และอาจลดลงมากกว่านี้อีก เนื่องจากไบต์จากรหัสผ่านทั่วไปมีค่าเอนโทรปีน้อยกว่าไบต์จากคีย์มาก
64 บิตเป็นความหวังลมๆ แล้งๆ รหัสผ่านที่มนุษย์สร้างขึ้น เฉลี่ยประมาณ 40 บิต. แน่นอน แม้แต่รหัสผ่านที่เลือกอย่างดีซึ่งมีอักขระ 8 ตัวโดยทั่วไปก็ยังใช้ชุดย่อยของ ASCII ซึ่งตัวมันเองเป็นชุดย่อยของค่าไบต์ที่เป็นไปได้ทั้งหมด ด้วยค่าพิเศษทั้งหมด 24 ค่าที่ใช้โดยทั่วไป ฉันได้รับค่า 86 ค่าจาก 256 เช่น $log_2(86) \ประมาณ 6.43$ บิตของเอนโทรปีต่อไบต์ หรือ $\ประมาณ 51.41$ บิตสำหรับ 8 อักขระดังกล่าว แต่นั่นเป็นเพียงเมื่อมีการสันนิษฐานว่ามีการแจกแจงที่สมบูรณ์แบบ และมนุษย์สร้างค่าแบบสุ่มได้แย่มาก
กำลังเดรัจฉานสามารถลองใช้ไบต์ที่ชาญฉลาดแทนที่จะใช้บิตที่ชาญฉลาดซึ่งจะช่วยลดกำลังเดรัจฉานให้น้อยกว่า $2^{64}$ พยายาม
โดยปกติคุณจะลองรหัสผ่านที่รู้จักก่อนหน้านี้จากฐานข้อมูลที่เสียหายหรือการโจมตีจากพจนานุกรม คุณจะไม่พยายามจำใจการโจมตีอื่นๆ เป็นไปได้หากการนำไปใช้งานเสียหาย เช่น หากไม่มีการใช้เกลือภายในคีย์ที่ได้มา
ดังนั้นหมายความว่า AES256 ที่มีรหัสผ่าน 32 ตัวก็ยังอ่อนแอกว่า AES256 ที่มีรหัสที่สร้างขึ้นแบบสุ่ม
ใช่. ผ้าเช็ดปากด้านหลังจะแสดงให้คุณเห็นว่าคุณหายไป $16 \คูณ 1.5 = 24$ บิตที่ อย่างน้อยที่สุด.
เหตุใดจึงไม่กังวล หรือฉันพลาดอะไรไป?
มันคือ ใหญ่ ข้อกังวล โดยทั่วไปคุณควรพยายามหลีกเลี่ยงการใช้รหัสผ่านเลย มิฉะนั้น คุณจะใช้ฟังก์ชันการสืบทอดคีย์ด้วยรหัสผ่านที่ใช้การยืดคีย์ เช่น หนึ่งในตัวแปร Argon2 (PBKDF2, scrypt และ bcrypt น่าจะเป็นที่รู้จักกันดี) แต่สิ่งเหล่านี้ให้การป้องกันเล็กน้อยสำหรับการได้มาของคีย์แต่ละรายการเท่านั้น ประมาณ 20 บิตสำหรับการวนซ้ำหนึ่งล้านครั้ง (เช่น $log_2(1,000,000)$ ใกล้จะ 20 แล้ว) มันจะไม่ยกคุณไปอย่างแน่นอน $2^{128}$ สำหรับรหัสผ่านทั่วไป $40 + 20 = 60$ บิต ดังนั้นการทำลายการเข้ารหัสจึงมีราคาแพง แต่ก็เป็นไปไม่ได้
ในกรณีที่ไม่สามารถหลีกเลี่ยงรหัสผ่านได้ ขอแนะนำให้คุณใช้ตัวจัดการรหัสผ่าน เช่น รหัสผ่าน 12 ตัวอักษรที่สร้างขึ้นแบบสุ่ม (อาจต้องมีสัญลักษณ์บางอย่างแสดงไว้ เผื่อคุณโชคร้าย) นั่นจะไม่ทำให้คุณเข้าใกล้ 128 บิต แต่มันก็เพียงพอแล้วสำหรับใครก็ตามที่ลองใช้กำลังดุร้ายหรือเทคนิคที่คล้ายกัน แน่นอนว่าเป็นไปได้ที่จะใช้อักขระเลขฐานสิบหกแบบสุ่ม 32 ตัวและเก็บรหัสไว้โดยสมมติว่าไม่จำกัดขนาดรหัสผ่าน
เคล็ดลับง่ายๆแสดงให้เห็นว่าคุณสามารถใช้ $$l_p = \bigg\lceil {l_k - \log_2(i) \over log_2(N)} \bigg\rceil$$ เพื่อเป็นการทราบจำนวนอักขระสำหรับแต่ละรหัสผ่าน สมมติว่าเราใช้ค่าด้านบน: $$\bigg\lceil {128 - \log_2(1,000,000) \over \log_2(86)} \bigg\rceil = \bigg\lceil {{128 - 20} \over 6.43} \bigg\rceil = 17$$ ขยายรหัสผ่านอักขระให้ถึง 128 บิตโดยใช้ KDF ที่มีการวนซ้ำ 1,000,000 ครั้ง สมมติว่าเป็นการสุ่มอย่างสมบูรณ์
วิธีหนึ่งในการหลีกเลี่ยงปัญหานี้คือการใช้การเข้ารหัสคีย์สาธารณะ และรักษาคีย์ส่วนตัวให้ปลอดภัยขั้นตอนหนึ่งของการปกป้องคีย์ส่วนตัวที่ใช้สำหรับการถอดรหัสอาจเป็นการเข้ารหัสที่ใช้รหัสผ่าน แต่คุณสามารถเริ่มต้นด้วยการเก็บไว้ในเมมโมรี่สติ๊ก เป็นต้น เพื่อให้ผู้โจมตีไม่สามารถเข้าถึงคีย์ดังกล่าวได้เมื่อไม่ต้องการ แน่นอนว่ามีวิธีอื่นมากมายในการจัดเก็บคีย์ที่ปลอดภัย
โปรดทราบว่านี่ไม่มีปัญหาเมื่อสามารถใช้มาตรการตอบโต้ได้ เช่น. โดยทั่วไปแล้ว PIN จะมีเพียง 4-6 หลัก แต่ข้อเท็จจริงที่ว่าคุณสามารถลองได้เพียง 3 ครั้งเท่านั้นที่จะช่วยป้องกันการโจมตีได้ (โดยทั่วไปแล้วรหัส PUK จะมีขนาดใหญ่กว่ามาก เนื่องจากมักจะไม่ปิดกั้น เนื่องจากอาจนำไปสู่การปฏิเสธการให้บริการได้ โจมตี) อย่างไรก็ตาม ตัวอย่างเช่น การเข้ารหัสไฟล์ การโจมตีแบบออฟไลน์ สามารถสันนิษฐานได้โดยทั่วไป