One-time-pad-Crypter

Code-Stücke können hier veröffentlicht werden.
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

ich habe mir eine weile mal die mühe gemacht, sachen sicher zu verschlüsseln
(wie der eine oder andere vielleicht bemerkt hat).
Genaugenommen ist es ein Modul, das XOR importiert (das ist hier irgendwo im forum) und den pwg (selbstgemacht). Hier der Code:

Erstmal der PWG.py:

Code: Alles auswählen

#!/usr/bin/env python
import sys
from string import *
from random import randrange
def pwg(items, laenge):
    if items == 'letters' or items == "l":
        items = ascii_letters
    if items == 'digits' or items == "d":
        items = digits
    if items == 'letters+digits' or items == 'digits+letters' or items == "d&l":
        items = ascii_letters + digits
    if items == 'all' or items == 'everything':
        items = ascii_letters + digits + punctuation
    itemslen, pwdlen = len(items), laenge
    pwd = "".join(items[randrange(itemslen)] for i in range(pwdlen)) 
    return pwd
und der, der pwg und xor nutzt:

Code: Alles auswählen

#!/usr/bin/env python
#erstellt ein passwort und verschluesselt mit diesem eine datei mithilfe des xor-algorythmus
#es wird one-time-pad benutzt, sprich, solange das passwort sicher uebertragen wird, ist der
#algorythmus nicht zu knacken
#todo: über die fibonacci-reihe oä störsignale einspielen
import pwg, xorc, os.path
def crypt(txt,pw):
    dateilen = len(txt)
    pw_lang = pwg.pwg("all", dateilen)
    state2 = xorc.setup(pw)
    crypted2 = xorc.xor(state2,pw_lang)
    dir = os.path.join("~",".crypter", "a.051")
    dir = os.path.expanduser (dir)
    file = open(dir,"wb")
    file.write(crypted2)
    file.close()
    state = xorc.setup(pw_lang)
    crypted = xorc.xor(state,txt)
    del pw
    return crypted
def encrypt(txt,pw):
    dir = os.path.join("~",".crypter", "a.051")
    dir = os.path.expanduser (dir)
    file = open(dir,"rb")
    pw2 = file.read()
    decstate2 = xorc.setup(pw)
    encrypted2 = xorc.xor(decstate2,pw2)
    decstate = xorc.setup(encrypted2)
    encrypted = xorc.xor(decstate,txt)
    return encrypted
das einzige problem ist es, wenn der ordner erstellt werden muss (kann den moduleintrag nicht mehr finden). Aber das werde ich auch noch hinbekommen...

zerreißt es biite in der luft ;)
BlackJack

murph hat geschrieben: das einzige problem ist es, wenn der ordner erstellt werden muss (kann den moduleintrag nicht mehr finden). Aber das werde ich auch noch hinbekommen...

zerreißt es biite in der luft ;)
Bitte gerne. Das ist kein One-Time-Pad. Bei One-Time-Pad braucht man kein Passwort sondern die beiden Beteiligten müssen vorher auf einem sicheren Kanal eine grosse Menge Zufallsdaten austauschen von denen dann immer ein Stück der Länge der Nachricht zum ver- und entschlüsseln verwendet wird, und danach "weggeworfen" wird. Eben "One-Time".

Und mit Zufallsdaten ist nicht die Ausgabe von einen Wald- und Wiesen-Zufallsgenerator gemeint, sondern kryptographisch sichere Zufallsdaten, die man nicht nachberechnen kann, oder die Muster enthalten.
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

oh, das enthält muster???
schade, dachte, das modul wäre ein echter zufallsgenerator, muss da wohl nochma kucken...aber die datei "a.051" ist doch ein langes passwort, das so übermittelt wird, oer nicht?
Ich dachte, das wichtige an one-time-pad wäre die einmalige verschlüsselung mit einem einmaligen passwort, was das ja ist/sein sollte.
aber vielen dank, werde mir nochma wiki ankucken...
aber etwas sicherer ist das schon, finde ich^^
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

