Eigener Verschlüsselungsdienst auf dem Raspberry Pi

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.

Text verschlüsseln

Text verschlüsseln

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.

Mail mit verschlüsseltem Link

Mail mit verschlüsseltem Link

 

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.

Text entschlüsseln

Text entschlüsseln

Daraufhin wird die Nachricht im Klartext angezeigt.

Die entschlüsselte Nachricht

Die entschlüsselte Nachricht

 

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.

 

2 Gedanken zu “Eigener Verschlüsselungsdienst auf dem Raspberry Pi

Kommentar verfassen