Ein automatischer Entropie-Check für deine verschlüsselten Daten

Ein automatischer Entropie-Check für deine verschlüsselten Daten

Backups sind wichtig. Noch wichtiger sind verschlüsselte Backups. Was aber, wenn sich in der Software oder Library, die du zum verschlüsseln verwendest ein Fehler einschleicht? Angenommen du erstellst verschlüsselte Zip-Archive und nach einem Update ändern sich plötzlich Parameter? Oder du migrierst irgendwelche Abhängigkeiten und übersiehst, dass die Verschlüsselung nun nicht mehr funktioniert. Wie könntest du automatisch prüfen, ob die Verschlüsselung überhaupt funktioniert hat bevor du die Dateien weiter verarbeitest und zum Beispiel in die Cloud lädst? Und das unabhängig von der genutzten Verschlüsselungsmethode und Software?

Entropie prüfen

Gute und sichere Verschlüsselungsmethoden erhöhen immer die Entropie der verschlüsselten Daten. Diese Entropie kannst du messen. Entropie bedeutet, dass die Daten, die vor dem Verschlüsseln noch geordnet und leserlich waren nun nahezu gleichförmig aussehen. Banal gesagt: Ganz egal welchen Teil der verschlüsselten Datei du dir ansiehst: Alles sieht nahezu gleichförmig aus. Wie ein großes Rauschen. Dieses Rauschen kannst du messen. Es ist ein Indikator für gute Verschlüsselung.

Leider erzeugt auch Kompression selbst ein hohes Maß an Entropie. Da wir nicht sagen können ob die Entropie nun von der Kompression oder der Verschlüsselung kommt sollte dieses Verfahren daher nur bei Daten mit niedriger oder gar keiner Kompression angewendet werden. In meinen folgenden Beispielen mit 7z ist die Kompression daher komplett abgeschaltet und 7z wird nur im Archivmodus verwendet. Dieses Verfahren ist daher auch nur für kleinere Daten brauchbar. Für bereits komprimierte Daten wie JPG oder Videodateien ist diese Methode ebenfalls nicht brauchbar, da diese Daten bereits von Natur aus eine hohe Entropie durch die integrierte Kompression mitbringen.

Der ent Command

Ent ist ein nettes Tool, um die Entropie von Dateien zu messen. Es errechnet für dich zum Beispiel den "Arithmetic Mean", welcher ein starkes Qualitätsmerkmal für Entropie ist. Wie das genau funktioniert kannst du hier nachlesen: https://www.fourmilab.ch/random/

Probiere es doch einmal aus. Archiviere einen Ordner zum Beispiel mit 7z einmal mit und einmal ohne Passwort und miss danach jeweils die Entropie:

# Archive without password:
7z a -t7z -mx=0 -mhe ~/Documents_plain.7z ~/Documents
ent Documents_plain.7z

# Archive with password:
7z a -t7z -mx=0 -mhe -psupersecretpassword ~/Documents_encrypted.7z ~/Documents
ent Documents_encrypted.7z

Wie du siehst ist die Entropie bei der Version mit Passwort sehr hoch. Ein wichtiges Indiz für funktionierende Verschlüsselung. Gerne kannst du auch den Parameter "-mx=0" bei dem Beispiel ohne Passwort entfernen und so die Kompression aktivieren. Auch hier wird die Entropie stark erhöht aber eben nicht durch Verschlüsselung. Das ist der Grund weshalb dieses Verfahren nur ohne Kompression funktioniert.

Anwendungsbeispiel

Dieses Beispiel soll dir verdeutlichen, wie das funktioniert. Zunächst packen wir einen Ordner mit Hilfe von 7z und versehen das Archiv mit einem Schlüssel. Danach prüfen wir automatisch die Entropie mit dem "Arithmetic Mean", welche bei guter Verschlüsselung bei ungefähr 127.0 liegen sollte. Darauf basierend laden wir das Archiv dann via FTP auf einen Server. Versuche doch mal den Schlüssel weg zu lassen. Der Upload wird in diesem Fall verweigert. Ich arbeite hier mit einem Wert von 126, da es manchmal zu Schwankungen und Näherungen an 127 kommen kann.

# Define the archive filename
filename=~/secret_files.7z

# Let's define the secret encryption key
key=xxxxxxxxxxxxxx

# Create an encrypted archive using 7z command
7z a \
  -t7z -mx=0 -mhe -p"$key" \
  "$filename"
   ~/Documents

# Lets run a simple entropy test
# Parse the arithmetic mean value out of the ent command result
entropy=$(ent "$filename" | grep -o -P '(?<=bytes is ).*(?= \(127)')

echo The calculated entropy is: "$entropy"

if (( $(echo "$entropy > 127" |bc -l) )); then
    
    echo 'The entropy level is OK! Uploading data...';
    
    # Note: You should not use plain FTP. Use FTPS or SFTP!
    # Upload via FTP to a server
    echo uploading file...
    ftp -nvp <<-EOF
    open my.host.name
    user ftp_username ftp_password
    cd secrets
    put "$filename"
EOF
    echo done
    
else
  echo 'Something went wrong! The entropy is too low!';
fi

Das funktioniert selbstverständlich nicht nur mit 7z sondern sollte mit jedem seriösen Verschlüsselungstool gleich gut funktionieren.

Titelbild: https://pixabay.com/de/photos/murmeln-farben-gruppe-farbe-3531755/