暗号化されたボリュームのLUKSヘッダーを分析すると、cipher-name
フィールドに単一文字= '@'が表示されます。どういう意味ですか?
LUKS On-Disk Format Specification は、2005年にClemens Fruhwirthによって最初に公開されたLUKSヘッダーのエンコーディングを明確に定義しており、最初の3つのデータフィールドは次のようになっています。
+-------+--------+-------------+
| Start | Length | Field Name |
+-------+--------+-------------+
| 0 | 6 | magic |
| 6 | 2 | version |
| 8 | 32 | cipher-name |
+-------+--------+-------------+
古いドライブでは、これは期待どおりに機能し、cipher-name
が「aes」であることは明らかです
root@disp8551:~# hexdump -Cs 0 -n 6 luksVol1
00000000 4c 55 4b 53 ba be |LUKS..|
00000006
root@disp8551:~# hexdump -Cs 6 -n 2 luksVol1
00000006 00 01 |..|
00000008
root@disp8551:~# hexdump -Cs 8 -n 32 luksVol1
00000008 61 65 73 00 00 00 00 00 00 00 00 00 00 00 00 00 |aes.............|
00000018 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000028
root@disp8551:~#
しかし、新しいドライブでは、cipher-name
フィールドの印刷可能な文字は '@'のみです。
root@disp85:~# hexdump -Cs 0 -n 6 luksVol2
00000000 4c 55 4b 53 ba be |LUKS..|
00000006
root@disp85:~# hexdump -Cs 6 -n 2 luksVol2
00000006 00 02 |..|
00000008
root@disp85:~# hexdump -Cs 8 -n 32 luksVol2
00000008 00 00 00 00 00 00 40 00 00 00 00 00 00 00 00 03 |......@.........|
00000018 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000028
root@disp85:~#
LUKSが@
でここで使用している暗号は何ですか? cipher-name field
のアットマークはどういう意味ですか?
あなたの例のcipher-name
はnot '@
'です。あなたが見ているフィールドは実際にはhdr_size
フィールドです。
あなたが犯した間違いは、LUKS1エンコーディングでLUKS2コンテナをデコードしようとしたことです。提供されたテーブルでは、2番目のフィールド(バイト6〜8)がversion
データフィールドであることを示しています。そして、hexdumpは、最初のLUKSコンテナー(luksVol1
)にversion
= 00 01
があり、2番目のLUKSコンテナー(luksVol2
)にversion
=があることを明確に示しています00 02
。これらの16進値は、前者をLUKS1および後者のLUKS2に直接関連付けます。
これを示すOPからの引用:
root@disp8551:~# hexdump -Cs 6 -n 2 luksVol1
00000006 00 01 |..|
00000008
...
root@disp85:~# hexdump -Cs 6 -n 2 luksVol2
00000006 00 02 |..|
00000008
OPのエンコードテーブルは、2005年にClemens Fruhwirthによって公開された LUKS On-Disk Format Specification で定義されているLUKS1に対してのみ正しいものでした。
LUKS2は、2018年にMilanBrožによって公開された LUKS2 On-Disk Format Specification で定義されている別のエンコードを使用します。LUKS2の更新されたエンコードテーブルを次に示します。 LUKS2のバイナリヘッダーは、正確に4096バイトでなければならないことに注意してください。
+-------+--------+--------------+
| Start | Length | Field Name |
+-------+--------+--------------+
| 0 | 6 | magic |
| 6 | 2 | version |
| 8 | 8 | hdr_size |
| 16 | 8 | seqid |
| 24 | 48 | label |
| 72 | 32 | csum_alg |
| 104 | 64 | salt |
| 168 | 40 | uuid |
| 208 | 48 | subsystem |
| 256 | 8 | hdr_offset |
| 264 | 184 | _padding |
| 448 | 64 | csum |
| 512 | 3584 | _padding4096 |
+-------+--------+--------------+
次に、LUKS2コンテナーのプライマリヘッダーの例で、上記のデータフィールドに関連する16進ダンプを示します。
# magic
root@disp4117:~# hexdump -Cs 0 -n 6 luksVol2
00000000 4c 55 4b 53 ba be |LUKS..|
00000006
# version
root@disp4117:~# hexdump -Cs 6 -n 2 luksVol2
00000006 00 02 |..|
00000008
# hdr_size
root@disp4117:~# hexdump -Cs 8 -n 8 luksVol2
00000008 00 00 00 00 00 00 40 00 |......@.|
00000010
# seqid
root@disp4117:~# hexdump -Cs 16 -n 8 luksVol2
00000010 00 00 00 00 00 00 00 03 |........|
00000018
# label
root@disp4117:~# hexdump -Cs 24 -n 48 luksVol2
00000018 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000048
# csum_alg
root@disp4117:~# hexdump -Cs 72 -n 31 luksVol2
00000048 73 68 61 32 35 36 00 00 00 00 00 00 00 00 00 00 |sha256..........|
00000058 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |...............|
00000067
# salt
root@disp4117:~# hexdump -Cs 104 -n 64 luksVol2
00000068 4f b1 7c b2 bf 7d da 1f 15 64 df cc ab 74 68 5c |O.|..}...d...th\|
00000078 9a f9 3d 02 42 67 0f 92 ee 1d bf 98 11 5b 3d b8 |..=.Bg.......[=.|
00000088 87 e4 e0 a8 76 23 68 86 2f fc e1 98 a7 a1 5a a9 |....v#h./.....Z.|
00000098 b6 c5 e5 e2 9a 87 f7 ff 55 52 dc 07 07 dd fa a4 |........UR......|
000000a8
# uuid
root@disp4117:~# hexdump -Cs 168 -n 40 luksVol2
000000a8 65 63 30 32 36 64 64 66 2d 37 37 36 32 2d 34 34 |ec026ddf-7762-44|
000000b8 64 63 2d 39 65 37 30 2d 62 35 36 66 36 61 65 62 |dc-9e70-b56f6aeb|
000000c8 63 31 32 38 00 00 00 00 |c128....|
000000d0
# subsystem
root@disp4117:~# hexdump -Cs 208 -n 48 luksVol2
000000d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000100
# hdr_offset
root@disp4117:~# hexdump -Cs 256 -n 8 luksVol2
00000100 00 00 00 00 00 00 00 00 |........|
00000108
# _padding
root@disp4117:~# hexdump -Cs 264 -n 184 luksVol2
00000108 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
# csum
000001c0
root@disp4117:~# hexdump -Cs 448 -n 64 luksVol2
000001c0 d0 9a e0 f8 96 ed 8f db 42 5f 58 19 99 2a 72 18 |........B_X..*r.|
000001d0 01 5e f7 81 34 99 f7 c5 17 a2 07 2f 60 be 40 bd |.^..4....../`.@.|
000001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000200
# _padding4096
root@disp4117:~# hexdump -Cs 512 -n 3584 luksVol2
00000200 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00001000
root@disp4117:~#
上記のフィールドには実際にはcipher-name
が含まれていないことに注意してください。 LUKS2では、それはJSONオブジェクトに格納されます。 LUKS2には、実際には6つのヘッダー領域があります。
\/ primary binary header alignment padding \/
+----+----------+----+----------+-------------------+----+
| /\ | 1st JSON | \/ | 2nd JSON | Keyslots area | /\ |
+----+----------+----+----------+-------------------+----+
/\ secondary binary header
上記のhexdump
は、「プライマリバイナリヘッダー」領域のみを示しています。 cipher-name
を取得するには、JSON領域を調べる必要があります。
LUKS2では、「プライマリバイナリヘッダー」と「1番目のJSON」領域に格納されたデータのコピーが実際に2つあります(2番目のコピーは、それぞれ「セカンダリバイナリヘッダー」と「2番目のJSON」領域と呼ばれます)。ほとんどの場合、「プライマリバイナリヘッダー」のデータは「セカンダリバイナリヘッダー」と完全に一致し、「1番目のJSON」領域のデータは「2番目のJSON」領域と完全に一致します。 データは2回保存されます 回復を支援し、破損から保護します。
「1番目のJSON」領域は常にバイト4096(「プライマリバイナリヘッダー」領域の直後)から始まりますが、その長さは可変です。長さは、バイナリヘッダーのhdr_size
(つまり、cipher-name
と混同していたのと同じフィールド)を調べることで決定できます。上記の16進ダンプから、hdr_size
フィールドの値が0x4000
(hex)= 16384
(10進数)であることは明らかです。ただし、hdr_size
フィールドは、「プライマリバイナリヘッダー」プラス「1番目のJSON」領域のサイズを定義します。したがって、「1番目のJSON」領域の長さは、hdr_size
値から「プライマリバイナリヘッダー」の長さを引いたものになります。この場合、それは16384 - 4096
= 122881
です。 JSONオブジェクトに格納されているLUKS2コンテナーのメタデータの長さに応じて、JSON領域は最大4194304 - 4096
= 4190208
バイトになる場合があります。
そこで、「1st JSON」エリアのhexdump
は、バイトオフセット4096
から始まり、長さ122881
になります。
root@disp4117:~# hexdump -Cs 4096 -n 12288 luksVol2
00001000 7b 22 6b 65 79 73 6c 6f 74 73 22 3a 7b 22 30 22 |{"keyslots":{"0"|
00001010 3a 7b 22 74 79 70 65 22 3a 22 6c 75 6b 73 32 22 |:{"type":"luks2"|
00001020 2c 22 6b 65 79 5f 73 69 7a 65 22 3a 36 34 2c 22 |,"key_size":64,"|
00001030 61 66 22 3a 7b 22 74 79 70 65 22 3a 22 6c 75 6b |af":{"type":"luk|
00001040 73 31 22 2c 22 73 74 72 69 70 65 73 22 3a 34 30 |s1","stripes":40|
00001050 30 30 2c 22 68 61 73 68 22 3a 22 73 68 61 32 35 |00,"hash":"sha25|
00001060 36 22 7d 2c 22 61 72 65 61 22 3a 7b 22 74 79 70 |6"},"area":{"typ|
00001070 65 22 3a 22 72 61 77 22 2c 22 6f 66 66 73 65 74 |e":"raw","offset|
00001080 22 3a 22 33 32 37 36 38 22 2c 22 73 69 7a 65 22 |":"32768","size"|
00001090 3a 22 32 35 38 30 34 38 22 2c 22 65 6e 63 72 79 |:"258048","encry|
000010a0 70 74 69 6f 6e 22 3a 22 61 65 73 2d 78 74 73 2d |ption":"aes-xts-|
000010b0 70 6c 61 69 6e 36 34 22 2c 22 6b 65 79 5f 73 69 |plain64","key_si|
000010c0 7a 65 22 3a 36 34 7d 2c 22 6b 64 66 22 3a 7b 22 |ze":64},"kdf":{"|
000010d0 74 79 70 65 22 3a 22 61 72 67 6f 6e 32 69 22 2c |type":"argon2i",|
000010e0 22 74 69 6d 65 22 3a 34 2c 22 6d 65 6d 6f 72 79 |"time":4,"memory|
000010f0 22 3a 32 37 34 35 33 30 2c 22 63 70 75 73 22 3a |":274530,"cpus":|
00001100 32 2c 22 73 61 6c 74 22 3a 22 71 4a 6e 79 2b 4a |2,"salt":"qJny+J|
00001110 5c 2f 6f 35 71 77 57 77 35 78 2b 57 31 30 7a 47 |\/o5qwWw5x+W10zG|
00001120 59 54 6f 64 44 64 57 6f 39 6e 74 5c 2f 6c 67 49 |YTodDdWo9nt\/lgI|
00001130 41 61 61 6f 78 5c 2f 45 3d 22 7d 7d 7d 2c 22 74 |Aaaox\/E="}}},"t|
00001140 6f 6b 65 6e 73 22 3a 7b 7d 2c 22 73 65 67 6d 65 |okens":{},"segme|
00001150 6e 74 73 22 3a 7b 22 30 22 3a 7b 22 74 79 70 65 |nts":{"0":{"type|
00001160 22 3a 22 63 72 79 70 74 22 2c 22 6f 66 66 73 65 |":"crypt","offse|
00001170 74 22 3a 22 31 36 37 37 37 32 31 36 22 2c 22 69 |t":"16777216","i|
00001180 76 5f 74 77 65 61 6b 22 3a 22 30 22 2c 22 73 69 |v_Tweak":"0","si|
00001190 7a 65 22 3a 22 64 79 6e 61 6d 69 63 22 2c 22 65 |ze":"dynamic","e|
000011a0 6e 63 72 79 70 74 69 6f 6e 22 3a 22 61 65 73 2d |ncryption":"aes-|
000011b0 78 74 73 2d 70 6c 61 69 6e 36 34 22 2c 22 73 65 |xts-plain64","se|
000011c0 63 74 6f 72 5f 73 69 7a 65 22 3a 35 31 32 7d 7d |ctor_size":512}}|
000011d0 2c 22 64 69 67 65 73 74 73 22 3a 7b 22 30 22 3a |,"digests":{"0":|
000011e0 7b 22 74 79 70 65 22 3a 22 70 62 6b 64 66 32 22 |{"type":"pbkdf2"|
000011f0 2c 22 6b 65 79 73 6c 6f 74 73 22 3a 5b 22 30 22 |,"keyslots":["0"|
00001200 5d 2c 22 73 65 67 6d 65 6e 74 73 22 3a 5b 22 30 |],"segments":["0|
00001210 22 5d 2c 22 68 61 73 68 22 3a 22 73 68 61 32 35 |"],"hash":"sha25|
00001220 36 22 2c 22 69 74 65 72 61 74 69 6f 6e 73 22 3a |6","iterations":|
00001230 36 31 39 34 33 2c 22 73 61 6c 74 22 3a 22 46 69 |61943,"salt":"Fi|
00001240 4c 67 31 35 56 5c 2f 55 56 4b 47 72 72 4e 39 4f |Lg15V\/UVKGrrN9O|
00001250 52 2b 5c 2f 69 59 46 51 70 38 38 59 44 77 50 4c |R+\/iYFQp88YDwPL|
00001260 6a 4f 6f 4c 70 6a 77 6d 78 58 77 3d 22 2c 22 64 |jOoLpjwmxXw=","d|
00001270 69 67 65 73 74 22 3a 22 49 70 34 31 5a 58 70 44 |igest":"Ip41ZXpD|
00001280 76 77 52 76 6d 41 73 33 30 58 69 72 6c 48 65 6d |vwRvmAs30XirlHem|
00001290 57 72 44 67 6c 5c 2f 44 4a 31 36 79 33 31 41 71 |WrDgl\/DJ16y31Aq|
000012a0 66 42 55 6f 3d 22 7d 7d 2c 22 63 6f 6e 66 69 67 |fBUo="}},"config|
000012b0 22 3a 7b 22 6a 73 6f 6e 5f 73 69 7a 65 22 3a 22 |":{"json_size":"|
000012c0 31 32 32 38 38 22 2c 22 6b 65 79 73 6c 6f 74 73 |12288","keyslots|
000012d0 5f 73 69 7a 65 22 3a 22 31 36 37 34 34 34 34 38 |_size":"16744448|
000012e0 22 7d 7d 00 00 00 00 00 00 00 00 00 00 00 00 00 |"}}.............|
000012f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00004000
root@disp4117:~#
LUKSコンテナー内のdataの暗号化に固有のcipher-name
を取得するには(指定されたキースロットを対称的に暗号化するために使用される暗号とは対照的) )、上記のJSONのsegments
オブジェクトを確認する必要があります。上記と同じsegments
セクションですが、読みやすいようにフォーマットされています:
"segments": {
"0": {
"type": "crypt",
"offset": "16777216",
"iv_Tweak": "0",
"size": "dynamic",
"encryption": "aes-xts-plain64",
"sector_size": 512
}
},
LUKSは多くの異なるセグメントをサポートしますが、このLUKSコンテナーには1つしかありません。必要な属性はencryption
で、これには dm-crypt
表記 の値があります。この場合、それはaes-xts-plain64
です。つまり、cipher-name
はaes
であり、cipher-mode
はxts-plain64
です。
これは、LUKS2コンテナーのcryptsetup luksDump
にリストされている暗号にも一致します
root@disp4117:~# cryptsetup luksDump luksVol2 | grep -i cipher | head -n1
cipher: aes-xts-plain64
root@disp4117:~#