Seite 1 von 1

VERSCHLÜSSELN !!! ENTSCHLÜSSELN bitte um hilfe

Verfasst: Dienstag 22. Juli 2008, 15:47
von SebbyStankie
hallo erstmal, ich hab python erst seit kurzem für mich entdeckt und wollte gleich mal ein kleines verschlüsselungsprogramm schreiben.
also ich habe es schon hin bekommen das jeder buchstabe 16zeichen bekommt zb. a= IOXIOXOIXOIOIXOO. aber leider funktioniert es nicht aus 16zeichen ein "a" zu machen. und ich weiß nicht wo der fehler ist/aber sonst finde ich python sehr gut!!! hier mal meine codes:

verschlüsseln:

Code: Alles auswählen

# -*- coding: cp1252 -*-
#Autor: Sebby Stankie
#Datum: 19.07.2008
#Verschlüsselungsprogramm

klar = ("a","b","c","d","e","f","g","h","i","j",
        "k","l","m","n","o","p","q","r","s","t",
        "u","v","w","x","y","z","ß"," ")

geheim = ("XIIOXOXXIOXIXIOO",   "IXIIXIOXIOOIXXOO",
                "OOOXOIXIXXXOOIOO", "OOIIOXXOOIOIIIXX",
                "IXXXXXXXIIOIOIXI",     "IIIIIXOOIIIIXXXX",
                "OOXOOIOIOIIXIIOX",    "OIIXOIXIIOOXOOIX",
                "XXIOXIXIOXXIXXOO",   "IXOXXOXIOOOXIOOI",
                "XIOIXIOOOXIIOIIO",     "OXOIIXIOXIXOIXXI",
                "OIXXOOXIOXIXOOOX",  "OXOXXOOIOOXXXIXI",
                "IIXIXIIOXXOIXIOI",       "OIIXIXXIOOIOXIXX",
                "IOOOOXXIOXXXOOII",   "IOXXOIOIXXIIIOOO",
                "OIXOOOOIOXOIOIXO",   "IIXIIIIXXXXXIOOO",
                "OIIOIXXOOOOOXIXX",   "OIIXOIIXIOXOIXXO",
                "XIXIOOOXIOXOXIXI",    "IOOXOOOOOIIOOOXO",
                "OIIXIXIXIIOIIOXI",        "OOOIOIOXXIXIXOXO",
                "XXIIXXIXOOOXXIIO",     "OIOIOOOXIOXIXXXI")
cc = {}
for j in range(28):
    cc[klar[j]] = geheim[j]

vtext = raw_input("Zu codierender Text:")


geheimtext = ""
for b in vtext:
    if b in cc:
        neu = cc[b]
    else:
        neu = b
    geheimtext = geheimtext + neu


print geheimtext

raw_input()


entschlüsselung:

Code: Alles auswählen

# -*- coding: cp1252 -*-
#Autor: Sebby Stankie
#Datum: 19.07.2008
#Entschlüsselungsprogramm

geheim = ("XIIOXOXXIOXIXIOO", "IXIIXIOXIOOIXXOO",
          "OOOXOIXIXXXOOIOO", "OOIIOXXOOIOIIIXX",
          "IXXXXXXXIIOIOIXI", "IIIIIXOOIIIIXXXX",
          "OOXOOIOIOIIXIIOX", "OIIXOIXIIOOXOOIX",
          "XXIOXIXIOXXIXXOO", "IXOXXOXIOOOXIOOI",
          "XIOIXIOOOXIIOIIO", "OXOIIXIOXIXOIXXI",
          "OIXXOOXIOXIXOOOX", "OXOXXOOIOOXXXIXI",
          "IIXIXIIOXXOIXIOI", "OIIXIXXIOOIOXIXX",
          "IOOOOXXIOXXXOOII", "IOXXOIOIXXIIIOOO",
          "OIXOOOOIOXOIOIXO", "IIXIIIIXXXXXIOOO",
          "OIIOIXXOOOOOXIXX", "OIIXOIIXIOXOIXXO",
          "XIXIOOOXIOXOXIXI", "IOOXOOOOOIIOOOXO",
          "OIIXIXIXIIOIIOXI", "OOOIOIOXXIXIXOXO",
          "XXIIXXIXOOOXXIIO", "OIOIOOOXIOXIXXXI")


