[buug-l] Partition cryptosieren

Christoph Biedl cbiedl at gmx.de
Sam Feb 4 21:57:47 CET 2006


Ich schrub vor etlichen Monaten:

> Auf einem Rechner habe ich eine große Datenpartition, deren Inhalt ich
> in Zukunft gerne mit cryptoloop oder dmcrypt verschlüsseln möchte.
> Allerdings habe ich ein klitzekleines Migrationsproblem. Der klassische
> Weg
>   1. Alle Daten rauskopieren bzw. Backup aktualisieren
>   2. Partition neu aufsetzen
>   3. Daten zurückkopieren
> hat in der gegebenen Situation ein paar Randprobleme, weshalb ich ihn
> ungern gehen möchte.

Das erläutere ich gerne nochmal: Da ist eine im Verhältnis zur Anbindung
große Datenmenge, die sich wenig ändert. Inkrementelles oder
differentielles Backup ist da kein Problem, aber "full recovery" braucht
einfach zu lange.

> Da nun diese Verschlüsselung blockweise geschieht, sollte es doch 
> allerdings kein Problem sein, die Partition blockweise zu lesen, zu
> crypten und wieder zu schreiben, und nach dem ersten mount mit den
> crypto-Optionen ist wieder alles da.

Vor zwei Wochen hatte ich einen Geistesblitz dazu, am Donnerstag davon
gesprochen, jetzt endlich mal ausprobiert: Ich kann auf ein
Gerät/Imagefile _zweimal_ ein losetup machen, einmal ohne encryption,
einmal mit. Beziehungsweise beide Male mit encryption, aber mit
unterschiedlichen Schlüsseln. Danach ein dd, wobei bs der blocksize
entsprechen sollte.

Klingt gruselig, funktioniert aber.

Wer das ausprobieren will, hier eine Anleitung als Shellskript, das
nacheinander das klassische Verfahren "Kopie in ein neues Image" und die
Methode "Doppeltes losetup" durchspielt. Neben viel Output von dd sind
wesentlich zwei Zeilen von md5sum, die jeweils paarweise denselben Hash
enthalten sollen, also etwa

| 8c62ff728f659ed9dd6ab0465ab4a7d5  1.img
| 8c62ff728f659ed9dd6ab0465ab4a7d5  2.img
(...)
| 88273827b8815a27dac24ac5a3b21cfc  3.img
| 88273827b8815a27dac24ac5a3b21cfc  4.img

-------------------------------------------------------------
# Linux- und Debianismen sind nicht weiter gekennzeichnet
# Blockgroesse und Sektorzahl, je nach Spieltrieb anpassen
BS=512
COUNT=16384

# Zwei loop devices, muessen frei sein
LOOP1=/dev/loop1
LOOP2=/dev/loop2

# zwei zufaellige Schluessel, 1024 Bit
dd if=/dev/urandom bs=128 count=1 of=key1
dd if=/dev/urandom bs=128 count=1 of=key2

# 0. Eine Vorlage
V=0.img
dd if=/dev/urandom of=$V bs=$BS count=$COUNT

# 1. von unkodiert nach kodiert
# a) Erzeugen auf dem klassischen Weg
A=1.img
cp $V $A
cat key1 | losetup -e aes -p 0 $LOOP1 $A
dd if=$V of=$LOOP1 
losetup -d $LOOP1

# b) Erzeugung durch doppeltes losetup
B=2.img
cp $V $B
           losetup             $LOOP1 $B
cat key1 | losetup -e aes -p 0 $LOOP2 $B
dd if=$LOOP1 of=$LOOP2
losetup -d $LOOP1
losetup -d $LOOP2

# Vergleich
md5sum $A $B
# Sollte gleichen md5 ergeben


# 2. umkodieren (von key1 auf key2)
# a) Klassischer Weg in ein neues Image
C=3.img
cp $V $C
cat key1 | losetup -e aes -p0 $LOOP1 $A
cat key2 | losetup -e aes -p0 $LOOP2 $C
dd if=$LOOP1 of=$LOOP2
losetup -d $LOOP1
losetup -d $LOOP2

# b) doppeltes losetup
D=4.img
cp $A $D
cat key1 | losetup -e aes -p0 $LOOP1 $D
cat key2 | losetup -e aes -p0 $LOOP2 $D
dd if=$LOOP1 of=$LOOP2
losetup -d $LOOP1
losetup -d $LOOP2

# Vergleich
md5sum $C $D
# Sollte gleichen md5 ergeben
-------------------------------------------------------------

    Christoph