diszk gyors(abb) felülírása pszeudo-random sorozattal

... mielőtt a (korábban titkosítatlan) diszk valamiért elkerül tőlünk.

Az én gépemen egy szálon a /dev/urandom-ból 7.37 MB/s sebességgel olvasható pszeudo-random sorozat. Vigyázó szemünket a következő script-re vessük (LiveCD-ről futtatásra szánva):


grep '^processor' /proc/cpuinfo \
| (
    while read DUMMY; do
      od -t x1 -A n -N 32 /dev/random  \
      | tr -d '[[:space:]]' \
      | gpg -c -z0 --passphrase-fd=0 --disable-mdc \
          --cipher-algo=TWOFISH -o - /dev/zero &
    done
    wait
  ) \
| pv >/dev/null

A script az én (két magos) gépemen 94.3 MB/s sebességgel produkálja a (a fenti célra kriptográfiailag biztonságosnak szánt) pszeudo-random sorozatot.

Indoklás: minden maghoz elindítunk egyet a következő "job"-ból, párhuzamosan: az

od | tr

pipeline-szakasz előállít egy 256 bites, hexa kódolású kulcsot. A kulcs elég jó minőségű, mert a /dev/random-ból jön. Minden "job" külön kulcsot kap. A GnuPG ezt a kulcsot alkalmazva kódolja a /dev/zero-t. Az tömörítést persze kikapcsoljuk. Mivel az átvitt "üzenet" integritása nem érdekel minket, azért MDC-re (message digest code-ra) nem pazarlunk CPU-t.

A TWOFISH egy gyors, 128 bites blokkmérettel rendelkező sifrírozó. Az AES(128), AES192, AES256 is hasonló sebességet nyújtanak (az AES(128) gyorsabb a TWOFISH-nél az én gépemen (100 MB/s fölött), a másik kettő lassabb).

Az ötlet csak annyi, hogy egy jó sifrírozó (pl. cipher block chaining módban használt AES vagy TWOFISH) kimenete lényegében megkülönböztethetetlen egy véletlen sorozattól -- bizonyos hosszig, a blokkméret függvényében.

A pszeudo-random sorozattal természetesen nem az eredeti "üzenetet" akarjuk eltakarni, hanem a 256 bites kulcs függvényében egy meglehetősen véletlennek tűnő sorozatot állítunk elő gyorsan, és azzal a diszk tartalmát "kódoljuk" (XOR helyett felülírást használva).

A kriptográfiailag biztonságos álvéletlen sorozat előállítására nem CTR módban használjuk a blokk-sifrírozót. A GnuPG feltételezésem szerint CBC-t alkalmaz. Ebbe a CBC-be egy csupa '\0' plaintext-et töltünk, így egyetlen GnuPG processz kimenete valójában egy OFB keystream lesz. Több ilyen keystream-et (melyek különböző kulcsokon alapulnak) összefuttatunk egyetlen pipe-ba. (A keveredés nem számít.) A diszk tartalmát ezzel XOR-oljuk ^W írjuk felül.

A szkript addig futtatandó, amíg a végső pv ^W cat ENOSPC-vel ki nem száll.

Hozzászólások

valami nem jó, nálam gpg 1.4-essel broken pipe hibaüzit dob debian 5 alatt, de friss sysresccd alatt 2-es gpg-vel is.

szerk.: live cd alatt próbáltam, és a pv parancs hiányzott, sorry.

nagyon jó teljesítményt hoz (92 MB/s nálam), gondolom egy ide vagy sata vinyót tud írni a saját max. sebességével.

nagyon hasznos, köszi!

valami nem jó, nálam gpg 1.4-essel broken pipe hibaüzit dob

Jó az; nem is lehet más, mint broken pipe. A bemenet (/dev/zero) végtelen, de a diszk véges. A pv (éles esetben inkább cat) ENOSPC-vel kiszáll, amikor a block device-nak a végére ér. Ekkor a gpg-k által írott közös pipe-nak egyetlen olvasója sem marad, úgyhogy amit tapasztalsz, az érthető, sőt, tervezett.

A pv egyébként csak szemléltetéshez kellett, LiveCD-ről elég a sima cat is.

Bookmark. :)

Jól fog jönni még, az urandom valóban lassú tud lenni. Néha nem árt törölni egy vinyót, pl. gép eladása előtt...

subscribe, éppen a napokban kerestem hasonlót és nem találtam.

-----
"Egy jó kapcsolatban a társunkat az ő dolgában kell támogatni, nem a miénkben."

Nagyon jó, köszönöm. Nálam 110 MB/s.

Valahol láttam egy példát arra is, hogy a pv-vel a /dev/zero-ból a /dev/null-ba másolás sebességét nézték.

remek. külön köszönet a sifrírozás szóért, mert most hallotam először. :)