klar = ("a","b","c","d","e","f","g","h","i","j",
        "k","l","m","n","o","p","q","r","s","t",
        "u","v","w","x","y","z","ß"," ")

cc = {}

for j in range(28):
    cc[geheim[j]] = klar[j]

vtext = raw_input("Zu entschlüsselnder Text:")


geheimtext = ""
for b in vtext:
    if b in cc:
        neu = cc[b]
    else:
        neu = b
    geheimtext = geheimtext + neu


print geheimtext

raw_input()
ich bedank mich schon mal für hilfe, aber die verschlüsselung sollte bitte so bleiben das aus ein buchstaben 16zeichen werden <- danke

Edit (Leonidas): Code in Python-Tags gesetzt.

Verfasst: Dienstag 22. Juli 2008, 15:57
von BlackJack
Lass Dir beim Entschlüsseln doch einfach mal ausgeben an was `b` in der Schleife gebunden wird. Dann sollte klar werden, warum das so nicht funktionieren kann.

Verfasst: Dienstag 22. Juli 2008, 16:17
von cofi
Warum benutzt du eigentlich zwei unverbundene Tupel und nicht einfach ein Dictionary?

Verfasst: Donnerstag 24. Juli 2008, 11:22
von SebbyStankie
danke erstmal für die schnellen antworten.

zu BlackJack, aber wie lass ich mir das ausgeben an was 'b' gebunden ist?


zu cofi, ich glaub du meinst das ich zwei "tabellen" habe oder?
ich weiß aber nicht wie ich das anders machen kann das es 16 zeichen werden.

wie gesagt bin noch nicht lange mit python

Verfasst: Donnerstag 24. Juli 2008, 11:27
von Leonidas
SebbyStankie hat geschrieben:zu BlackJack, aber wie lass ich mir das ausgeben an was 'b' gebunden ist?

Code: Alles auswählen

print b
:roll:

Verfasst: Donnerstag 24. Juli 2008, 11:35
von SebbyStankie
:? danke !!!

Verfasst: Donnerstag 24. Juli 2008, 11:39
von SebbyStankie
also
'print b' hat bei mit 'b' angezeigt. und wie kann ich das beheben?

weil es geht doch auch bei der verschlüsselung. wieso nicht beim entschlüsseln? :oops: ist mir schon bisschen peinlich :oops:

