Vignere-Verschlüsselung
-
Hallo,
ich möchte in mein Projekt eine Vignere-Verschlüsselung einbauen.
Nun habe ich die folgende Frage:Wie kann ich das bestehende Vignere-Quadrat erweitern, um auch Kleinbuchstaben und Sonderzeichen mit aufzunehmen?
const char table[26][26] = { { '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' }, { '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','A' }, { 'C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B' }, { 'D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C' }, { 'E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D' }, { 'F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E' }, { 'G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F' }, { 'H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G' }, { 'I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H' }, { 'J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I' }, { 'K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J' }, { 'L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K' }, { 'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L' }, { 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M' }, { 'O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N' }, { 'P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O' }, { 'Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P' }, { 'R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q' }, { 'S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R' }, { 'T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S' }, { 'U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T' }, { 'V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U' }, { 'W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V' }, { 'X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W' }, { 'Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X' }, { 'Z','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' } };
-
komm am besten erstmal von dem quadrat los. damit aufm rechner zu arbeiten ist viel zu umständlich...
Und betrachte eher die ASCII Werte der Zeichen. (z.b. 'A' = 65, 'B' = 66, '1' = 49 ....)
und nun rechnest du das erste zeichen des Textes + erste zeichen des passwortes.Schau dir dafür mal die CString Methoden GetAt() und SetAt() näher an.
und keine sorge, wenn du beim addieren über 255 kommst, gehts trotzdem. er fängt einfach bei 0 wieder an.
mfg Emperor_L0ser
-
Hi Emperor_L0ser,
danke für deine aussagekräftige Antwort!

Ich bin gerade dabei, mein Beispiel mit CStrings umzuarbeiten (sind mir eh lieber als diese Zeichen-Arrays mit denen ich bisher gearbeitet habe).
Danke für den Hinweis, dass man wieder bei NULL anfängt, wenn man die ASCII-Zeichenbegrenzung überschritten hat. Ich hätte vermutet, dass es zu einem Fehler führt...
Das Einzige, was mir aufgefallen ist, ist dass die Werte nun nicht mehr identisch mit dem "ursprünglichen" Vignere-Algo sind (falls man nur Großbuchtaben als Zeichenkette und Schlüssel verwendet). Das ist aber gar nicht mal so schlecht im Hinblick auf die Sicherheit.
Noch eine Frage hinterher:
Welcher "Grundschlüssel" ist am Geeignetsten um ein optimales Verschlüsselungsergebnis zu bekommen? Ein sehr langer wie $Kzsdf%6345 oder eher ein kurzer?
-
Dressman1981 schrieb:
Noch eine Frage hinterher:
Welcher "Grundschlüssel" ist am Geeignetsten um ein optimales Verschlüsselungsergebnis zu bekommen? Ein sehr langer wie $Kzsdf%6345 oder eher ein kurzer?
was meinst du mit grundschlüssel?
wenn du damit das passwort zum ent/verschlüsseln meinst, je länger desto besser. je länger desto besser, welche zeichen das sin ist total egal (nnur nicht 10 mal das gleiche versteht sich)
bei vigenere gilt: je länger das passwort, je kürzer der text desto sicherer. wenn du als passwort die bibel nimmst, oder c++grundlagen 2. auflage und keiner weiss es natürlich, ist vigenere auch heute noch nicht knackbar.
-
Ja, mit Grundschlüssel meinte ich die Zeichenfolge die ich standardmäßig als Schlüssel definiere. Ich könnte ja theoretisch nur "POR" als Schlüssel einsetzen. Bei einem 7 Zeichen langen Wort, würde dann "PORPORP" als Schlüssel entstehen.
Ich werde also einen möglichst lange Zeichenfolge nutzen.
Nun habe ich aber noch eine dringende Frage:
Ich speicher mit Hilfe einer ini-Klasse die Werte in eine Datei. Nun kommt es manchmal dazu, dass der komplette Rest der Datei überschrieben wird.
Nach vielen Herumexperimentieren bin ich darauf gekommen, dass es an dem ASCII-Zeichen 26 liegt, welches manchmal erzeugt wird. Das ist ja das Escape-Zeichen und bricht damit den aktuellen Befehl ab.
Anscheinend ist es doch nicht so unproblematisch, den vollständigen Zeichensatz zu nutzen. Reicht es wenn ich diesen ASCII-Code ignoriere, oder muss ich noch weitere Steuerzeichen übergehen?

-
ich hab meine daten nicht als txt (ini) dateien gespeichert, sondern mit CArchive und hatte dabei eigentlich nie probleme.
hier eine methode zum speichern:
CString s = "hallo welt"; CFile file("dateiname.xyz",CFile::modeWrite|CFile::modeCreate); CArchive ar(&file,CArchive::store); ar << s;hier zum datei öffnen
CString s = ""; CFile file("dateiname.xyz",CFile::modeRead); CArchive ar(&file,CArchive::load); ar >> s; ASSERT( s == "hallo welt")wenn du ganz ischer gehen willst, nimmst du alle ascii zeichen von 0-31 raus das sind nämlich die steuerzeichen
-
Hey Emperor_L0ser!
Die Archive-Klasse kann ich leider nicht nutzen, da auch die Möglichkeit bestehen soll, die ini-Dateien von Hand zu verändern.
Die Datei soll ja nicht nur codierten Text, sondern auch Klartext erhalten.Dann werde ich wohl sicherheitshalber die entsprechenden Steuerzeichen einfach außen vorlassen.
Ich danke dir!