OpenSSL aes-128-cfb ไม่ได้ขนาดที่คาดไว้
ฉันพยายามใช้aes-128-cfb ด้วยตัวเองเพื่อการเรียนรู้ เพื่อยืนยันว่าการใช้งานของฉันถูกต้องหรือไม่ฉันต้องการยืนยันกับไลบรารีที่รู้จักกันดีเช่น OpenSSL แต่แล้วฉันก็สังเกตเห็นบางอย่างแปลก ๆ เมื่อพยายามใช้ OpenSSL เพื่อเข้ารหัส
ฉันมีไฟล์ที่cleartext.txt
มีเนื้อหาต่อไปนี้:
This is cleartext that will be used to encrypt with OpenSSL.
จากนั้นฉันก็รันคำสั่งนี้
openssl enc -aes-128-cfb -in cleartext.txt -K 48656c6c6f20576f726c642041455321 -iv 72616e646f6d20313662797465206976 -out output.txt
สิ่งที่แปลกคือไฟล์เอาต์พุตมีเพียง 60 ไบต์ บล็อก AES คือ 16 ไบต์ ขนาดเอาต์พุตที่คาดไว้เป็นไบต์ควรเป็นทวีคูณของ 16 60 ไม่ใช่ผลคูณของ 16
ฉันพลาดสิ่งสำคัญที่นี่ไปหรือเปล่า?
คำตอบ
เนื่องจาก CFB ไม่ต้องการช่องว่างภายในคล้ายกับโหมดการทำงานของ CTR และ OFB โหมดเหล่านี้จะสร้างบล็อกการเข้ารหัสและอีกโหมดหนึ่งใช้จำนวนที่จำเป็นจากโหมดเหล่านี้
ในกรณีที่สี่ไม่ได้เขียนไปยังแฟ้มผลลัพธ์
openssl enc -K -iv
output.txt
ดังนั้นจึงมีขนาดเท่ากับข้อความธรรมดาในหน่วยไบต์61
แต่ละไบต์สำหรับไฟล์ของฉัน ในกรณีนี้คุณต้องจัดการ IV เนื่องจากคุณให้ IV ด้วยโปรดตรวจสอบให้แน่ใจว่าไม่ได้ใช้อีก มิฉะนั้นการลากเปลอาจเกิดขึ้นในโหมด CTR หรือใช้คีย์ของ OTP ซ้ำในกรณีของ
-k/-kfile/-pass
IV และ Key ได้มาจากวิธีการหาคีย์โดยใช้รหัสผ่านของผู้ใช้และเกลือสุ่ม 8 ไบต์OpenSSL แรกเขียนมายากลไฟล์ของ
Salted__
แล้วเกลือ 8 ไบต์แล้ว ciphertext ลงในแฟ้ม ตอนนี้ขนาดเอาต์พุตคือmagic size + salt size + data-size
ไฟล์. ในระบบของฉัน8+8+61 = 77
ไบต์หากใช้โหมด ECB
openssl enc -aes-128-ecb -in cleartext.txt -k -pass -out output.txt
จากนั้นขนาดจะเป็น
80
ไบต์เนื่องจากช่องว่างภายใน แน่นอน ECB ไม่ได้ใช้ IV และควรลืมโหมดนี้ไป!โหมด CBC มีผลลัพธ์ที่คล้ายกันกับ ECB
ขนาด IV ที่ได้รับสามารถเปลี่ยนแปลงได้ตามการเข้ารหัสที่ใช้ algoritm เช่น 8-byte block cipher TDES และ Blowfish ต้องใช้ 8-byte IV และ 16-byte block ciphers เช่น AES และ Twofish ต้องใช้ 16 ไบต์ IV
เมื่อใช้รหัสผ่านเราอาจต้องระวังเกี่ยวกับเอนโทรปีของรหัสผ่านและวิธีการหาคีย์ที่ใช้ ขอแนะนำให้ใช้รหัสผ่าน Diceware และอย่างน้อย PBKDF2 สำหรับการได้มาของคีย์ OpenSSL มีวิธีการต่างๆสำหรับการหาคีย์