Verfasst: Donnerstag 24. Juli 2008, 12:00
von cofi
SebbyStankie hat geschrieben:zu cofi, ich glaub du meinst das ich zwei "tabellen" habe oder?
ich weiß aber nicht wie ich das anders machen kann das es 16 zeichen werden.
Was in ein Paar von `()' eingebunden ist, ist ein Tupel. Da es dir um eine Übersetzung von einem Wert in einen anderen geht, solltest du ein Dictonary (Hashmap)benutzen.

Also sowas:

Code: Alles auswählen

translation_dict = {'a' : 'XIIOXOXXIOXIXIOO'}
Und so weiter ...
Dann kannst du eben per

Code: Alles auswählen

translation_dict['buchstabe']
übersetzen.

Verfasst: Donnerstag 24. Juli 2008, 12:07
von SebbyStankie
ok, DANKE werd ich gleich mal ändern. :D

Verfasst: Donnerstag 24. Juli 2008, 12:21
von BlackJack
@SebbyStankie: ``print b`` hat bei Dir wahrscheinlich nicht 'b' angezeigt. Beim Entschlüssseln hätte dazu die Eingabe falsch sein müssen. Ausserdem würde ja nicht nur ein Zeichen ausgegeben sondern die gesamte Eingabe.

Verfasst: Donnerstag 24. Juli 2008, 19:39
von roschi
hallo!

ich weiss nicht, ob du das einfach nur schreibst, um dich mit python vertraut zu machen, oder ob du damit ernsthaft sachen verschluesseln willst.

falls letzteres zutrifft, kann ich dir empfehlen, dir mal ein programm von mir anzuschauen:
http://home.arcor.de/roschi94/simplecrypt_source.zip

ich moechte nicht behaupten, dass das wirklich sicher ist, aber es ist auf jeden fall platzsparender und doch ein bissl sicherer als deins. :)

mfg
roschi

Verfasst: Donnerstag 24. Juli 2008, 20:33
von SebbyStankie
:cry: das programm von dir schließt sich immer wieder.
hängt wohl damit zusammen, dass ich windows benutze :oops:
und ja ich möchte mich noch mit python vertraut machen. ich bin ja auch erst seit ca. 3 wochen damit beschäftigt.

aber nochmal zu meinem code. ich verstehe es nicht das die verschlüsselung klappt aber das entschlüsseln nicht. liegt es daran das ich beim entschlüsseln aus 16zeichen ein buchstaben machen will. :?:

hier nochmal der neu code zum entschlüsseln:

d={'XIIOXOXXIOXIXIOO' : 'a', 'IXIIXIOXIOOIXXOO' : 'b',
'OOOXOIXIXXXOOIOO' : 'c', 'OOIIOXXOOIOIIIXX' : 'd',
'IXXXXXXXIIOIOIXI' : 'e', 'IIIIIXOOIIIIXXXX' : 'f',
'OOXOOIOIOIIXIIOX' : 'g', 'OIIXOIXIIOOXOOIX' : 'h',
'XXIOXIXIOXXIXXOO' : 'i', 'IXOXXOXIOOOXIOOI' : 'j',
'XIOIXIOOOXIIOIIO' : 'k', 'OXOIIXIOXIXOIXXI' : 'l',
'OIXXOOXIOXIXOOOX' : 'm', 'OXOXXOOIOOXXXIXI' : 'n',
'IIXIXIIOXXOIXIOI' : 'o', 'OIIXIXXIOOIOXIXX' : 'p',
'IOOOOXXIOXXXOOII' : 'q', 'IOXXOIOIXXIIIOOO' : 'r',
'OIXOOOOIOXOIOIXO' : 's', 'IIXIIIIXXXXXIOOO' : 't',
'OIIOIXXOOOOOXIXX' : 'u', 'OIIXOIIXIOXOIXXO' : 'v',
'XIXIOOOXIOXOXIXI' : 'w', 'IOOXOOOOOIIOOOXO' : 'x',
'OIIXIXIXIIOIIOXI' : 'y', 'OOOIOIOXXIXIXOXO' : 'z',
'XXIIXXIXOOOXXIIO' : 'ß',}

text = raw_input('zu entcodierender text:')

geheimtext=""
for buchstabe in text:
if buchstabe in d:
neu=d[buchstabe]
else:
neu=buchstabe
geheimtext=geheimtext+neu

print geheimtext

Verfasst: Donnerstag 24. Juli 2008, 20:50
von Leonidas
SebbyStankie hat geschrieben::cry: das programm von dir schließt sich immer wieder.
hängt wohl damit zusammen, dass ich windows benutze :oops:
Nein, das liegt daran dass du die FAQ nicht gelesen hast, Punkt "Wie starte ich Programme".

Verfasst: Donnerstag 24. Juli 2008, 20:55
von roschi
hallo!

also:
mein programm schliesst sich, weil du es wahrscheinlich einfach nur immer doppelt angeklickt hast im explorer wie jedes andere grafische programm auch. du musst deine shell oeffnen (Start -> Ausfuehren -> cmd -> OK), und dann in den ordner wechseln wo du mein programm hingepackt hast. (cd pfad\zum\programm). dann sagst du dem python-interpreter, dass er das programm aufrufen soll (c:\python25\python simplecrypt.py) dann hast du es geschafft, und musst nurnoch lesen und ein bissl nachdenken.

hier dein code (ungetestet):

Code: Alles auswählen

# das beispiel geht davon aus,
# dass du beim eintippen des
# verschluesselten textes keine
# fehler machst!

d={'XIIOXOXXIOXIXIOO' : 'a', 'IXIIXIOXIOOIXXOO' : 'b',
'OOOXOIXIXXXOOIOO' : 'c', 'OOIIOXXOOIOIIIXX' : 'd',
'IXXXXXXXIIOIOIXI' : 'e', 'IIIIIXOOIIIIXXXX' : 'f',
'OOXOOIOIOIIXIIOX' : 'g', 'OIIXOIXIIOOXOOIX' : 'h',
'XXIOXIXIOXXIXXOO' : 'i', 'IXOXXOXIOOOXIOOI' : 'j',
'XIOIXIOOOXIIOIIO' : 'k', 'OXOIIXIOXIXOIXXI' : 'l',
'OIXXOOXIOXIXOOOX' : 'm', 'OXOXXOOIOOXXXIXI' : 'n',
'IIXIXIIOXXOIXIOI' : 'o', 'OIIXIXXIOOIOXIXX' : 'p',
'IOOOOXXIOXXXOOII' : 'q', 'IOXXOIOIXXIIIOOO' : 'r',
'OIXOOOOIOXOIOIXO' : 's', 'IIXIIIIXXXXXIOOO' : 't',
'OIIOIXXOOOOOXIXX' : 'u', 'OIIXOIIXIOXOIXXO' : 'v',
'XIXIOOOXIOXOXIXI' : 'w', 'IOOXOOOOOIIOOOXO' : 'x',
'OIIXIXIXIIOIIOXI' : 'y', 'OOOIOIOXXIXIXOXO' : 'z',
'XXIIXXIXOOOXXIIO' : 'ß',}

text = raw_input('zu entcodierender text:')

geheimtext=""

# eine schleife, die solange weitermacht, bis nix mehr in der variable 'text' steht
while text:
  # die ersten 16 zeichen von 'text' in 'x' abspeichern
  x = text[:16]
  # jetzt die ersten 16 zeichen aus der variable 'text' entfernen
  text = text[16:]
  # den richtigen buchstaben zu den 16 zeichen raussuchen
  geheimtext += d[text]

print geheimtext
mfg
roschi

PS: setz deinen code bitte naechstes mal in tags

Verfasst: Freitag 25. Juli 2008, 12:37
von SebbyStankie
vielen dank !!! für deine variante meines codes :D
musste nur noch

Code: Alles auswählen

geheimtext += d[text]
in

Code: Alles auswählen

geheimtext += d[x]
ändern und es ging.

nochmals vielen dank an alle für die schnelle hilfe :D :D :D

Verfasst: Freitag 25. Juli 2008, 12:39
von cofi
Der Grund, warum dein Code nicht hingehaun hat ist, dass du mit einer for-schleife, die über einen String iteriert an die einzelnen Zeichen kommst. Was du allerdings zum entschlüsseln brauchst ist eine Sequenz von 16 Zeichen ;) Darum brauchst du slicing, wies bei roschis Code auch zu sehen ist.

Aber was ich grad sehe:

Code: Alles auswählen

if buchstabe in d:
    neu = d[buchstabe]
else:
    neu = buchstabe
geheimtext=geheimtext+neu
Das kann doch nicht so beabsichtigt sein?! Wenn ein Buchstabe kein gültiger Code ist, dann ist es doch eine falsche Eingabe und damit eine Ausnahme, die du raisen solltest.

Noch ein Tipp wegen der Lesbarkeit: Quetsch doch nich zwei Dictionary-Einträge in dieselbe Zeile, ein Eintrag pro Zeile ist besser lesbar.

Verfasst: Samstag 26. Juli 2008, 11:31
von SebbyStankie
alles klar mach ich dann mal so: eine zeile -> ein Dictionary-Eintrag

zu oben den code, den benutz ich jetzt ja nicht mehr.