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:

One-time-pad-Crypter

Beitragvon murph » Sonntag 14. Mai 2006, 20:02

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

Re: One-time-pad-Crypter

Beitragvon BlackJack » Montag 15. Mai 2006, 07:00

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:

Beitragvon murph » Montag 15. Mai 2006, 12:14

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^^
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Montag 15. Mai 2006, 14:32

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 Modvoice
BlackJack

Beitragvon BlackJack » Dienstag 16. Mai 2006, 08:11

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:

Beitragvon murph » Dienstag 16. Mai 2006, 19:37

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

Beitragvon Python 47 » Dienstag 16. Mai 2006, 20:28

Les dir nochmal Leonidas Post durch! :wink:
mfg

Thomas :-)
BlackJack

Beitragvon BlackJack » Mittwoch 17. Mai 2006, 07:18

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:

Beitragvon murph » Sonntag 21. Mai 2006, 10:49

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

Beitragvon BlackJack » Sonntag 21. Mai 2006, 23:02

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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Montag 22. Mai 2006, 13:19

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

Beitragvon murph » Dienstag 23. Mai 2006, 22:38

@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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Mittwoch 24. Mai 2006, 14:40

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 Modvoice
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Beitragvon murph » Mittwoch 24. Mai 2006, 22:53

Werde das dann mal umändern...
BlackJack

Beitragvon BlackJack » Donnerstag 25. Mai 2006, 08:01

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.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder