Sicherheit und Kryptografie

Juli 9, 2012·
Julio Batista Silva
Julio Batista Silva
· 9 Min Lesezeit
blog

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:

  1. 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
    
  2. Über den Parameter -x im Terminal

    julio@acer ~> vim -x segredo.txt
    

    Vim 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 data
    
    julio@acer ~> cat segredo.txt
    VimCrypt~01!xOî4QLÉ
    ©è¢i¶@h@$[¾M%
    
  3. :X

    Hat 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=zip
    
  • Blowfish

    Starker 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.

  1. Erzeuge deinen privaten Schlüssel

    julio@acer ~> gpg --gen-key
    

    RSA 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/

  2. Erzeuge eine ASCII-Fassung deines öffentlichen Schlüssels

    julio@acer ~> gpg --armor --output juliopub.asc --export julio@juliobs.com
    

    --armor sorgt 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:

  1. Du benutzt mehrere Rechner und willst auf allen entschlüsseln können
  2. Du hast die Platte neu formatiert und willst den gesicherten privaten Schlüssel einspielen
  3. 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

  1. Mit dem Standardalgorithmus AES128 (früher CAST-128)

    julio@acer ~> gpg --symmetric lol.tt
    
  2. Mit 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

  1. Installiere Mcrypt

    julio@acer ~> sudo pacman -S mcrypt
    
  2. Verschlü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.
    
  3. 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

Julio Batista Silva
Autoren
Senior Cloud Developer

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! 🙂

comments powered by Disqus