Sep 222015
 

Etwas mühsam aber doch gelungen mussten für das von Thunderbird angemahnte GnuPG Update zunächst zahlreiche Bibliotheken heruntergeladen und konfiguriert werden. GnuPG ist eine freie Software, die den pgp (pretty good privacy) Algorithmus verwendet, um beispielsweise Dateien für den Mailverkehr zu verschlüsseln. Hierfür gibt es unter Thunderbird (Mozilla Mailclient) ein Addon, also ein kleines Zusatzprogramm, das GnuPG so einbindet, das es ohne viel Aufwand verwendet werden kann. Ebenso wird die Schlüsselverwaltung in Thunderbird ermöglicht.

Zunächst fehlte meinem Betriebssystem folgende Pakete (die in dieser Reihenfolge zu konfigurieren sind):

libgpg-error     (ftp://ftp.gnupg.org/gcrypt/libgpg-error/)
libgcrypt        (ftp://ftp.gnupg.org/gcrypt/libgcrypt/)
libksba          (ftp://ftp.gnupg.org/gcrypt/libksba/)
libassuan >= 2.0 (ftp://ftp.gnupg.org/gcrypt/libassuan/)

Diese müssen einzeln heruntergeladen, entpackt und konfiguriert werden. Dies geschieht im Terminal / per Kommandozeile zunächst über den Befehl „tar“ und anschliessend über „./config“ „make“ und abschliessend (mit Root-Rechten) „make install“. Nachdem ich nun jedes einzelne Paket konfiguriert hatte, fehlte für die Konfiguration der eigendlichen Software noch eine Bibliothek „zlib„, die auch manuell entsprechend einzurichten war. Also irgendwie hat es geklappt, letztenendes, aber ich frage mich, warum das nicht über „apt-get install“ zu erledigen ist. Also klar, kritisieren ist immer einfach, vielleicht gibt es technische Gründe oder was auch immer, aber für eine breitere Verwendung ist es wie Einiges an Konfigurationen unter Linux immer noch viel zu anspruchsvoll für „den“ User. Vielleicht habe ich auch was übersehen oder falsch verstanden…

Apr 272012
 

Heute haben wir uns im Informatik-Fachseminar mit dem Thema Kryptologie in der Sek1 (9. oder 10.Klasse) und einer Umsetzung mit der Programmiersprache Python beschäftigt.

Ziel war heute, ein Programm zur Verschlüsselung von Zeichenketten zu erstellen, das problemorientiert und nicht künstlich nur zum Üben geeignet ist. Als Ansatz nahmen wir eine einfache Verschlüsselung an, die einzelne Zeichen vertauscht, z.B. das erste gegen das dritte, das zweite stehenlässt, das vierte gegen das sechste tauscht usw.
Hierzu gab es einen Vorschlag, der folgendermaßen aussieht:

def drilling(eingabe):
    zaehler = 0
    laenge = len(eingabe)
    ausgabe = ""
    while zaehler < laenge:
        if zaehler % 3 == 0:
            if zaehler+2 < laenge:
                ausgabe = ausgabe + eingabe[zaehler+2]
            else:
                ausgabe = ausgabe + eingabe[zaehler]
        if zaehler % 3 == 1:
            ausgabe = ausgabe + eingabe[zaehler]
        if zaehler % 3 == 2:
            ausgabe = ausgabe + eingabe[zaehler-2]
        zaehler += 1
    print ausgabe     

eingabe = raw_input("Bitte ein Wort eingeben:")
drilling(eingabe)

Wir diskutierten kleinschrittigeres Vorgehen, erst nur ein Tripel vertauschen, um nicht gleich Schleifen und Fallunterscheidungen als Konzepte mit einbeziehen zu müssen. Beispielsweise könnte erst nur der Vertauschvorgang auf Papier modelliert werden, also erst nur Zeichenketten der Länge 3, dann im zweiten Schritt dieses auf Zeichenketten der Länge eines Vielfachen von 3 erweitern und dann auf beliebige Zeichenketten.
Der erste Schritt wäre dann:

# Eine ganz einfache Variante der Drillingsverschluesselung
def drilling(eingabe):
    ausgabe = eingabe[2] + eingabe[1] + eingabe[0]
    print "Das Wort lautet " + eingabe 
    print "Der verschluesselte Text lautet " + ausgabe     

eingabe = raw_input("Bitte ein Wort der Laenge 3 eingeben:")
drilling(eingabe)

Den zweiten Schritt habe ich noch nicht so richtig durchdacht, wünschenswert wäre ein Programm, das weniger Konzepte enthält, aber mehr kann als das erste Programm, also z.B. alle durch 3 teilbaren Zeichenketten-Längen aber weniger Fallunterscheidungen und keine Modulo-Rechnung enthält.

Als weiteren Ansatz diskutierten wir, erst ein anspruchsvolles Programm zu einem Problem vorzulegen und dies analysieren lassen, um dann eine Modifikation oder Variante implementieren zu lassen. Dies könnte allerdings auch abschreckend wirken und zur Entwicklung eines Vokabulars erscheint ein systematischer Ausbau von Konzepten günstiger.

Ich habe noch nicht so viele Erfahrungen mit Python, daher habe ich mich erst einmal auch mit einfachen Aufgaben beschäftigt, z.B. wie eine Liste erstellt wird und was man damit alles machen kann. Dabei habe ich mich an einem Skript von Bernd Grave orientiert: www.uni-math.gwdg.de/bgr/unterricht/informatik/EinfPython.pdf Problemorientiert sind diese Aufgaben allerdings nicht, da es völlig unsinnig erscheint, eine Einkaufsliste mit einem solchen Aufwand zu verwalten. Zum Konzepte von Python kennenlernen ist es allerdings recht schön.

Mein erstes Experiment mit Ausgaben und Fallunterscheidungen (Ich nutze Ubuntu, da ist Python bereits vorinstalliert und als Editor einfach gedit und rufe die Programme dann über die Konsole auf):

Hier meine Listen-Experimente:

# Programm "Listen", angelehnt an Bernd Grave, 
# "Programmieren mit Python - erste Schritte"

# Erzeuge eine Liste und gebe ein Listenelement aus

planeten = ['Sonne','Mond','Sterne']

nummern = range(10)
print 'Listenelemente ausgeben'
print planeten [1]
print nummern [3]

# S.11 "Benutzung von Listen"

einkaufsliste = ['Aepfel','Mangos','Karotten','Bananen']

# Laenge einer Liste ausgeben
print '\n Ich habe', len(einkaufsliste), 'Dinge einzukaufen.'

# Elemente einer Liste ausgeben (interessant ist hier, dass eine 
# Variable "ding" für die Listenelemente erst in der for-Schleife 
# erzeugt wird, ohne näher deklariert zu werden)
print 'Diese Dinge sind:',
for ding in einkaufsliste:
print ding,

# Ein Elemente der Liste hinzufuegen
print '\n ich muss auch Reis einkaufen'
einkaufsliste.append('Reis')
print 'Meine Einkaufsliste ist jetzt', str(einkaufsliste)

# Eine Liste sortieren
print 'Jetzt werde ich meine Einkaufsliste sortieren.'
einkaufsliste.sort()
print 'Die sortierte Einkaufsliste ist', einkaufsliste

Die Ausgabe dieses kleinen Programms auf der Konsole sieht dann folgendermaßen aus: