web-dev-qa-db-ja.com

dm-crypt / LUKSで使用できる暗号と暗号モードを決定するにはどうすればよいですか?

Ubuntuベースのシステムを使用していますが、使用できる暗号と暗号モードを判別するのが困難です。

Cryptsetup manページには次のように書かれています:

「使用可能なオプションのリストについては、/ proc/cryptoを参照してください。追加のオプションを取得するには、追加のカーネル暗号化モジュールをロードする必要がある場合があります。」

私の/ proc/cryptoにはほとんどありません。ロードできる追加のカーネル暗号化モジュールを見つけるにはどうすればよいですか?

14
Emma

読む必要のあるドキュメントやマニュアルページは多数ありますが、特に興味があるのは 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は変更されました。

10

5.1カーネルは、私がこれを書いている時点で現在、2つの異なる形式の暗号文字列を持っています。「古い」形式と「新しい」形式です。これまでのこの質問のすべて、そして明らかにすべてのドキュメントも「古い」形式を扱っているので、ここで説明します。これは単に暗号化のためです。 dm-cryptで整合性を使用する場合は、AEAD暗号を検討する必要があり、さらに複雑になります。

カーネルによって解析される形式は、「暗号 [_:_キーカウント] _-_モード _-_- ivmode [_:_ivopts] "。例:_aes-xts-plain64_、_blowfish-cbc-essiv:sha256_、_aes:64-cbc-lmk_。

  • cipher使用する暗号。例はaesanubistwofish、_arc4_などです。カーネルのdm-cryptドライバーには、暗号のリストがありません。これはLinux Crypto APIに渡されるため、カーネルでサポートされている適切な暗号を使用できます。

  • keycount暗号で使用する2つのキーのオプションの累乗。これは、lmk ivmode以外のすべてに対してデフォルトで1になり、デフォルトは64になります。これは、LMKにのみ適用され、1以外の値は他のモードでは正しく機能しません。

  • mode暗号で使用するブロックチェーンモード。例は、ecbcbcxtsです。 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。これは、nameskcipherとして_/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
_

typeskcipherは、これが対称鍵暗号、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_コマンドを使用する場合、重要なのはciphermodeのみです。 modeが指定されていない場合、デフォルトでCBCになります。 ivmodeは完全に無視されます。したがって、ベンチマークでは、aes、_aes-cbc_、および_aes-cbc-foobar_はすべて同等です。

1
TrentP

次のコマンドを使用して、カーネルでサポートされている暗号を一覧表示できます。

[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

1
muhammad