murph hat geschrieben:dachte, das modul wäre ein echter zufallsgenerator
Computer können nicht von sich aus Zufall erzeugen. Computer berechnen Funktionsterme und es gibt keine Funktionen die bei einer Berechnung mit den gleichen Daten vollständig zufällige Ausgaben geben. Deswegen mischt man in die Zufallsfunktionen noch gerne Uhrzeitangaben rein, damit da nicht bei jedem Aufruf der gleiche "Zufall" entsteht.

Was eher zufällig ist: die Mausbewegungen aufzeichnen und diese dann als Zufallsdaten verwenden. Denn dabei muss der Mensch eingreifen und der Mensch hat schon eher die tendenz Zufälle zu erzeugen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

murph hat geschrieben:oh, das enthält muster???
schade, dachte, das modul wäre ein echter zufallsgenerator,
Aus der Doku zu `random`:
5.9 random -- Generate pseudo-random numbers hat geschrieben:The Mersenne Twister is one of the most extensively tested random number generators in existence. However, being completely deterministic, it is not suitable for all purposes, and is completely unsuitable for cryptographic purposes.
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

weiß denn einer, welche programmiersprache ein "vollkommendes" random hat? wer hat sowas gerne schon so unsicher...
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

Les dir nochmal Leonidas Post durch! :wink:
mfg

Thomas :-)
BlackJack

murph hat geschrieben:weiß denn einer, welche programmiersprache ein "vollkommendes" random hat? wer hat sowas gerne schon so unsicher...
Wie Leonidas schon schrieb, kann man das nicht nur mit einem (deterministischen) Algorithmus machen, sondern man braucht "echte" Zufallsdaten. Einige Betriebssysteme bieten so etwas an, in dem sie zum Beispiel Mausbewegungen und Tastendrücke mit in den Zufallszahlengenerator hineinrechnen. Falls es so eine Unterstützung im Betriebssystem gibt, dann kann man in Python mit `os.urandom` bzw. `random.SystemRandom` darauf zugreifen.

Wenn man noch mehr "echten" Zufall möchte, dann muss man z.B. sich mit radioaktivem Zerfall beschäftigen: http://www.fourmilab.ch/hotbits/
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Die überarbeitete Version:

Code: Alles auswählen

#!/usr/bin/env python
#erstellt ein passwort und verschluesselt mit diesem eine datei mithilfe des xor-algorythmus
#es wird one-time-pad benutzt, sprich, solange das passwort sicher uebertragen wird, ist der
#algorythmus nicht zu knacken

import xorc, os.path, os, sys

def crypt(txt,pw):
    dateilen = len(txt)
    pw_lang = os.urandom(dateilen)       
    state2 = xorc.setup(pw)
    crypted2 = xorc.xor(state2,pw_lang)
    dir = os.path.join("~",".crypter", "a.051")
    dir = os.path.expanduser (dir)
    try:
        file = open(dir,"wb")
    except:
        shortdir = os.path.join("~",".crypter")
        os.mkdir(shortdir)
        shortdir = os.path.expanduser (shortdir)
        file = open(dir,"wb")
    file.write(crypted2)
    file.close()
    state = xorc.setup(pw_lang)
    crypted = xorc.xor(state,txt)
    del pw
    return crypted
def encrypt(txt,pw):
    dir = os.path.join("~",".crypter", "a.051")
    dir = os.path.expanduser (dir)
    try:
        file = open(dir,"rb")
    except:
        return "NO ENCRYPT_DATA!!! (%s)" % dir
        sys.exit()
    pw2 = file.read()
    decstate2 = xorc.setup(pw)
    encrypted2 = xorc.xor(decstate2,pw2)
    decstate = xorc.setup(encrypted2)
    encrypted = xorc.xor(decstate,txt)
    return encrypted
Als nächstes werde ich noch einrichten, dass "a.051" noch direkt übertragen wird (auf wunsch) und gar nicht gespeichert.
BlackJack

