www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

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

Logo - DracheHaskell-Forum

blizz

Gepostet:
31.05.2006 08:31

Vigenère Verschlüsseln  
a) Schreiben Sie eine Funktion getLetters :: String -> String, die aus einem String alle Zeichen entfernt, die keine
Buchstaben sind, und die verbleibenden Zeichen in Großschreibung umwandelt.

b) Im Mittelalter wurde zur Verschlüsselung das Vigenère-Verfahren verwendet. Es wurde veröentlicht im Jahr 1586
von Blaise de Vigenère und galt lange Zeit als sicher. Hier wird Schlüsselwort gewählt (z. B. SCHLUESSEL)und
zyklisch wiederholt über den Text geschrieben. Jedes Zeichen des Schlüsseln bestimmt nun, mit welchem Cäsar-
Code das darunterstehende Zeichen des Textes verschlüsselt wird.

S C H L U E S S E L S C
B E I S P I E L T E X T
T G P D J M W D X P P V

Implementieren Sie eine Funktion vigenere :: String -> String -> String, die einen Text auf diese Weise verschlüsselt.
Gehen Sie dabei davon aus, daß auf den Text zuvor die Funktion getLetters angewendet wurde.

Wie mache ich die Aufgabe am besten??
Die a hab ich schon:

import Char -- für Zeichenumwandlung "toUpper"

getLetters:: String -> String
getLetters = map toUpper . filter isAlpha . filter isAscii


aber bei der zweiten komme ich nicht weiter, kann mir jemand helfen?
Zum Seitenanfang    
 
Jacke

Gepostet:
31.05.2006 09:19

   
import Char   -- für Zeichenumwandlung "toUpper"

getLetters:: String -> String
getLetters = map toUpper . filter isAlpha . filter isAscii

vigenere :: String -> String -> String
vigenere key text=vignere2 key key text
vignere2 key acc []=""
vignere2 key [] t=vignere2 key key t
vignere2 key (a:acc) (s:text)=[(toEnum( ( (fromEnum a)+(fromEnum s)-130 )`mod`25 +65)::Char)]++(vignere2 key acc text)


ist relativ umständlich...das (minus 65)*2 und dann modulo 25 muß man machen weil 'A' in Enum 65 ergibt und 'Z' 90 damit man immer von vorne die Buchtstaben hat also Z+A=Z
die zweite funktion brauchte ich weil ich den key nochmal extra mitführen mußte

gruß jacke
Zum Seitenanfang    
 
Siracusa

Gepostet:
31.05.2006 15:47

   
Wieso modulo 25? Das Alphabet hat doch 26 Buchstaben.
Zum Seitenanfang    
 
Jacke

Gepostet:
31.05.2006 16:38

   
A fängt doch bei null an...macht dann 26

zähl mal von 65 bis 90 hoch...ist genau 26

Zum Seitenanfang    
 
Siracusa

Gepostet:
31.05.2006 17:16

   
Eben, 26.

toEnum (((fromEnum 'A') + (fromEnum 'Z') - 130)`mod`25 + 65) :: Char
= toEnum ((65+90-130)`mod`25 + 65) :: Char
= toEnum (25`mod`25 + 65) ::Char
= toEnum (0 + 65) :: Char
= 'A'

Wenn 'A' der 0 entspricht müßte aber 'Z' rauskommen.
Zum Seitenanfang    
 
Jacke

Gepostet:
31.05.2006 17:48

   
import Char   -- für Zeichenumwandlung "toUpper"

getLetters:: String -> String
getLetters = map toUpper . filter isAlpha . filter isAscii

vigenere :: String -> String -> String
vigenere key text=vignere2 key key text
vignere2 key acc []=""
vignere2 key [] t=vignere2 key key t
vignere2 key (a:acc) (s:text)=[(toEnum( ( (fromEnum a)+(fromEnum s)-128 )`mod`26 +64)::Char)]++(vignere2 key acc text)


gut hast mich überzeugt :-)
Zum Seitenanfang    
 
blizz

Gepostet:
01.06.2006 14:31

   
ich danke euch Smilie

Implementieren Sie eine Funktion vigenere :: String -> String -> String, die einen Text auf diese Weise verschlüsselt.
Gehen Sie dabei davon aus, daß auf den Text zuvor die Funktion getLetters angewendet wurde.


Wie bekomme ich jetzt die Funktion mit eingebaut das er die überprüfung mit getLetters macht?
hab schon ein paar möglichkeiten ausprobiert, kommt aber nicht das raus was rauskommen sollte Smilie
Zum Seitenanfang    
 
Jacke

Gepostet:
01.06.2006 15:36

   

import Char -- für Zeichenumwandlung "toUpper"

getLetters:: String -> String
getLetters = map toUpper . filter isAlpha . filter isAscii

vigenere :: String -> String -> String
vigenere key text=vignere2 key key (getLetters text)
vignere2 key acc []=""
vignere2 key [] t=vignere2 key key t
vignere2 key (a:acc) (s:text)=[(toEnum( ( (fromEnum a)+(fromEnum s)-128 )`mod`26 +64)::Char)]++(vignere2 key acc text)


so :-) für den key würdest dus genauso machen ...einfach die klammern rum und getLetters davor
Zum Seitenanfang