Bagaimana cara menentukan cipher & mode cipher apa yang dapat saya gunakan dalam dm-crypt / LUKS?

14

Saya menggunakan sistem berbasis Ubuntu, dan saya mengalami kesulitan menentukan cipher dan mode cipher apa yang tersedia untuk saya.

Halaman manual cryptsetup mengatakan:

"Lihat / proc / crypto untuk daftar opsi yang tersedia. Anda mungkin perlu memuat modul crypto kernel tambahan untuk mendapatkan lebih banyak opsi."

/ Proc / crypto saya memiliki sangat sedikit di dalamnya. Bagaimana saya mengetahui modul crypto kernel tambahan apa yang tersedia untuk saya muat?


sumber
/lib/modules/*/kernel/crypto/mungkin tempat untuk melihat, tetapi modul dapat di mana saja di sistem file.
Tandai
2
Saya pikir ini adalah pertanyaan yang bagus. Saya sendiri sudah mencari informasi ini. /proc/cryptobagus, tetapi tidak mencantumkan string cipher yang valid; hal-hal seperti aes-xts-plain64atau aes-cbc-essiv:sha256. Jawaban yang bagus akan memberikan informasi itu dan menunjukkan modul mana dari yang /lib/modules...perlu dimuat untuk menggunakannya.
Starfry
@ Starfry Saya tertarik dengan ini juga. Karena tidak ada korespondensi penamaan antara apa yang seharusnya menjadi string cipher dan apa yang ada di dalam saya /proc/crypto. Itu tidak masuk akal.
CMCDragonkai

Jawaban:

10

Ada banyak, banyak dokumen dan halaman manual untuk dibaca, tetapi satu dokumen yang mungkin menarik bagi Anda adalah Spesifikasi Format On-Disk LUKS (PDF).

Lampiran B (yang, secara alami, mendekati akhir) mengatakan,

Registri spesifikasi sandi dan Hash

Sekalipun string cipher-name dan cipher-mode tidak diinterpretasikan oleh operasi LUKS apa pun, mereka harus memiliki makna yang sama untuk semua implementasi untuk mencapai kompatibilitas di antara berbagai implementasi berbasis LUKS. LUKS harus memastikan bahwa sistem sandi yang mendasari dapat memanfaatkan string nama sandi dan mode sandi, dan karena string ini mungkin tidak selalu asli dari sistem sandi, LUKS mungkin perlu memetakannya menjadi sesuatu yang sesuai.

Nama sandi yang valid tercantum dalam Tabel 1.

Mode cipher yang valid tercantum dalam Tabel 2. Berdasarkan kontrak, mode cipher menggunakan IV dan tweak harus dimulai dari all-zero IV / tweak. Ini berlaku untuk semua panggilan ke primitif terenkripsi / dekripsi terutama ketika menangani materi utama. Selanjutnya, mode sandi IVs / tweak ini biasanya memotong aliran sandi menjadi blok independen dengan memasang kembali tweaks / IV pada batas-batas sektor. Persyaratan IV / tweak all-zero untuk blok terenkripsi / dekripsi pertama adalah setara dengan persyaratan bahwa blok pertama didefinisikan untuk beristirahat di sektor 0.

Tabel 3 daftar spesifikasi hash yang valid untuk bidang hash-spec . Implementasi yang sesuai tidak harus mendukung semua cipher, mode cipher atau spesifikasi hash.

Tabel 1: Nama sandi yang valid

  • aes - Standar Enkripsi Lanjutan - FIPS PUB 197
  • twofish - Twofish: A 128-Bit Block Cipher - http://www.schneier.com/paper-twofish-paper.html     (Lihat di bawah)
  • ular - http://www.cl.cam.ac.uk/~rja14/serpent.html
  • cast5 - RFC 2144
  • cast6 - RFC 2612

Tabel 2: Mode sandi yang valid

  • ecb - Output cipher digunakan secara langsung
  • cbc-plain - Cipher dioperasikan dalam mode CBC. Rantai CBC dipotong setiap sektor, dan diinisialisasi ulang dengan nomor sektor sebagai vektor awal (dikonversi menjadi 32-bit dan menjadi little-endian). Mode ini ditentukan dalam [Fru05b], Bab 4.
  • cbc-essiv: hash - Cipher dioperasikan dalam mode ESSIV menggunakan hash untuk menghasilkan kunci IV untuk kunci asli. Misalnya, ketika menggunakan sha256 sebagai hash, spec mode cipher adalah "cbcessiv: sha256". ESSIV ditentukan dalam [Fru05b], Bab 4.
  • xts-plain64 - http://grouper.ieee.org/groups/1619/email/pdf00086.pdf, plain64 adalah versi 64-bit dari vektor awal polos

Tabel 3: Spesifikasi hash yang valid

  • sha1 - RFC 3174 - US Secure Hash Algorithm 1 (SHA1)
  • sha256 - varian SHA menurut FIPS 180-2
  • sha512 - Varian SHA menurut FIPS 180-2
  • ripemd160 - http://www.esat.kuleuven.ac.be/~bosselae/ripemd160.html    (Lihat di bawah)

Catatan Editor: Di atas disalin dari spesifikasi. Setelah penulisan, URL dokumen-dokumen ini telah berubah:

notdavidcronenberg
sumber
1

Anda dapat membuat daftar cipher yang didukung oleh kernel Anda dengan perintah berikut,

[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

Anda dapat membuat daftar cipher dan hash yang dapat Anda gunakan dan perbandingan I / O mereka dengan luksoleh perintah berikut,

[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

Anda dapat membandingkan sandi tertentu dengan perintah berikut,

[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

muhammad
sumber
Bagaimana Anda tahu mana dari 58 file di atas yang dikonversi menjadi mode cipher yang kompatibel dengan cryptsetup? Itu tidak bisa menjadi perintah benchmark karena tidak mencantumkan anubis-xts ...
Xen2050
1

Kernel 5.1, saat ini pada saat saya menulis ini, memiliki dua format berbeda untuk string cipher, format "lama" dan format "baru". Segala sesuatu dalam pertanyaan ini sejauh ini, dan tampaknya semua dokumen juga, berkaitan dengan format "lama", jadi saya akan jelaskan di sini. Ini hanya untuk enkripsi. Jika menggunakan integritas dengan dm-crypt, maka seseorang harus mempertimbangkan cipher AEAD dan itu menjadi semakin rumit.

Format yang diuraikan oleh kernel adalah " cipher [ :keycount ] -mode -ivmode [ :ivopts ]". Contoh: aes-xts-plain64, blowfish-cbc-essiv:sha256, aes:64-cbc-lmk.

  • cipher cipher The penggunaan, contoh adalahaes,anubis,twofish,arc4, dll kernel pengemudi dm-crypt tidak memiliki daftar cipher. Ini diteruskan ke Linux Crypto API, sehingga cipher yang cocok yang didukung oleh kernel dapat digunakan.

  • keycount Kekuatan opsional dua tombol untuk digunakan dengan sandi. Ini default ke 1 untuk semuanya kecualilmkivmode, di mana defaultnya ke 64. Ini benar-benar hanya berlaku untuk LMK dan nilai selain 1 tidak akan bekerja dengan baik dengan mode lain.

  • mode Blok chaining mode untuk digunakan dengan cipher. Contohnya adalahecb,cbc,xts. Selain mengetahui bahwaecbtidak menggunakan IV, driver md-crypt melewati ini ke Linux Crypto API dan dapat menggunakan mode chaining yang didukung oleh kernel.

  • ivmode Algoritma yang digunakan untuk menghasilkan vektor inisialisasi (IV) untuk setiap sektor. Dalam enkripsi kunci simetris tipikal, tidak seperti dm-crypt, IV adalah data lain yang dikirimkan ke dalam cipher bersama dengan kunci ketika mengenkripsi atau mendekripsi. Hanya ada satu IV yang diteruskan untuk seluruh operasi. Karena dm-crypt perlu dapat membaca dan menulis masing-masing sektor secara individual, ia tidak mengenkripsi seluruh disk sebagai operasi tunggal. Sebaliknya, ada IV untuk setiap sektor. Daripada meneruskan IV sebagai data, algoritma untuk membuat IV ditentukan di sini. Ini bukan bagian dari Linux Crypto API, karena generasi IV tidak dilakukan oleh cipher, dannilai-nilai ivmode yang diizinkandidefinisikan sebagai driver dm-crypt. Mereka:

    • plain, plain64, plain64be, benbi Ini hanya menggunakan jumlah sektor, dalam berbagai format, seperti IV. Dimaksudkan untuk mode blok seperti XTS yang dirancang untuk menahan serangan seperti watermarking saat menggunakan IV yang sederhana dan dapat diprediksi. plain64tampaknya paling direkomendasikan.
    • nullIV selalu nol. Untuk pengujian dan kompatibilitas mundur, Anda tidak harus menggunakan ini.
    • lmk Kompatibel dengan skema enkripsi Loop-AES.
    • tcw Kompatibel dengan TrueCrypt.
    • essivMenggunakan nomor sektor yang dienkripsi dengan hash kunci. Dimaksudkan untuk mode, seperti CBC, yang tidak tahan terhadap berbagai serangan ketika menggunakan IV sederhana plain64.
  • ivopts Hash untuk digunakan denganessiv ivmode , diabaikan untuk semua mode lainnya.

Sebagai kasus khusus, " sandi-plain " atau hanya " sandi " ditafsirkan sebagai " sandi-cbc-plain ". Kasus khusus lain adalah bahwa ecbmode tidak memiliki ivmode untuk ditentukan.

Bagaimana ini berhubungan dengan /proc/crypto

Sehubungan dengan itu /proc/crypto, hanya cipher dan mode yang relevan. dm-crypt dengan membangun spesifikasi API Crypto dari bentuk " mode (cipher) " dan meminta ini dari kernel. Ini adalah apa yang harus dicari /proc/cryptosebagai nameuntuk a skcipher. Contoh:

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

The typedari skciphermenunjukkan ini cipher simetrik key, apa kegunaan dm-crypt, dan nama xts(aes)akan ditulis aes-xtsketika ditentukan dengan dm-crypt. Kolom keysizejuga memberi tahu kami ukuran kunci apa yang dapat digunakan dengan sandi ini.

Jika ini dari modul, nama modul mungkin muncul di modulebaris. Namun, banyak cipher (biasanya dalam perangkat lunak yang tidak memiliki kode spesifik perangkat keras) diimplementasikan sebagai cipher generik yang dikombinasikan dengan kode rantai blok generik untuk menghasilkan skcipher akhir. Sebagai contoh:

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

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

Dalam hal ini cipher anubis dikombinasikan dengan kode mode rantai blok XTS kernel untuk menghasilkan cipher terakhir xts(anbuis), yang telah diberi modul kernel. Tetapi untuk mendapatkan ini tersedia kita perlu cipher anubis generik, yang berasal dari anubismodul. Kebanyakan cipher memiliki alias modul " crypto-cipher " yang dapat digunakan untuk memuatnya, misalnya modprobe crypto-anubisakan memuat modul yang menyediakan cipher anubis.

Saat menggunakan cryptsetup benchmarkperintah, hanya cipher dan mode yang penting, karena hanya itu yang ditentukan. Jika mode tidak ditentukan, standarnya adalah CBC. The ivmode benar-benar diabaikan. Dengan demikian, untuk benchmarking, aes, aes-cbc, dan aes-cbc-foobarsemua setara.

TrentP
sumber