Aber das ist doch immer noch kein One-Time-Pad!? Beim One-Time-Pad braucht man kein Passwort, sondern muss nur vorher genug Zufallsdaten austauschen. Der Witz beim One-Time-Pad ist doch gerade, dass man sich nicht auf ein relativ kurzes Passwort verlässt, sondern auf einen Schlüssel der genau so lang ist, wie die zu verschlüsselnden Daten. Das ist auch nicht per Brute-Force zu knacken, während man Passworte einfach durchprobieren kann.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Davon mal abgesehen, dass du file() und dir() überschreibst... :roll:
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

@Leonidas:
ich weiß, dass ich das überschreibe...ist das etwa irgendwie negativ? Erfahrungen?

@Blackjack:
Das Passwort ist ja, wenn du es dir genau ankuckst, doch genausolang wie die Votschaft, nur verschlüsselt! Die Datei "a.501" ist ja das "One-Time-Pad"-Passwort! Diese Datei ist nur wiederum mit einem kürzerem Passwort verschlüsselt; das hielt ich für legitim...trotzdem ist die Botschaft nicht knackbar, solange gilt, dass
a) Die Datei "a.501" unbekannt ist/sicher übertragen wird
b) Das kurze Passwort ebenfalls sicher übertragen worden ist

sobald a) nicht gewährleistet ist, ist es kein One-Time-Pad aber es sind zwei haufen wilder zeichen, die dann vllt mit Bruce-Force zu lösen sind.

GEGEBEN SEIN MUSS, dass "a.501", "das" Passwort. unbekannt bleibt.
DANN ist das unentschlüsselbar, außer os.urandom() spielt verrückt...

aber sonst sind die Punkte für One-Time-Pad gegeben, nur muss das "echte"
Passwort noch vertraulicher behandelt werden und am besten nicht in eine datei geschrieben werden.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

murph hat geschrieben:ich weiß, dass ich das überschreibe...ist das etwa irgendwie negativ? Erfahrungen?
Ja ist es!
Erfahrung eins: mal sehen was dieses Objekt für Attribute hat.. dir(objekt)... string object is not callable? Hä?
Erfahrung zwei: na, öffnen wir mal eine Datei.. file('dateiname').. file object not callable? Was?
Erfahrung drei: Such mal nach import Image und from Tkinter import *, dann siehst du wie viele Leute ihr TkImage durch ihr PILImage ersetzt haben, ohne es zu merken und ohne die Fehlermeldung zu verstehen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Werde das dann mal umändern...
BlackJack

murph hat geschrieben:Das Passwort ist ja, wenn du es dir genau ankuckst, doch genausolang wie die Votschaft, nur verschlüsselt! Die Datei "a.501" ist ja das "One-Time-Pad"-Passwort! Diese Datei ist nur wiederum mit einem kürzerem Passwort verschlüsselt; das hielt ich für legitim...trotzdem ist die Botschaft nicht knackbar, solange gilt, dass
a) Die Datei "a.501" unbekannt ist/sicher übertragen wird
b) Das kurze Passwort ebenfalls sicher übertragen worden ist

[...]

GEGEBEN SEIN MUSS, dass "a.501", "das" Passwort. unbekannt bleibt.
DANN ist das unentschlüsselbar, außer os.urandom() spielt verrückt...
Gegeben sein muss, das niemals die gleichen Daten mehr als einmal zum verschlüsseln benutzt werden. Sonst ist es kein One-Time-Pad. Daher kommt doch der Name. Wenn Du immer die gleichen Zufallsdaten nur mit verschiedenen Passwörtern benutzt, dann ist das Verfahren nicht sicherer als die Passwörter selbst. Und da die kürzer als die Nachricht sind (ausser für ganz kurze Nachrichten) ist das Verfahren unsicherer als echtes One-Time-Pad.

