![]() |
(Delphi) Polybios-Chiffre entschlüsseln
Hallo
Ich habe es geschafft einen Text mit der Polybios-Chiffre zu chiffrieren, aber ich weiß nicht wie man es dechiffriert. HALLO --> 23 11 32 32 35 Nun benötige ich eure Hilfe, wie mache ich es nun? Ich habe mir dabei gedacht, dass z.B. bei der 23 (H), die 2 zu einer 5 wird und mit der 3 addiert wird. Dadurch etsteht die 8 und H ist ja der 8. Buchstabe im Alphabet. Aber wie mache ich dass und wie soll es im Text gehen '23 11 32 32 35' Achja ich muss noch dazu sagen ich bin kein Delphi Ass also erklärt es mir so, dass ich es noch halbwegs verstehen kann^^ Hier der Delphi-Quelltext
Code:
procedure Thoi.verschluesseln (klartext: TStrings; Geheimtext: TStrings);
var i: integer; txt, sch: string; begin sch:=gibschluessel; Geheimtext.text:=''; geheimtext.text:=geheimtext.text + Zahlenumwandler(klartext.text); end; function Thoi.Zahlenumwandler(klartext: String):string; var a, b, i:integer; begin for i:=1 to length(klartext) do begin a:=(((ord(klartext[i]) - 64) div 5)) + 1; b:=(((ord(klartext[i]) - 64) mod 5)); if b = 0 then begin a:= a - 1; b:= b + 5; end; result:=result + inttostr(a) + inttostr(b); end; end; end. |
AW: (Delphi) Polybios-Chiffre entschlüsseln
Hallo,
![]() Klartext H GeheimText 23 Position in der Matrix:Spalte 3 und Zeile 2 Spalte := Geimtext(Zahl) mod 10; Zeile := Geimtext(Zahl) div 10; Grüße Klaus |
AW: (Delphi) Polybios-Chiffre entschlüsseln
Nun ja ich benutze aber keine Matrix.
Aber wenn man eine Matrix benutzen würde, wie implementiert man diese? |
AW: (Delphi) Polybios-Chiffre entschlüsseln
Liste der Anhänge anzeigen (Anzahl: 1)
Anwendung:
polybios in die uses mit aufnehmen.
Delphi-Quellcode:
was noch zu tun ist,
// encode Button
procedure TForm1.Button1Click(Sender: TObject); var polybios: TPolybios; begin polybios := TPolybios.create; try polybios.Key:='ABCDEFGHIKLMNOPQRSTUVWXYZ'; edit2.Text := polybios.encode(edit1.text); finally polybios.Free; end; end; // decode Button procedure TForm1.Button2Click(Sender: TObject); var polybios: TPolybios; begin polybios := TPolybios.create; try polybios.Key:='ABCDEFGHIKLMNOPQRSTUVWXYZ'; edit3.Text := polybios.decode(edit2.Text); finally polybios.Free; end; end; - einen zu kurzen Schlüssel auf 25 Zeichen anfüllen - sicherstellen das jeder Buchstabe nur einmal im Schlüssel vorkommt. (Ist nicht perfekt ..) Grüße Klaus |
AW: (Delphi) Polybios-Chiffre entschlüsseln
![]() |
AW: (Delphi) Polybios-Chiffre entschlüsseln
Zitat:
Im übrigen ist so etwas wie
Delphi-Quellcode:
sehr ineffizienter und schlechter Programmierstil, weil innerhalb der Schleife der ständig wachsende String (result) pausenlos im Arbeitsspeicher komplett umkopiert werden muss.
result := '';
for i:= 1 to length(uncipheredText) do begin result := result + IntToStr(FKey.getIndex(uncipheredText[i])); end; Um das zu vermeiden, sollte man so etwas besser machen wie z.B.:
Delphi-Quellcode:
Und das Wichtigste zuletzt: Der Algorithmus in der Unit polybios ist falsch.
// Variable für aktuelle Position in uncipheredText
j:=0; // Länge von Result fixieren // Länge des codierten Strings ist doppelt so groß wie der Klartext setlength(result, length(uncipheredText)*2); for i:= 1 to length(uncipheredText)*2 do begin if odd(i) then begin inc(j); // temp ist ein lokaler Shortstring, also ebenfalls mit fixierter Länge temp:=IntToStr(FKey.getIndex(uncipheredText[j])); result[i] :=temp[1] ; end else result[i] := temp[2]; end; Beispiel: Codiere "Delphi". das gibt (fälschlich mit der Unit polybios) D e l p h i mit Unit polybios: 14 20 31 40 23 24 richtig aber ist: 14 15 31 35 23 24 Also gibt es schon mit diesem kurzen Klartext von nur 6 Buchstaben im codierten Zustand 2 fehlerhafte Ausgaben. Der Grund dürfte in den vielfachen DIV- und MOD-Operationen zu suchen sein, deren Logik eher mühsam einsichtig ist. Ohnehin ginge das alles wesentlich übersichtlicher, einfacher und weniger fehleranfällig - wie bereits vorgeschlagen - mit Hilfe einer Matrix zu machen. Eine abschließende Bemerkung: wie sinnvoll ist es eigentlich, zur Hilfesuche für eine offensichtliche/vermutliche Hausaufgabe gleich eine komplette (wenn auch hier ernstlich fehlerhafte) Lösung zu posten. Da ja erkennbar erhebliche Defizite in den Grundlagen vorhanden sind (Zitat: "Aber wenn man eine Matrix benutzen würde, wie implementiert man diese?") wäre es vielleicht hilfreicher gewesen, allein einen entsprechenden Ansatz zu geben, wie man die Lösung angehen könnte, also wie man eine Matrix implementiert und wie man mit ihr umgeht. |
AW: (Delphi) Polybios-Chiffre entschlüsseln
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Es ist klar, dass die Verschlüsselung mit dem Key steht und fällt. Aber es bleibt auch immer eine monoalphatische Verschlüsselung welche relativ leicht zu brechen ist (Buchstabenverteilung/häufigkeit) wenn ein hinreichend langer Ciphertext zur Verfügung steht. Dazu ist es egal wie gut die Buchstaben im Key verwürfelt sind. Denn es ist auch eine Bedingung, dass alle Buchstaben (mit Ausnahme von "j") im Schlüssel vorhanden sein müssen. Zitat:
So schaut der Code nun aus:
Delphi-Quellcode:
setLength(result,length(uncipheredText)*2);
for i:= 1 to length(uncipheredText) do begin tmp := IntToStr(FKey.getIndex(uncipheredText[i])); result[2*i-1] := tmp[1]; result[2*i] := tmp[2]; end; Zitat:
Delphi-Quellcode:
TKey = class(TObject)
private FKeyMatrix : Array[1..5,1..5] of AnsiChar; public constructor create; procedure setKey(keyData: AnsiString); function getKey: AnsiString; function getChar(row: Byte; column: Byte): AnsiChar; function getIndex(c : AnsiChar): Byte; end;
Delphi-Quellcode:
procedure TKey.setKey(keyData: AnsiString);
begin if length(keyData) < sizeOf(FKeyMatrix) then begin // to do // Buchstaben dürfen nur einmal im Key vorkommen // Alle Buchstaben des Alphabets (ohne J) müssen im Key vorkommen raise Exception.Create('Key word not sufficient'); end; move(keyData[1],FKeyMatrix,sizeOf(FKeyMatrix)); end;
Delphi-Quellcode:
TestData:
function TKey.getChar(row: Byte; column: Byte): AnsiChar;
begin result := FKeyMatrix[row,column]; end; function TKey.getIndex(c: AnsiChar): Byte; var row, column: Byte; begin for row:= 1 to 5 do for column := 1 to 5 do if uppercase(FkeyMatrix[row,column]) = uppercase(c) then result := row * 10 + column; end; uncipheredText: abcdefghiklmnopqrstuvwxyz key: abcdefghiklmnopqrstuvwxyz cipheredText: 11121314152122232425313233343541424344455152535455 Zitat:
Manchmal kann es gut/hilfreich sein, eine Vorlage zu liefern anhand dieser das Problem nachvollzogen werden kann. Nun, wenn die Vorlage dann so fehlerhaft war wie die meine - dann ist das wahrscheinlich nicht sehr hilfreich. Danke für die Kritik - sie ist angekommen. Grüße Klaus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz