Ubuntuベースのシステムを使用していますが、使用できる暗号と暗号モードを判別するのが困難です。
Cryptsetup manページには次のように書かれています:
「使用可能なオプションのリストについては、/ proc/cryptoを参照してください。追加のオプションを取得するには、追加のカーネル暗号化モジュールをロードする必要がある場合があります。」
私の/ proc/cryptoにはほとんどありません。ロードできる追加のカーネル暗号化モジュールを見つけるにはどうすればよいですか?
読む必要のあるドキュメントやマニュアルページは多数ありますが、特に興味があるのは LUKS On-Disk Format Specification (PDF)です。
付録B(当然のことながら、終わりに近い)は、
暗号およびハッシュ仕様レジストリ
cipher-nameおよびcipher-mode文字列が解釈されない場合でもLUKS操作によって、異なるLUKSベースの実装間で互換性を実現するには、すべての実装で同じ意味を持つ必要があります。 LUKSは、基礎となる暗号システムが暗号名と暗号モード文字列を利用できることを確認する必要があります。これらの文字列は常に暗号システムにネイティブであるとは限らないため、LUKSはそれらを適切なものにマップする必要がある場合があります。
有効な暗号名を表1に示します。
有効な暗号モードを表2に示します。契約により、IVと微調整を使用する暗号モードは、すべてゼロのIV/Tweakから開始する必要があります。これは、特にキーマテリアルを処理するときに、encrypt/decryptプリミティブへのすべての呼び出しに適用されます。さらに、これらのIV/tweaks暗号モードは通常、セクター境界にtweaks/IVを再シードすることにより、暗号ストリームを独立したブロックにカットします。最初の暗号化されたブロック/復号化されたブロックのすべてゼロのIV/Tweak要件は、最初のブロックがセクター0にあるように定義されているという要件と同等です。
表3は、hash-specフィールドの有効なハッシュ仕様を示しています。準拠した実装は、すべての暗号、暗号モード、またはハッシュ仕様をサポートする必要はありません。
表1:有効な暗号名
- aes-Advanced Encryption Standard-FIPS PUB 197
- twofish-Twofish:128ビットブロック暗号-http://www.schneier.com/paper-twofish-paper.html(下記参照)
- 蛇-http://www.cl.cam.ac.uk/~rja14/serpent.html
- cast5-RFC 2144
- cast6-RFC 2612
表2:有効な暗号モード
- ecb-暗号出力が直接使用されます
- cbc-plain-暗号はCBCモードで操作されます。 CBCチェーンはすべてのセクターをカットし、セクター番号を初期ベクトルとして再初期化します(32ビットおよびリトルエンディアンに変換)。このモードは、[Fru05b]の第4章で指定されています。
- cbc-essiv:ハッシュ -暗号は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-USセキュアハッシュアルゴリズム1(SHA1)
- sha256-SHAによる変形FIPS 180-2
- sha512-SHAによるバリアントFIPS 180-2
- ripemd160-http://www.esat.kuleuven.ac.be/~bosselae/ripemd160.html(下記参照)
編集者注:上記は仕様からコピーされたものです。執筆後、これらのドキュメントのURLは変更されました。
5.1カーネルは、私がこれを書いている時点で現在、2つの異なる形式の暗号文字列を持っています。「古い」形式と「新しい」形式です。これまでのこの質問のすべて、そして明らかにすべてのドキュメントも「古い」形式を扱っているので、ここで説明します。これは単に暗号化のためです。 dm-cryptで整合性を使用する場合は、AEAD暗号を検討する必要があり、さらに複雑になります。
カーネルによって解析される形式は、「暗号 [_:
_キーカウント] _-
_モード _-
_- ivmode [_:
_ivopts] "。例:_aes-xts-plain64
_、_blowfish-cbc-essiv:sha256
_、_aes:64-cbc-lmk
_。
cipher使用する暗号。例はaes
、anubis
、twofish
、_arc4
_などです。カーネルのdm-cryptドライバーには、暗号のリストがありません。これはLinux Crypto APIに渡されるため、カーネルでサポートされている適切な暗号を使用できます。
keycount暗号で使用する2つのキーのオプションの累乗。これは、lmk
ivmode以外のすべてに対してデフォルトで1になり、デフォルトは64になります。これは、LMKにのみ適用され、1以外の値は他のモードでは正しく機能しません。
mode暗号で使用するブロックチェーンモード。例は、ecb
、cbc
、xts
です。 ecb
がIVを使用しないことを知る以外に、md-cryptドライバーはこれをLinux Crypto APIに渡し、カーネルでサポートされている任意のチェーンモードを使用できます。
ivmode各セクターの初期化ベクトル(IV)を生成するために使用されるアルゴリズム。通常の対称鍵暗号化では、dm-cryptとは異なり、IVは暗号化または復号化時に鍵とともに暗号に渡されるデータの別のビットです。操作全体で渡されるIVは1つだけです。 dm-cryptは各セクターを個別に読み書きできる必要があるため、ディスク全体を単一の操作として暗号化しません。代わりに、各セクターにIVがあります。 IVをデータとして渡すのではなく、IVを作成するためのアルゴリズムをここで指定します。これはLinux Crypto APIの一部ではありません。IVの生成は暗号によって行われず、許可されるivmode値はdm-cryptドライバーで定義されているためです。彼らです:
plain
、_plain64
_、_plain64be
_、benbi
これらは、単にセクター番号をさまざまな形式でIVとして使用します。シンプルで予測可能なIVを使用すると、透かしなどの攻撃に対抗するように設計されたXTSのようなブロックモードを意味します。 _plain64
_が最も一般的に推奨されているようです。null
IVは常にゼロです。テストと下位互換性のために、これを使用しないでください。lmk
Loop-AES暗号化スキームと互換性があります。tcw
TrueCryptと互換性があります。essiv
キーのハッシュで暗号化されたセクター番号を使用します。 _plain64
_のような単純なIVを使用するときに、さまざまな攻撃に耐性がないCBCなどのモードを意味します。ivoptsessiv
で使用されるハッシュivmode、他のすべてのモードでは無視されます。
特殊なケースとして、「暗号 _-plain
_」または単に「暗号」は「暗号 _-cbc-plain
_」として解釈されます。もう1つの特別なケースは、ecb
モードに指定するivmodeがないことです。
/proc/crypto
_の関係_/proc/crypto
_に関しては、暗号とモードのみが関連します。 "mode _(
_cipher _)
_"という形式のCrypto API仕様を構築し、カーネルからこれを要求するdm-crypt。これは、name
のskcipher
として_/proc/crypto
_で探す必要があります。例:
_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-cryptが使用するもの、およびxts(aes)
の名前がdmで指定された場合に_aes-xts
_と記述されることを示します-crypt。 keysize
フィールドは、この暗号で使用できる鍵のサイズも教えてくれます。
これがモジュールからのものである場合、モジュール名がmodule
行に表示されることがあります。ただし、多くの暗号(通常、ハードウェア固有のコードを持たないソフトウェアの暗号)は、一般的なブロックチェーンコードと組み合わせて最終的なskcipherを生成する一般的な暗号として実装されます。例えば:
_name : xts(anubis)
driver : xts(ecb(anubis-generic))
module : kernel
type : skcipher
name : anubis
driver : anubis-generic
module : anubis
type : cipher
_
この場合、アヌビス暗号はカーネルXTSブロックチェーンモードコードと結合され、kernel
のモジュールが割り当てられた最終的な暗号xts(anbuis)
を生成します。しかし、これを利用可能にするためには、anubis
モジュールからの一般的なanubis暗号が必要です。ほとんどの暗号には、「_crypto-
_cipher」というモジュールエイリアスがあり、それらを使用してそれらをロードできます。 _modprobe crypto-anubis
_は、アヌビス暗号を提供するモジュールをロードします。
_cryptsetup benchmark
_コマンドを使用する場合、重要なのはcipherとmodeのみです。 modeが指定されていない場合、デフォルトでCBCになります。 ivmodeは完全に無視されます。したがって、ベンチマークでは、aes
、_aes-cbc
_、および_aes-cbc-foobar
_はすべて同等です。
次のコマンドを使用して、カーネルでサポートされている暗号を一覧表示できます。
[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
次のコマンドを使用して、使用できる暗号とハッシュ、およびluks
のI/O比較を一覧表示できます。
[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