Bei echtem One-Time-Pad braucht man keine Passwörter sondern nur die gleichen Zufallsdaten auf beiden Seiten. Und davon schön viele weil immer nach einer Übertragung die Menge von Zufallsdaten die für das verschlüsseln benutzt wurde, "weggeworfen" werden muss.
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

dann hast du unsauber gelesen! Jedes mal wird ein neues Passwort vom System entworfen, auch wenn ich diese abspeicher, ist sie jedes mal neu, wenn ich was verschlüssele... ;)

Aber der Punkt, dass beide Seiten gleiche Zufallszahlen ermitteln und dann abgleichen und danach "wegwerfen", ist ja schon sehr schwer, also, wieviel Zufall ist das denn, wenn m´beide Seiten das gleiche ermitteln, ohne abzugleichen?
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

murph hat geschrieben:dann hast du unsauber gelesen! Jedes mal wird ein neues Passwort vom System entworfen, auch wenn ich diese abspeicher, ist sie jedes mal neu, wenn ich was verschlüssele... ;)
Dann würde ich dir mal empfehlen genauer zu lesen :lol:
BlackJack hat geschrieben: Bei echtem One-Time-Pad braucht man keine Passwörter sondern nur die gleichen Zufallsdaten auf beiden Seiten.
mfg

Thomas :-)
BlackJack

murph hat geschrieben: Aber der Punkt, dass beide Seiten gleiche Zufallszahlen ermitteln und dann abgleichen und danach "wegwerfen", ist ja schon sehr schwer, also, wieviel Zufall ist das denn, wenn m´beide Seiten das gleiche ermitteln, ohne abzugleichen?
Es werden nicht auf beiden Seiten gleiche Zufallszahlen ermittelt. Wenn man das könnte dann sind die Zahlen ja nicht mehr zufällig, sondern berechenbar. :roll:

One-Time-Pad funktioniert so, dass eine Seite sehr viele Zufallsbytes erzeugt, und zwar "wirklich" zufällige und nicht einfach berechenbare. Diese Daten müssen dann auf sicherem Weg an den Empfänger übermittelt werden. Zum Beispiel per vertrauenswürdigem Kurier auf CD oder DVD oder am besten eine persönliche Übergabe. Jetzt kann der Sender zum Beispiel eine 1000 Bytes lange Nachricht mit den ersten 1000 Zufallsbytes verschlüsseln und übertragen. Der Empfänger nimmt dann die ersten 1000 Zufallsbytes von seiner Kopie zum entschlüsseln. Danach werden die ersten 1000 Bytes "weggeworfen", d.h. nie wieder zum verschlüsseln verwendet. Wenn die Zufallsdaten "aufgebraucht" sind, dann muss man neue austauschen.

Bei der Nachrichtenübertragung braucht man dann keinen Schlüssel mehr. Und so eine Nachricht ist wirklich unknackbar weil der Klartext aus Sicht eines Angreifers im Grunde jede mögliche Kombination von 1000 Bytes sein kann. Jede ist gleich wahrscheinlich.
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

aber ist dann "a.501" nicht ausreichend? die datei wird vertrauenswürdig überliefert und danach vom rechner am besten gelöscht,
bei der nächsten Datei werden dann neue Zufallszahlen ermittelt.
Zwar ist selbst systemrandom oder urandom nicht hundertprozentiger unnachvollziehbar, aber radioaktives material möchte ich auch nich gerne in meinem zimmer haben, in dem ich lebe ;)
BlackJack

murph hat geschrieben:aber ist dann "a.501" nicht ausreichend? die datei wird vertrauenswürdig überliefert und danach vom rechner am besten gelöscht,
bei der nächsten Datei werden dann neue Zufallszahlen ermittelt.
Das heisst Du müsstest für jede Nachricht die gleiche Menge an Zufallsdaten in der "a.501" auf einem sowieso schon sicheren Weg übermitteln. Dann kannst Du doch über diesen Kanal gleich die eigentliche Nachricht übermitteln und die Verschlüsselung sparen. Und wozu brauchst Du das zusätzliche Passwort?
Antworten