Fedora

將 LUKS2 轉換回 LUKS 版本 1

  • August 12, 2019

是否可以將 LUKS2 轉換為 LUKS 版本 1,並通過擴展更改會阻止此類轉換的功能的使用?

Fedora 30 預設使用 LUKS2,但是我遇到了需要堅持使用 LUKS 版本 1 的情況。具體來說,Relax-and-Recover( rear) 目前不支持 LUKS2

文件提到在某些條件下可以在 LUKS2 和 LUKS1 之間進行轉換:

  • 就地轉換錶格 LUKS1

為了便於測試和轉換到新的 LUKS2 格式,有一個新的轉換命令允許從 LUKS1 格式進行就地轉換,如果沒有不兼容的選項,還可以從 LUKS2 轉換回 LUKS1 格式。

請注意,此命令只能在某些 LUKS1 設備上使用(不支持某些設備標頭大小)。這個命令很危險,千萬不要在沒有標頭檔備份的情況下執行它!如果在轉換過程中出現故障(IO 錯誤),則標頭將被銷毀。(請注意,轉換需要將鍵槽數據區域移動到不同的偏移量。)

要將標頭就地轉換為 LUKS2 格式,請使用

$ cryptsetup convert –type luks2

要將其轉換回 LUKS1 格式,請使用

$ cryptsetup convert –type luks1

您可以使用 luksDump 命令驗證 LUKS 版本。

$ cryptsetup luksDump

請注意,某些 LUKS2 功能會使標頭與 LUKS1 不兼容,並且轉換將被拒絕(例如使用新的 Argon2 PBKDF或完整性擴展)。一些次要屬性可能會在轉換中失去。

最後一點是一個問題,因為似乎至少在 Fedora 上預設使用該功能。

$ sudo cryptsetup convert /dev/sda3 --type luks1

WARNING!
========
This operation will convert /dev/sda3 to LUKS1 format.


Are you sure? (Type uppercase yes): YES
Cannot convert to LUKS1 format - keyslot 0 is not LUKS1 compatible.
$ sudo cryptsetup luksDump /dev/sda3
LUKS header information
Version:        2
Epoch:          3
Metadata area:  16384 [bytes]
Keyslots area:  16744448 [bytes]
UUID:           974b19f8-021a-46b6-a089-a46e06e6e746
Label:          (no label)
Subsystem:      (no subsystem)
Flags:          (no flags)

Data segments:
 0: crypt
   offset: 16777216 [bytes]
   length: (whole device)
   cipher: aes-xts-plain64
   sector: 512 [bytes]

Keyslots:
 0: luks2
   Key:        512 bits
   Priority:   normal
   Cipher:     aes-xts-plain64
   Cipher key: 512 bits
   PBKDF:      argon2i
   Time cost:  4
   Memory:     973984
   Threads:    4
   Salt:       af 33 7e 3b 6c bb 55 dc e3 dc 2b 07 c5 9e c3 6d 
               f2 c9 08 be 2f 1d 8b 78 8a 33 65 90 41 e3 05 10 
   AF stripes: 4000
   AF hash:    sha256
   Area offset:32768 [bytes]
   Area length:258048 [bytes]
   Digest ID:  0
Tokens:
Digests:
 0: pbkdf2
   Hash:       sha256
   Iterations: 100361
   Salt:       d9 30 b6 7f 60 d0 e0 19 39 f6 a2 38 ae 22 88 43 
               1e 5c 74 75 e6 b5 dd db a9 e7 29 1a 74 64 9c 0f 
   Digest:     ae 06 29 5f 71 49 bd c8 75 de 53 e8 95 94 d3 38 
               57 43 5f 0e 1e ac 6d 59 fb 34 a3 97 e4 5a 94 0c 

將 LUKS1 轉換為 LUKS2,然後再轉換回 LUKS1 就可以了。它從 LUKS2 開始,然後轉換為導致問題的 LUKS1。顯然,cryptsetup convert無法在 LUKS2argon2i鍵和 LUKS1pbkdf2鍵之間進行轉換。

設置:

# truncate -s 100M luks1.img
# truncate -s 100M luks2.img
# cryptsetup luksFormat --type luks1 luks1.img
# cryptsetup luksFormat --type luks2 luks2.img

使用最初的 luks1 進行測試:

# cryptsetup convert luks1.img --type luks2
WARNING!
========
This operation will convert luks1.img to LUKS2 format.


Are you sure? (Type uppercase yes): YES

# cryptsetup convert luks1.img --type luks1

WARNING!
========
This operation will convert luks1.img to LUKS1 format.


Are you sure? (Type uppercase yes): YES

我們有 LUKS1 -> LUKS2 -> LUKS1 工作。

使用最初的 luks2 進行測試:

# cryptsetup convert luks2.img --type luks1

WARNING!
========
This operation will convert luks2.img to LUKS1 format.


Are you sure? (Type uppercase yes): YES
Cannot convert to LUKS1 format - keyslot 0 is not LUKS1 compatible.

如果您在 LUKS2 格式中添加另一個鍵,則原始 luks1.img 的故事相同。

但是既然我們能夠將 argon2i 密鑰添加到最初的 luks1,也許我們可以將 pbkdf 密鑰添加到最初的 luks2?也有一些奇怪的問題,但經過一些試驗和錯誤,我最終得到:

# cryptsetup luksConvertKey --pbkdf=pbkdf2 luks2.img
Enter passphrase for keyslot to be converted: I have a sudden craving for butternut biscuits.

然後它就起作用了(前提是這是唯一的關鍵)。

# cryptsetup convert luks2.img --type luks1 

WARNING!
========
This operation will convert luks2.img to LUKS1 format.


Are you sure? (Type uppercase yes): YES

但它與最初的 LUKS1 標頭不太一樣(特別Payload offset: 32768突出)。現在,LUKS1 之前更改了他們的數據偏移量(最初它不是 MiB 對齊的),因此第三方軟體應該能夠處理異常偏移量,但你永遠不知道。

LUKS2 還具有使轉換無法進行的其他功能(無需老式的重新加密),因此此處描述的方法僅涵蓋最簡單的情況。

引用自:https://unix.stackexchange.com/questions/535077