ฉันจะกำหนดโหมด ciphers & cipher ที่ฉันสามารถใช้ใน dm-crypt / LUKS ได้อย่างไร


14

ฉันใช้ระบบที่ใช้ Ubuntu และฉันมีปัญหาในการพิจารณาว่าโหมด ciphers และ cipher มีให้ฉันแบบใด

หน้าคน cryptsetup พูดว่า:

"ดู / proc / crypto เพื่อดูรายการตัวเลือกที่มีคุณอาจต้องโหลดโมดูลเคอร์เนล crypto เพิ่มเติมเพื่อรับตัวเลือกเพิ่มเติม"

/ proc / crypto ของฉันมีน้อยมาก ฉันจะค้นหาโมดูล crypto เคอร์เนลพิเศษที่ให้ฉันโหลดได้อย่างไร


/lib/modules/*/kernel/crypto/เป็นสถานที่ที่น่ามอง แต่โมดูลสามารถอยู่ที่ใดก็ได้ในระบบไฟล์
ทำเครื่องหมาย

2
ฉันคิดว่านี่เป็นคำถามที่ดี ฉันกำลังมองหาข้อมูลนี้ด้วยตัวเอง /proc/cryptoดีมาก แต่ไม่ได้แสดงรายการสตริงการเข้ารหัสที่ถูกต้อง สิ่งที่ต้องการหรือaes-xts-plain64 aes-cbc-essiv:sha256คำตอบที่ดีจะให้ข้อมูลนั้นและแสดงโมดูลที่/lib/modules...ต้องการโหลดเพื่อใช้งาน
starfry

@starfry ฉันสนใจสิ่งนี้เช่นกัน /proc/cryptoขณะที่ไม่มีการติดต่อการตั้งชื่อระหว่างสิ่งที่สตริงตัวเลขที่ควรจะเป็นและสิ่งที่อยู่ภายในของฉัน มันไม่สมเหตุสมผล
CMCDragonkai

คำตอบ:


10

มีเอกสารและ man page มากมายให้อ่าน แต่มีเอกสารหนึ่งที่คุณอาจสนใจเป็นพิเศษคือข้อกำหนดคุณสมบัติการจัดรูปแบบ LUKS On-Disk (PDF)

ภาคผนวก B (ซึ่งเป็นธรรมชาติใกล้ถึงจุดสิ้นสุด) กล่าวว่า

รีจิสตรี Cipher and Hash

แม้ว่าสตริงcipher-nameและcipher-modeจะไม่ถูกตีความโดยการดำเนินการ LUKS ใด ๆ พวกเขาจะต้องมีความหมายเดียวกันสำหรับการใช้งานทั้งหมดเพื่อให้บรรลุความเข้ากันได้ระหว่างการใช้งานที่ใช้ LUKS ที่แตกต่างกัน LUKS ต้องตรวจสอบให้แน่ใจว่าระบบการเข้ารหัสที่อยู่ภายใต้สามารถใช้ชื่อตัวเลขและสตริงโหมดการเข้ารหัสและเนื่องจากสตริงเหล่านี้อาจไม่ได้เป็นระบบของรหัสศูนย์เสมอ LUKS อาจจำเป็นต้องแมปสิ่งเหล่านั้นลงในบางสิ่งที่เหมาะสม

ชื่อรหัสที่ถูกต้องแสดงอยู่ในตารางที่ 1

โหมดการเข้ารหัสที่ถูกต้องแสดงอยู่ในตารางที่ 2 ตามสัญญาโหมดการเข้ารหัสที่ใช้ IV และ tweaks จะต้องเริ่มต้นจาก IV / tweak ทั้งหมดที่เป็นศูนย์ สิ่งนี้ใช้สำหรับการโทรทั้งหมดไปยังการเข้ารหัส / ถอดรหัสพื้นฐานโดยเฉพาะเมื่อจัดการกับวัสดุที่สำคัญ นอกจากนี้โหมดการเข้ารหัส IVs / tweaks เหล่านี้มักจะตัดกระแสการเข้ารหัสลงในบล็อกอิสระโดย reseeding tweaks / IVs ที่ขอบเขตของเซกเตอร์ ข้อกำหนด IV / tweak ทั้งหมดเป็นศูนย์สำหรับบล็อกที่เข้ารหัส / ถอดรหัสครั้งแรกเทียบเท่ากับข้อกำหนดที่บล็อกแรกถูกกำหนดให้พักที่เซกเตอร์ 0

ตารางที่ 3 แสดงรายการข้อกำหนดแฮชที่ถูกต้องสำหรับเขตข้อมูลแฮช การใช้งานตามมาตรฐานนั้นไม่จำเป็นต้องรองรับการเข้ารหัส, โหมดการเข้ารหัสทั้งหมดหรือข้อกำหนดแฮช

ตารางที่ 1: ชื่อรหัสที่ถูกต้อง

  • aes - มาตรฐานการเข้ารหัสขั้นสูง - FIPS PUB 197
  • twofish - Twofish: ตัวเข้ารหัสบล็อก 128 บิต - http://www.schneier.com/paper-twofish-paper.html     (ดูด้านล่าง)
  • serpent - http://www.cl.cam.ac.uk/~rja14/serpent.html
  • cast5 - RFC 2144
  • cast6 - RFC 2612

ตารางที่ 2: โหมดการเข้ารหัสที่ถูกต้อง

  • ecb - เอาท์พุทตัวเลขจะถูกใช้โดยตรง
  • cbc-plain - รหัสจะทำงานในโหมด CBC การเชื่อมโยง CBC ถูกตัดทุกภาคส่วนและเริ่มต้นใหม่ด้วยหมายเลขภาคเป็นเวกเตอร์เริ่มต้น (แปลงเป็น 32 บิตและเป็น Endian น้อย) โหมดนี้ถูกระบุใน [Fru05b], บทที่ 4
  • cbc-essiv: hash - รหัสถูกดำเนินการในโหมด ESSIV โดยใช้แฮชสำหรับสร้างคีย์ IV สำหรับรหัสเดิม ตัวอย่างเช่นเมื่อใช้ sha256 เป็นแฮชข้อมูลจำเพาะโหมดการเข้ารหัสคือ“ cbcessiv: sha256” ESSIV ถูกระบุใน [Fru05b], บทที่ 4
  • xts-plain64 - http://grouper.ieee.org/groups/1619/email/pdf00086.pdf, plain64เป็นเวกเตอร์เริ่มต้นธรรมดารุ่น 64 บิต

ตารางที่ 3: ข้อมูลจำเพาะแฮชที่ถูกต้อง

  • sha1 - RFC 3174 - อัลกอริทึมแฮชที่ปลอดภัยของสหรัฐอเมริกา 1 (SHA1)
  • sha256 - ชุดตัวแปร SHA ตาม FIPS 180-2
  • sha512 - ชุดตัวแปร SHA ตาม FIPS 180-2
  • ripemd160 - http://www.esat.kuleuven.ac.be/~bosselae/ripemd160.html    (ดูด้านล่าง)

หมายเหตุบรรณาธิการ: ข้อความข้างต้นถูกคัดลอกมาจากข้อกำหนด ภายหลังการเขียน URL ของเอกสารเหล่านี้มีการเปลี่ยนแปลง:


1

คุณสามารถแสดงรายการรหัสยันต์ที่เคอร์เนลรองรับได้ด้วยคำสั่งต่อไปนี้

[root@arif]# ls /lib/modules/[your kernel version]/kernel/crypto/
algif_rng.ko.xz   blowfish_common.ko.xz   cmac.ko.xz               cts.ko.xz          gf128mul.ko.xz           michael_mic.ko.xz  rsa_generic.ko.xz      tgr192.ko.xz           xts.ko.xz
ansi_cprng.ko.xz  blowfish_generic.ko.xz  crc32_generic.ko.xz      deflate.ko.xz      ghash-generic.ko.xz      pcbc.ko.xz         salsa20_generic.ko.xz  twofish_common.ko.xz   zlib.ko.xz
anubis.ko.xz      camellia_generic.ko.xz  crct10dif_common.ko.xz   des_generic.ko.xz  jitterentropy_rng.ko.xz  pcrypt.ko.xz       seed.ko.xz             twofish_generic.ko.xz
arc4.ko.xz        cast5_generic.ko.xz     crct10dif_generic.ko.xz  dh_generic.ko.xz   khazad.ko.xz             rmd128.ko.xz       serpent_generic.ko.xz  vmac.ko.xz
async_tx          cast6_generic.ko.xz     cryptd.ko.xz             drbg.ko.xz         lrw.ko.xz                rmd160.ko.xz       sha512_generic.ko.xz   wp512.ko.xz
authencesn.ko.xz  cast_common.ko.xz       crypto_null.ko.xz        fcrypt.ko.xz       mcryptd.ko.xz            rmd256.ko.xz       tcrypt.ko.xz           xcbc.ko.xz
authenc.ko.xz     ccm.ko.xz               crypto_user.ko.xz        gcm.ko.xz          md4.ko.xz                rmd320.ko.xz       tea.ko.xz              xor.ko.xz

คุณสามารถแสดงรายการรหัสและแฮชที่คุณสามารถใช้และการเปรียบเทียบ I / O ของพวกเขาได้luksโดยใช้คำสั่งต่อไปนี้

[root@arif arif]# cryptsetup benchmark
# Tests are approximate using memory only (no storage IO).
PBKDF2-sha1       289342 iterations per second for 256-bit key
PBKDF2-sha256     353293 iterations per second for 256-bit key
PBKDF2-sha512     227555 iterations per second for 256-bit key
PBKDF2-ripemd160  233224 iterations per second for 256-bit key
PBKDF2-whirlpool  236165 iterations per second for 256-bit key
argon2i       4 iterations, 917485 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time)
argon2id      4 iterations, 951672 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time)
#     Algorithm |       Key |      Encryption |      Decryption
        aes-cbc        128b       642.2 MiB/s      2495.8 MiB/s
    serpent-cbc        128b        89.3 MiB/s       542.6 MiB/s
    twofish-cbc        128b       100.4 MiB/s       343.1 MiB/s
        aes-cbc        256b       477.2 MiB/s      1979.2 MiB/s
    serpent-cbc        256b        89.3 MiB/s       538.9 MiB/s
    twofish-cbc        256b       173.3 MiB/s       343.1 MiB/s
        aes-xts        256b      1668.0 MiB/s      1664.1 MiB/s
    serpent-xts        256b       535.7 MiB/s       523.4 MiB/s
    twofish-xts        256b       332.6 MiB/s       339.8 MiB/s
        aes-xts        512b      1384.5 MiB/s      1380.7 MiB/s
    serpent-xts        512b       539.3 MiB/s       524.4 MiB/s
    twofish-xts        512b       335.0 MiB/s       340.1 MiB/s

คุณสามารถเปรียบเทียบเลขศูนย์เฉพาะได้โดยใช้คำสั่งต่อไปนี้

[root@arif]# ciphers="aes-xts serpent-xts anubis-xts"

[root@arif]# echo "#     Algorithm |       Key |      Encryption |      Decryption";for i in $ciphers ; do cryptsetup benchmark --cipher $i|tail -n 1; done

#     Algorithm |       Key |      Encryption |      Decryption
        aes-xts        256b      1613.9 MiB/s      1642.8 MiB/s
    serpent-xts        256b       538.9 MiB/s       521.9 MiB/s
     anubis-xts        256b       182.0 MiB/s       182.1 MiB/s


คุณจะรู้ได้อย่างไรว่าไฟล์ 58 ไฟล์ข้างบนแปลงเป็นโหมดเข้ารหัสที่เข้ากันได้กับ cryptsetup มันไม่สามารถเป็นคำสั่งเปรียบเทียบได้เนื่องจากไม่ได้แสดงรายการ anubis-xts ...
Xen2050

1

เคอร์เนล 5.1 ซึ่งเป็นปัจจุบันในขณะที่ฉันเขียนมีสองรูปแบบที่แตกต่างกันสำหรับสตริงตัวเลขรูปแบบ "เก่า" และรูปแบบ "ใหม่" ทุกอย่างในคำถามนี้และเห็นได้ชัดว่าเอกสารทั้งหมดเกี่ยวข้องกับรูปแบบ "เก่า" ดังนั้นฉันจะอธิบายที่นี่ นี่เป็นเพียงการเข้ารหัส หากใช้ integrity กับ dm-crypt ต้องพิจารณา ciphers ของ AEAD และมันซับซ้อนมากขึ้น

รูปแบบการแยกวิเคราะห์โดยเคอร์เนลคือ " cipher [ :keycount ] -โหมด-ivmode [ :ivopts ]" aes-xts-plain64ตัวอย่าง: blowfish-cbc-essiv:sha256, aes:64-cbc-lmk,

  • Cipher เลขศูนย์ที่จะใช้ตัวอย่างaes,anubis,twofish,arc4ฯลฯ ไดรเวอร์ DM-ฝังศพใต้ถุนโบสถ์เคอร์เนลไม่ได้มีรายชื่อของยันต์ นี่คือการส่งผ่านไปยัง Linux Crypto API ดังนั้นรหัสที่เหมาะสมใด ๆ ที่สนับสนุนโดยเคอร์เนลสามารถใช้ได้

  • keycount พลังงานทางเลือกของจำนวนสองปุ่มเพื่อใช้กับรหัส ค่าเริ่มต้นนี้เป็น 1 สำหรับทุกอย่างยกเว้นlmkivmode ซึ่งเป็นค่าเริ่มต้นที่ 64 ซึ่งใช้กับ LMK เท่านั้นและค่าอื่น ๆ ที่ไม่ใช่ 1 จะไม่ทำงานอย่างถูกต้องกับโหมดอื่น ๆ

  • mode โหมดบล็อกการเชื่อมต่อที่จะใช้กับรหัส ตัวอย่างเช่นecb,,cbc xtsนอกเหนือจากการรู้ว่าecbไม่มี IV แล้วไดรเวอร์ md-crypt จะส่งผ่านสิ่งนี้ไปยัง Linux Crypto API และสามารถใช้โหมดการโยงใด ๆ ที่เคอร์เนลสนับสนุน

  • ivmodeอัลกอริทึมที่ใช้ในการสร้างเวกเตอร์เริ่มต้น (IV) สำหรับแต่ละภาค ในการเข้ารหัสคีย์แบบสมมาตรทั่วไปซึ่งแตกต่างจาก DM-crypt, IV เป็นอีกบิตของข้อมูลที่ส่งผ่านไปยังตัวเลขพร้อมกับคีย์เมื่อทำการเข้ารหัสหรือถอดรหัส มีการส่งผ่าน IV เพียงครั้งเดียวสำหรับการดำเนินการทั้งหมด เนื่องจาก dm-crypt จำเป็นต้องสามารถอ่านและเขียนแต่ละส่วนได้จึงไม่เข้ารหัสดิสก์ทั้งหมดเป็นการดำเนินการเดียว แต่มี IV สำหรับแต่ละภาคส่วน แทนที่จะส่งผ่านข้อมูลเป็น IV อัลกอริทึมสำหรับการสร้าง IV จะถูกระบุที่นี่ นี่ไม่ใช่ส่วนหนึ่งของ Linux Crypto API เนื่องจากการสร้าง IV ไม่ได้ทำโดยการเข้ารหัสและค่า ivmode ที่อนุญาตถูกกำหนดไว้ในไดรเวอร์ dm-crypt พวกเขาคือ:

    • plain, plain64, plain64be, benbi เหล่านี้ก็ใช้ตัวเลขภาคในรูปแบบต่างๆเช่นที่สี่ หมายถึงโหมดบล็อกเช่น XTS ที่ออกแบบมาเพื่อต่อต้านการโจมตีเช่นลายน้ำเมื่อใช้ IV ที่ง่ายและคาดการณ์ได้ plain64ดูเหมือนจะแนะนำมากที่สุด
    • nullIV เป็นศูนย์เสมอ สำหรับการทดสอบและความเข้ากันได้แบบย้อนหลังคุณไม่ควรใช้สิ่งนี้
    • lmk เข้ากันได้กับรูปแบบการเข้ารหัส Loop-AES
    • tcw เข้ากันได้กับ TrueCrypt
    • essivใช้หมายเลขเซ็กเตอร์ที่เข้ารหัสด้วยแฮชของคีย์ ความหมายสำหรับโหมดเช่น CBC, ที่ไม่ทนต่อการโจมตีต่างๆเมื่อใช้ IV plain64ง่ายๆเช่น
  • ivoptsแฮชที่จะใช้กับessiv ivmode จะถูกข้ามสำหรับโหมดอื่น ๆ ทั้งหมด

ในกรณีพิเศษ " cipher-plain " หรือเพียงแค่ " cipher " ถูกตีความว่าเป็น " cipher-cbc-plain " อีกกรณีพิเศษคือecbโหมดนั้นไม่มีโหมดivmodeให้ระบุ

สิ่งนี้เกี่ยวข้องกับ /proc/crypto

ด้วยความเคารพ/proc/cryptoเฉพาะตัวเลขและโหมดมีความเกี่ยวข้อง DM-crypt พร้อมสร้าง Crypto API ของรูปแบบ " โหมด(ตัวเลข) " และร้องขอสิ่งนี้จากเคอร์เนล นี่คือสิ่งหนึ่งที่ควรมองหาใน/proc/cryptoขณะที่สำหรับname skcipherตัวอย่าง:

name         : xts(aes)
driver       : xts-aes-aesni
module       : kernel
priority     : 401
refcnt       : 1
selftest     : passed
internal     : no
type         : skcipher
async        : yes
blocksize    : 16
min keysize  : 32
max keysize  : 64
ivsize       : 16
chunksize    : 16
walksize     : 16

typeของskcipherบ่งชี้นี้ตัวเลขที่สำคัญสมมาตรสิ่ง DM-ฝังศพใต้ถุนโบสถ์การใช้งานและชื่อของxts(aes)จะถูกเขียนaes-xtsเมื่อระบุไว้กับ DM-ฝังศพใต้ถุนโบสถ์ keysizeสาขานอกจากนี้ยังบอกเราว่าขนาดของคีย์ที่สามารถนำมาใช้กับการเข้ารหัสนี้

หากนี่มาจากโมดูลชื่อโมดูลอาจปรากฏขึ้นในmoduleบรรทัด อย่างไรก็ตาม ciphers จำนวนมาก (โดยปกติแล้วจะอยู่ในซอฟต์แวร์ที่ไม่มีรหัสเฉพาะฮาร์ดแวร์) ถูกนำไปใช้เป็นตัวเลขทั่วไปที่รวมกับรหัสบล็อกผูกมัดทั่วไปเพื่อสร้าง skcipher สุดท้าย ตัวอย่างเช่น:

name         : xts(anubis)
driver       : xts(ecb(anubis-generic))
module       : kernel
type         : skcipher

name         : anubis
driver       : anubis-generic
module       : anubis
type         : cipher

ในกรณีนี้การเข้ารหัสสุสานจะถูกรวมกับ XTS เคอร์เนลบล็อกผูกมัดรหัสโหมดการผลิตตัวเลขสุดท้ายซึ่งได้รับมอบหมายโมดูลของxts(anbuis) kernelแต่เพื่อให้มีสิ่งนี้เราต้องใช้รหัสสุสานทั่วไปซึ่งมาจากanubisโมดูล ciphers ส่วนใหญ่มีนามแฝงของโมดูล " crypto-cipher " ที่สามารถใช้ในการโหลดได้เช่นmodprobe crypto-anubisจะโหลดโมดูลที่ให้การเข้ารหัสของสุสาน

เมื่อใช้cryptsetup benchmarkคำสั่งเฉพาะตัวเลขและโหมดมีความสำคัญเนื่องจากนั่นคือทั้งหมดที่เป็นเกณฑ์มาตรฐาน หากไม่ได้ระบุโหมดไว้จะใช้ค่าเริ่มต้นเป็น CBC ivmodeจะถูกละเว้นทั้งหมด ดังนั้นสำหรับการเปรียบเทียบaes, aes-cbcและaes-cbc-foobarเทียบเท่าทุก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.