Sicherheit und Kryptografie

Nachrichten sicher austauschen, Geheimnisse bewahren und Menschen identifizieren zu können, war der Menschheit immer wichtig. Es gibt Belege dafür, dass in Mesopotamien schon vor über 3500 Jahren Kryptografie zum Schutz von Informationen eingesetzt wurde.
In Kriegszeiten sind solche Fähigkeiten noch wichtiger. Einige Jahrhunderte vor Christus benutzten die Spartaner bereits Transpositionschiffren, und das römische Militär hatte ein Passwortsystem. Die Deutschen setzten im Zweiten Weltkrieg stark auf Kryptografie, was wiederum viele Fortschritte in der Kryptoanalyse antrieb.
Sicherheit und Privatsphäre gehören zu den Themen, die mich am meisten interessieren, besonders die Berührungspunkte verschiedener Bereiche mit der Kryptografie, zum Beispiel:
- Informatik: symmetrische Verschlüsselungsverfahren, Public-Key-Verfahren, Hashfunktionen, Techniken der Kryptoanalyse, Deniable Encryption, Steganografie
- Mathematik: diskrete Mathematik, lineare Algebra, Gruppentheorie
- Geschichte: alte Chiffren, militärischer Einsatz von Kryptografie in Kriegen
- Soziologie: gesellschaftliche, politische und philosophische Debatten, die immer wieder für Aufregung sorgen, sowie Gesetze wie der britische RIPA.
Wie leicht zu sehen ist, ist Kryptografie ein sehr weites Feld — zu weit, um hier ins Detail zu gehen. Wie die Algorithmen genau arbeiten, Benchmarks und tiefergehende Analysen findest du in Büchern und auf anderen Seiten. In diesem Beitrag geht es nur um einige Verfahren zur Verschlüsselung von Nachrichten und Dateien mit Programmen und Algorithmen, die ich selbst benutze und empfehle.
Dateiverschlüsselung
Vim
Keine sichere Verschlüsselung! (siehe https://dgl.cx/2014/10/vim-blowfish)
Dateien verschlüsseln
Dateien (Texte, Bilder usw.) lassen sich direkt in Vim auf folgende Weise verschlüsseln:
ROT13
Ein wenig bekanntes Geheimnis von Vim ist der Befehl
g?[Bewegung], der ROT13 auf den Abschnitt zwischen Anfang und Ende der Bewegung anwendet.ROT13 ist eine Cäsar-Chiffre mit Schrittweite 13, wodurch Ver- und Entschlüsseln derselbe Vorgang sind.
Diese Art der Verschlüsselung ist viel zu schwach, um ein Dokument zu schützen, hat aber ein paar unterhaltsame Anwendungen.
Beispiel: Angenommen, du hast ROT13 nur auf die zweite Zeile eines Textes angewendet, die die Antwort auf das Rätsel enthält (auf Portugiesisch):
P: Por que tem uma cama elástica no polo norte? E: Cnen b hefb CBYNE!Um die Antwort zu lesen, wendest du ROT13 einfach noch einmal an (
2Gg?$oder:2 norm! g?$):P: Por que tem uma cama elástica no polo norte? R: Para o urso POLAR!Wenn du eine ganze Datei verschlüsseln willst oder im Internet eine verschleierte Nachricht gefunden hast, ist tr vermutlich die bessere Wahl als Vim: du musst die Datei gar nicht öffnen, sondern leitest stdin einfach nach
tr a-zA-Z n-za-mN-ZA-M.Als Beispiel überlasse ich dir den folgenden Befehl zum Ausprobieren — eine Hommage an Bruce Schneier, den Erfinder von Blowfish und einen der wichtigsten Kryptografen der Gegenwart. Entnommen aus schneierfacts.com
julio@acer ~> echo "Vs lbh nfxrq Oehpr Fpuarvre gb qrpelcg guvf, \ ur'q pehfu lbhe fxhyy jvgu uvf ynhtu." | tr a-zA-Z n-za-mN-ZA-MÜber den Parameter -x im Terminal
julio@acer ~> vim -x segredo.txtVim fragt nach einem Passwort, das als Schlüssel für die Datei dient.
Das gilt für neue wie für bereits vorhandene Dateien.
Von nun an musst du das Passwort jedes Mal eingeben, wenn du die Datei bearbeitest.
Bei einem falschen Passwort siehst du etwas wie
q,§Â²îu]2©^D!¸¡á^?%°ç]^[.julio@acer ~> file segredo.txt segredo.txt: Vim encrypted file datajulio@acer ~> cat segredo.txt VimCrypt~01!xOî4QLÉ ©è¢i¶@h@$[¾M%:XHat denselben Effekt wie die vorige Option: Vim lässt dich ein Passwort zweimal eingeben und verschlüsselt die Datei mit diesem Schlüssel.
Das Passwort ändern
Zum Ändern benutzt du im Terminal einfach den Parameter +X, gibst das alte Passwort ein und danach zweimal das neue, wenn Vim danach fragt.
julio@acer ~> vim +X segredo.txt
Das Passwort entfernen
Zum Entfernen öffnest du die Datei mit Vim und leerst die Option key.
:set key=
Den Verschlüsselungsalgorithmus wechseln
Vim kennt zwei symmetrische Verfahren:
pkzip
Nicht benutzen: schwacher Algorithmus, leicht zu knacken.
:setlocal cryptmethod=zipStarker Algorithmus. Empfohlen.
:setlocal cm=blowfish
Beachte, dass cm nur eine Abkürzung für cryptmethod ist.
Gnu Privacy Guard (GPG)
Ein Nachteil von Vim: es kennt nur zwei Algorithmen (Pkzip und Blowfish), die in manchen Situationen recht schwach sind — und beide sind rein symmetrisch, das heißt, die Absenderin (Alice) muss den Schlüssel vorab mit dem Empfänger (Bob) teilen.
Wenn Alice keinen sicheren Kanal zu Bob hat: wie soll sie ihm das Passwort der verschlüsselten Datei sicher übermitteln? Dafür gibt es asymmetrische Verfahren. Alice kann das Passwort einfach mit Bobs öffentlichem Schlüssel verschlüsselt schicken.
GPG ist für solche Fälle ideal: es bringt 3 asymmetrische und mehrere symmetrische Verfahren mit, darunter Blowfish und noch stärkere. Neben Verschlüsselungsverfahren hat GPG auch welche für Hashing und Kompression.
Eine Liste der verfügbaren Algorithmen liefert der folgende Befehl:
julio@acer ~> gpg --version
Supported algorithms:
Pubkey: RSA, ELG, DSA
Cipher: 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH, CAMELLIA128,
CAMELLIA192, CAMELLIA256
Hash: <del>MD5</del>, SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2
Asymmetrische Verschlüsselung
Erzeuge dein Schlüsselpaar aus privatem und öffentlichem Schlüssel
Ein Schlüsselpaar wird zum Ver- und Entschlüsseln sowie zum Signieren und Prüfen gebraucht.
Andere verschlüsseln Nachrichten an dich mit deinem öffentlichen Schlüssel, und du entschlüsselst sie mit dem passenden privaten Schlüssel. Der öffentliche Schlüssel darf also frei verteilt werden, der private muss an einem sicheren Ort geheim bleiben.
Erzeuge deinen privaten Schlüssel
julio@acer ~> gpg --gen-keyRSA 2048 sollte genügen (bis 4096 ist möglich), solange du eine sichere Passphrase benutzt und keine Passwörter, die Wörterbuchangriffen oder einfachem Bruteforce nicht standhalten.
Also keine kurzen Passwörter, keine reinen Zahlen, nicht der Name deines Chihuahuas und keine gebräuchlichen Wörter.
Die Passphrase
_DasIst1SehrCooleSeite!_ist viel besser als_banane1_und ebenso stark wie_$%Sh4x0rq56lohap[3é-!_, dabei aber viel leichter zu merken.Der in solchen Beiträgen obligatorische Comic: https://xkcd.com/936/
Erzeuge eine ASCII-Fassung deines öffentlichen Schlüssels
julio@acer ~> gpg --armor --output juliopub.asc --export julio@juliobs.com--armorsorgt dafür, dass die Ausgabe ASCII ist (Base64)
Öffentliche Schlüssel austauschen
Sobald du eine ASCII-Datei mit deinem öffentlichen Schlüssel hast, kannst du sie weitergeben. Die
anderen importieren deinen Public Key mit gpg --import, und du musst dasselbe tun, um antworten
zu können:
julio@acer ~> gpg --import < alice.asc
Die Echtheit von Alices öffentlichem Schlüssel prüfst du, indem du den von ihr genannten Fingerprint
mit der Ausgabe von gpg --fingerprint vergleichst.
Einen privaten Schlüssel importieren
Private Schlüssel zu importieren ist in 3 Fällen nützlich:
- Du benutzt mehrere Rechner und willst auf allen entschlüsseln können
- Du hast die Platte neu formatiert und willst den gesicherten privaten Schlüssel einspielen
- Du gehörst zu einer Gruppe, die sich einen Schlüssel teilt
In allen Fällen lautet der Befehl:
julio@acer ~> gpg --allow-secret-key-import --import private_key.asc
Eine Datei verschlüsseln
julio@acer ~> gpg --encrypt --recipient julio@juliobs.com segredo.txt
julio@acer ~> gpg --encrypt --armor --recipient julio@juliobs.com segredo.txt
Der erste Befehl erzeugt eine Binärdatei namens segredo.txt.gpg, der zweite eine Textdatei namens
segredo.txt.asc. Wenn du die verschlüsselte Nachricht in eine E-Mail einfügen musst, nimm den
zweiten (mit --armor); sonst ist der erste vorzuziehen, weil die Datei kleiner wird:
julio@acer ~> file segredo.txt*; ls -lh segredo.txt*
segredo.txt: UTF-8 Unicode text
segredo.txt.asc: PGP message
segredo.txt.gpg: GPG encrypted data
-rw-r--r-- 1 julio users 163 Jun 10 20:58 segredo.txt
-rw-r--r-- 1 julio users 1.1K Jun 10 21:01 segredo.txt.asc
-rw-r--r-- 1 julio users 740 Jun 10 20:59 segredo.txt.gpg
Symmetrische Verschlüsselung
Mit dem Standardalgorithmus AES128 (früher CAST-128)
julio@acer ~> gpg --symmetric lol.ttMit AES-256 (Rijndael)
AES-256 gehört zu den stärksten Algorithmen und wird derzeit von der US-Regierung zum Verschlüsseln von Top Secret-Dokumenten eingesetzt
julio@acer ~> gpg --cipher-algo AES256 --symmetric segredo.txt
Hybride Verschlüsselung
Eine Datei entschlüsseln
julio@acer ~> gpg --output entschluesselte_datei.txt --decrypt segredo.txt.gpg
Gib dein Passwort ein, wenn danach gefragt wird; die geheime Datei wird dann entschlüsselt und als
entschluesselte_datei.txt gespeichert.
Grafische Oberfläche
Seahorse
Seahorse erleichtert die Verwaltung deiner Schlüssel. Es kann auch PGP- und Secure-Shell-Schlüssel erzeugen und Passwörter speichern.
Installieren lässt es sich mit dem folgenden Befehl:
julio@acer ~> sudo pacman -S seahorse
Kgpg
Kgpg ist eine grafische Oberfläche für GPG.
Installiere das gnupg-Plugin für Vim
Zum Installieren kopierst du das Plugin nach ~/.vim/plugin; verwaltest du deine Plugins mit
Vundle, ergänzt du einfach Bundle 'git://gitorious.org/vim-gnupg/vim-gnupg.git' in der .vimrc
und führst :BundleInstall! aus
Jetzt kannst du .gpg-Dateien öffnen, ohne gpg --decrypt zu tippen — Vim fragt nach deinem
Passwort.
Mein öffentlicher Schlüssel (erzeugt in Schritt 1.2)
OpenSSL
Auch mit OpenSSL lassen sich Dateien verschlüsseln.
julio@acer ~> openssl aes-256-cbc -salt -in segredo.txt -out segredo.aes
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:
julio@acer ~> cat segredo.aes
Salted_Ø$5ÝGa$´³1äÄõýÓË
julio@acer ~> openssl aes-256-cbc -d -salt -in segredo.aes -out segredo.txt
enter aes-256-cbc decryption password:
julio@acer ~> cat segredo.txt
Diese Datei ist geheim!
Mcrypt
Installiere Mcrypt
julio@acer ~> sudo pacman -S mcryptVerschlüssele eine Datei
julio@acer ~> mcrypt -a rijndael-128 segredo.txt Enter the passphrase (maximum of 512 characters) Please use a combination of upper and lower case letters and numbers. Enter passphrase: Enter passphrase: File segredo.txt was encrypted.Entschlüssele eine Datei
julio@acer ~> mcrypt -d segredo.txt.nc Enter passphrase: File segredo.txt.nc was decrypted.
7zip
Auch 7zip kann Dateien mit AES-256 verschlüsseln
julio@acer ~> 7z a -p -mem=AES256 -tzip segredo.7z segredo.txt
7-Zip [64] 9.20 Copyright (c) 1999-2010 Igor Pavlov 2010-11-18
p7zip Version 9.20 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,2 CPUs)
Scanning
Creating archive segredo.7z
Enter password (will not be echoed) :
Verify password (will not be echoed) :
Compressing segredo.txt
Everything is Ok
julio@acer ~> 7z l -slt segredo.7z | grep Method
Method = AES-256 Deflate
Beachte: auch wenn die Algorithmen dieselben sind, unterscheiden sich die Implementierungen — eine mit OpenSSL verschlüsselte Datei lässt sich zum Beispiel nicht mit GPG entschlüsseln.
Passwörter knacken
Es gibt Programme, die Dateipasswörter über Wörterbuch- und Bruteforce-Angriffe ermitteln.
Empfehlen kann ich John the Ripper und Ophcrack.
Ich habe (mehr als einmal) das Passwort verschlüsselter Dateien vergessen, wusste aber zum Glück ungefähr, welchem Muster meine Passwörter folgen, und konnte Wörterlisten bauen, um sie zu knacken.
Einer dieser Fälle war ein sparsebundle-Disk-Image von macOS.
Zuerst musste ich den Hash so extrahieren, dass John the Ripper ihn angreifen konnte:
$ dmg2john segredo.sparseimage > segredo.txt
Danach brauchte ich eine Wörterliste. Ich wusste:
- beginnt das Passwort mit einer Zahl, dann mit 5, 7, 123 oder 321
- Wort1, Wort2 oder Wort3 kommt im Passwort vor
- am Ende steht immer -A, -B oder -C
Eine Wörterliste mit allen Passwörtern, die diesen Kriterien entsprechen, baut man einfach mit Perl:
perl -lwe "print for glob '{5,7,123,321,}{Wort1,Wort2,Wort3}-{A,B,C}'" > wordlist.txt
Danach lässt du JTR einfach den Wörterbuchangriff fahren:
john --fork=4 --wordlist=wordlist.txt segredo.txt
Und prüfst, ob es das Passwort gefunden hat:
$ john --show segredo.txt
segredo.sparseimage:123Wort2-C::::segredo.sparseimage
1 password hash cracked, 0 left
VeraCrypt
(Abschnitt ergänzt am 26. Januar 2019)
VeraCrypt ist ein Fork des eingestellten TrueCrypt und mein liebstes Werkzeug, um Datenträger zu verschlüsseln, auf die ich von Linux, Windows und macOS aus zugreifen muss.
Es kann eine ganze Partition verschlüsseln oder in einer einzigen Datei einen verschlüsselten Container mit einem Dateisystem anlegen.
Zur Auswahl stehen AES, Serpent, Twofish, Camellia, Kuznyechik oder eine Kombination
dieser Algorithmen. Außerdem gibt es mehrere Hashfunktionen wie SHA-256, SHA-512, Streebog und
Whirlpool.
Eine weitere interessante Funktion von VeraCrypt sind Hidden Volumes, also Datenträger, die am Ende
anderer Datenträger versteckt sind.
Jeder Datenträger hat Platz für zwei Header. Passt das eingegebene Passwort zum ersten, wird der
äußere Datenträger entschlüsselt; passt es zum zweiten, der versteckte.
Das ermöglicht die sogenannte glaubhafte Abstreitbarkeit, denn die Existenz eines versteckten
Datenträgers lässt sich nicht beweisen.
Einen neuen Datenträger anzulegen ist recht intuitiv.
Ich empfehle NTFS, wenn die Platte unter Windows benutzt wird, denn NTFS ist das einzige
unterstützte Dateisystem mit Journaling. Ist Journaling nicht nötig, empfehle ich exFAT.
Um einen verschlüsselten Datenträger unter macOS einzuhängen:
/Applications/VeraCrypt.app/Contents/MacOS/VeraCrypt --text --keyfiles="" --pim="0" --protect-hidden="no" /dev/disk3s5 /Volumes/Dev
Zum Aushängen:
$ /Applications/VeraCrypt.app/Contents/MacOS/VeraCrypt --dismount /dev/disk3s5
Links
- http://arstechnica.com/security/2012/08/passwords-under-assault/
- http://irtfweb.ifa.hawaii.edu/~lockhart/gpg/gpg-cs.html
- http://sleepyhead.de/howto/?href=crypt
- http://vim.wikia.com/wiki/Encryption
- http://www.activism.net/cypherpunk/manifesto.html
- http://www.dewinter.com/gnupg_howto/english/GPGMiniHowto.html
- http://www.gnupg.org/gph/en/manual.html
- http://www.lockdown.co.uk/?pg=combi
- http://www.madboa.com/geek/gpg-quickstart/
- http://www.philzimmermann.com/EN/essays/WhyIWrotePGP.html
- http://www.theregister.co.uk/2009/11/24/ripa_jfl/
- http://www.theregister.co.uk/2010/06/28/brazil_banker_crypto_lock_out/
- http://www.wired.com/gadgetlab/2012/11/ff-mat-honan-password-hacker
- http://www.wirelessbrasil.org/wirelessbr/colaboradores/leonardo_vilela/tutorial_pgp.html
- https://en.wikipedia.org/wiki/Password
- https://wiki.archlinux.org/index.php/System_Encryption_with_LUKS_for_dm-crypt
- https://wiki.archlinux.org/index.php/Truecrypt
- Defcon: http://youtu.be/0WPny7wk960

Ich bin ein brasilianischer Computeringenieur mit Wohnsitz in Deutschland und begeistere mich für Technik, Wissenschaft, Fotografie und Sprachen.
Ich programmiere seit etwa zwei Jahrzehnten und habe dabei alles von mobilen Apps und Webentwicklung bis hin zu Machine Learning erkundet. Derzeit fokussiere ich mich auf Cloud‑SRE und Data Engineering.
Ich engagiere mich ehrenamtlich in den Open‑Source- und Python‑Communities, helfe bei der Organisation der PyCon DE und PyData Berlin, betreue als Mentor und trage mit Code und Übersetzungen bei.
In meinem Blog teile ich Linux‑Tipps, Einrichtungsanleitungen und persönliche Notizen, die ich als spätere Referenz geschrieben habe. Ich hoffe, dass sie auch anderen nützlich sind. Die Inhalte sind in mehreren Sprachen verfügbar.
Schau dir meine Galerie an, um einige meiner Fotografien zu sehen.
Abseits der Tastatur findest du mich auf Konzerten, beim Klarinettenspiel, Radfahren, Tauchen oder beim Erkunden neuer Orte, Kulturen und Küchen.
Ich freue mich immer über den Austausch! 🙂