www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

Daten merken
Auto-Login
Registrieren
 
Online
niemand
 
Forumsuche
Suche nach:

Logo - DracheHaskell-Forum

  1 2 3 nächste Seite

Blacksoul

Gepostet:
26.01.2007 23:04

Multiplaktions Chiffrierung  
Hallo,

wir haben im Unterricht als erstes die Funktion Caesar geschrieben(+Dechiffrierung):


import Char

caesar:: String -> Int -> String
caesar "" n = ""
caesar (x:xs) n = (chr (( ord x)+n)) :caesar xs n

decaesar:: String -> Int -> String
decaesar "" n = ""
decaesar (x:xs) n = (chr (( ord x)-n)) :decaesar xs n


Nun haben wir das ganze für mit multiplikation gemacht, aber nur im bereich der ascii-tabelle:


multcaesar:: String -> Int -> String
multcaesar "" n = ""
multcaesar (x:xs) n = (chr ((( ord x)*n) `mod` 255)) :multcaesar xs n


Frage ist jetzt, wie ich das ganze wieder rückgängig machen kann, da ich ja eigentlich kein erweiterungsfaktor dann gegeben habe..oder?

mfg
Zum Seitenanfang    
 
Siracusa

Gepostet:
27.01.2007 21:47

   
Zur Verschlüsselung benutzt du die Rechnung c = n*w mod p, mit p=255. Dabei sind w ein Klartextzeichen, c ein Geheimtextzeichen, n der Faktor und p der Modul. Zur Entschlüsselung wird dann die Gleichung nach w umgestellt und es ergibt sich w = c*n' mod p, wobei n' das multiplikative Inverse zu n im Modul p ist. Das Problem ist, daß man hier nicht einfach dividieren kann. Du mußt also einen Wert n' finden, so daß gilt 1 = n*n' mod p. Das geht z.B. durch Ausprobieren aller Werte zwischen 1 und p-1.
Wichtig ist allerding noch, daß es nicht in jedem Modul p zu jedem Wert n ein Inverses gibt. Das ist nur gesichert, wenn p eine Primzahl ist. Bei deinem Beispiel wäre z.B. 257 ganz gut, denn dann gibt es genau 256 (1..256) Elemente die ein Inverses haben, also ebensoviele wie es Zeichen im ASCII-Zeichensatz gibt.

Viele Grüße,

Siracusa
Zum Seitenanfang    
 
Blacksoul

Gepostet:
27.01.2007 22:53

   
Hmm...also statt mod=255 ...257-1 ?

ich glaube, ihren (darf man sie auch dutzen?....wäre dann eher für die gewohnheit^^) ansatz habe ich verstanden...

das könnte man gut mit listenkomprehensions hinbekommen..denk ich..

mfg
Edit: Ich habe aber doch beim zureckrechnen keinen erweiterungsfaktor, oder? ..insofern ginge ja n*n' nicht, da beides nicht gegeben ist..
Zum Seitenanfang    
 
Siracusa

Gepostet:
28.01.2007 18:35

   
Vorneweg erst einmal: Keine Scheu vor dem Du, wir dutzen uns hier im Forum alle.

Dann zum Faktor. Der Faktor muß auch bei der Entschlüsselungsfunktion gegeben sein, da der Klartext sonst nicht eindeutig wiederherstellbar wäre (genau wie der Summand bei der einfachen Verschiebemethode).

Und zu guter letzt nochmal zu der Multiplikationsmethode. Da hab ich mal nachgeblättert und mir ist aufgefallen, daß du deine ursprüngliche Variante auch verwenden kannst, wenn du dich darauf beschränkst, nur solche Faktoren n zu verwenden, die mit dem Modul p keinen gemeinsamen Teiler haben, also gcd n p == 1. p kann dann aber beliebig sein.
Bei meinem Vorschlag müßte ord w erst einmal um 1 verschoben werden, damit nicht mit den Zahlen von 0..255, sondern von 1..256 gerechnet wird (um ein eindeutiges Inverses zu garantieren). Die so verschobene Zahl kann dann mit n multipliziert werden und das Ergebnis modulo p=257 genommen werden. Da nun wieder eine Zahl zwischen 1..256 herauskommt, muß wieder um 1 zurückverschoben werden und das Ergebnis in einen Char umgewandelt werden. Die entsprechende encode-Funktion sieht dann so aus:

encode "" _ = []
encode (w:ws) n = chr ((mod (n*(1+ord w)) 257)-1) : encode ws n

Die Entschlüsselungsfunktion dann nach dem selben Prinzip, nur eben mit n'.

Viele Grüße,

Siracusa
Zum Seitenanfang    
 
Blacksoul

Gepostet:
28.01.2007 20:12

   
in manchen foren sind ein paar leute, die man nicht mit du anreden sollte, weil man weiß, sie sind schon "weit" üebr 18

Ich werd mich morgen mal versuchen, etwas hinzubekommen...


dann danke ich dir^^...
Zum Seitenanfang    
 
Jacke

Gepostet:
29.01.2007 21:36

   
bei nen "sie" würde ich mir auch ganz schön alt vorkommen...Smilie
Zum Seitenanfang    
 
Blacksoul

Gepostet:
29.01.2007 22:14

   
ûnd noch was konstruktives zum thema? :D

hmmm...donnerstag muss ich es fertig haben...bleiben mir ja nichtmehr viele tage :/
Zum Seitenanfang    
 
Blacksoul

Gepostet:
30.01.2007 22:17

   
soo...da nun mein pc ein problem hat und alle programme fast automatisch schließt(u.a. auch winhugs) kann ich das proggen der sache komplett vergessen...

ich danke trotzdem für all eure bemühungen..:/

mfg
Edit: Wenn ich es chiffriere, muss ich es dann nich auch mit mod 257 machen? bzw. 256?
Zum Seitenanfang    
 
Jacke

Gepostet:
31.01.2007 07:13

   
ja da solltest du auch modulo teilen ...sonnst kommt sowas raus...
__ __ __ __ ____ ___


Main> caesar "z" 1
"{"
Main> caesar1 "z" 1
"{"
Main>


hast du mal versucht hugs neuzuinstallieren?

gruß jacke

ps: die funktion von siracusa kann man zum ver und entschlüßeln verwenden...
verschlüßeln: encode text n
entschlüßeln : encode text (1/n)

du solltest aber noch runden in die funktion einbauen..sonst klappt das nich so ganz mit den brüchen ...;-)
Zum Seitenanfang    
 
Blacksoul

Gepostet:
31.01.2007 13:54

   
hugs neu install -> geht nicht...da meine systemdatein irgendwie im arsch(sry) sind und kaum ein prog somit richtig geht..

dein post mit dem 1/n usw. hab ich nun wieder nicht verstanden :/

ich hab nunmal im normalen hugs ohend atei zu laden erstmal :l Char und dann dies gemacht:
-->
ord 'r' * 8 = 912

mach ich aber ord 'r' = 144 * 8 = 1152 ....was nun? Oo
<--
mfg

<--Edit: verguckt *sry*--> ..ich probier bis nachher nochmal was hinzubekommen..
Zum Seitenanfang    
 

  1 2 3 nächste Seite