Der Name des Beitrag lässt Einiges vermuten, aber was nun kommt ist wohl eher ungewöhnlich.
In diesem Beitrag erstelle ich einen kleinen Dienst, der Nachrichten unlesbar macht und diese per Mail an einen beliebigen Empfänger schickt. Der Empfänger der eMail erhält einen Link, der ihm die unleserliche Passphrase zu einem lesbaren Text entschlüsselt. Der Empfänger der des Textes benötigt zusätzlich seinen persönlichen Schlüssel. Das soll die Nachricht noch weiter vor ungewünschten Lesern schützen.
Starten wir einfach mal mit ein paar Bildern, damit der Sinn hinter diesem Projekt etwas deutlicher wird.
Per Weboberfläche auf dem Pi kann der Absender die Nachricht verschlüsseln. Der Key, also der private Schlüssel kann frei gewählt werden, muss jedoch dem Empfänger der Nachricht mitgeteilt werden, damit dieser die Nachricht wieder entschlüsseln kann.
Der Empfänger erhält nun eine eMail, die einen Link enthält. Der Link führt ebenfalls zum Webserver, der auf dem Raspberry Pi läuft.
Nach einem Klick auf den Link muss der Empfänger nun seinen persönlichen Schlüssel eingeben. Dies ist der gleiche, den der Sender zum Verschlüsseln genutzt hat.
Daraufhin wird die Nachricht im Klartext angezeigt.
Was ist denn nun der Sinn des Ganzen? Also in erste Linie schützt dieses kleine System vor heimlichen Blicken auf den Bildschirm. Sollte euch jemand beim Empfang einer empfindlichen Nachricht über die Schulter schauen, so wird er mit dem Kauderwelsch in eurer Mail nichts anfangen können. Sollte es dem gemeinen Spion nun doch gelingen sich den verschlüsselten Link zu merken, so kann er ohne den persönlichen Schlüssel damit auch nichts anfangen. Daher sollte der Schlüssel zwischen Sender und Empfänger nur mündlich mitgeteilt werden.
Für die Verschlüsselung wird die Vigenère-Verschlüsselung oder auch polyalphabetische Substitution genutzt. Wer nun noch der Sicherheit des Systems auf den Grund gehen möchte, findet den Algorithmus dahinter auf Wikipedia (Link). Wer nun immer noch eine praktische Anwendung in dieser Spielerei sieht, findet nachfolgend die nötigen Schritte.
crypt.py
Das Herzstück der Verschlüssellungsmaschinerie findet im Python-Programm crypt.py statt. Der Inhalt liest sich wie folgt
import base64 import sys from simplemail import Email argFunc=sys.argv[1] mail = sys.argv[2] argKey= sys.argv[3] argTxt = '' for word in sys.argv[4:]: argTxt += word + ' ' def encode(key, clear): enc = [] for i in range(len(clear)): key_c = key[i % len(key)] enc_c = chr((ord(clear[i]) + ord(key_c)) % 256) enc.append(enc_c) return base64.urlsafe_b64encode("".join(enc)) def decode(key, enc): dec = [] enc = base64.urlsafe_b64decode(enc) for i in range(len(enc)): key_c = key[i % len(key)] dec_c = chr((256 + ord(enc[i]) - ord(key_c)) % 256) dec.append(dec_c) return "".join(dec) def sendmail(msg): Email( smtp_server = "smtp.server.de", smtp_user = "smtp-user", smtp_password = "smtp-passwort", from_address = "Absenderadresse", to_address = mail, subject = "Neue geheime Nachricht!", message = msg ).send() def main(): if argFunc =="d": dec=decode(str(argKey), str(argTxt)) print dec if argFunc == "e": enc=encode(str(argKey), str(argTxt)) msg= "http://IP.des.Raspberry/decrypt.php?txt="+ enc sendmail(str(msg)) print enc if __name__ == '__main__': main()
Für das einfache Senden von eMail habe ich die Bibliothek simplemail genutzt. Die Installation erfolgt einfach per pip install python-simplemail, sofern pip installiert ist. Angepasst werden müssen lediglich die Zugangsdaten eures eMail-Anbieters. Das Python-Script sowie die beiden nachfolgenden PHP-Dateien sollte im Ordner des Webservers gespeichert werden. In der Regel: /var/www/.
encrypt.php
Zur Ver- und Entschlüsselung nutze ich zwei PHP-Dateien. Daher ist es eine Voraussetzung, dass ein Webserver samt PHP auf dem Raspberry Pi installiert ist. Die Datei encrypt.php verschlüsselt den Text und lässt die Eingabe der Empfängeradresse zu. Die Datei hat folgenden Inhalt:
<meta charset="utf-8"> <div align="center"> <h2>Verschlüsseln:</h2> <form method ="POST" action="<?php print($_SERVER['PHP_SELF']); ?>"><div align='center'><td><div align='center'> <b>Key:</b> <br><input type='Text' name='pkey'></div> <form method ="POST" action="<?php print($_SERVER['PHP_SELF']); ?>"><div align='center'><td><div align='center'> <b>Text:</b><br> <textarea type='Text' name='ptxt' rows="5" cols="40"> </textarea> </div> <form method ="POST" action="<?php print($_SERVER['PHP_SELF']); ?>"><div align='center'><td><div align='center'> <b>eMail-Adresse:</b> <br><input type='email' name='mail'></div> <input action="<? PHP_SELF ?>" type="submit" name="encode" value="Verschlüsseln und Mail senden" /></form> </div> <?php $mail= $_POST['mail']; $key = $_POST['pkey']; $txt = $_POST['ptxt']; if(isset($_POST['encode'])) { $val2 = shell_exec("python crypt.py e $mail $key $txt"." 2>&1"); ?><br><br><?php echo ("Text verschlüsselt und verschickt!"); }
Diese Seite führt nach dem Ausfüllen der Textfelder die Python-Datei aus und übergibt die Parameter direkt an das Programm.
decrypt.php
decrypt.php ist die Seite, zu der der Empfänger durch den versendeten Link geführt wird. Diese liegt, wie die beiden anderen Dateien, auch in /var/www/.
<meta charset="utf-8"> <div align="center"> <h2>Persönlichen Key eingeben:</h2> <?php $txt = $_GET['txt']; echo ("Du möchtest entschlüsseln: " .$txt); ?> <br> <form method ="POST" action="<?php echo $_SERVER['PHP_SELF']."?txt=".urlencode($_GET['txt']); ?>"> <div align='center'> <b>Key:</b> <br><input type="Text" name="pkey" rows="5" cols="40"> <br> <input type="submit" name="decode" value="Entschlüsseln" /> </form></div> <?php if(isset($_POST['decode'])) { $txt = $_GET['txt']; $key = $_POST['pkey']; $val1 = shell_exec("python crypt.py d 0 $key $txt"." 2>&1"); ?> <div align='center'> Entschlüsselte Nachricht: <br> <textarea name="pkey" rows="5" cols="40"> <?=$val1?> </textarea></div> <? } ?>
Sofern Ihr das System von unterwegs nutzen wollt, solltet Ihr evtl. noch eure IP durch einen Dynamic-DNS-Hoster automatisch aktualisieren lassen.
Ich möchte noch einmal darauf hinweisen, dass das ganze Projekt wirklich eine reine Spielerei ist und sicherlich auch geknackt werden kann. Wer jedoch den neugierigen Blicken des Sitznachbarn misstraut oder generell Interesse für geheime Nachrichten hegt, hat hiermit sicherlich ein nettes Spielzeug.
Hey,
wirklich nettes Spielzeug.
Zum Einstieg in das Thema Cryptographie sehr hilfreich.
Gruß
Alex
Nett. Wäre nur sinnvoller kein http, sondern https zur Übertragung zu verwenden.