Anwendung:
polybios in die uses mit aufnehmen.
Der eigentliche Clou der Codierung, nämlich der wirkliche Key, ohne den das Ganze wohl überhaupt keinen echten Sinn machen dürfte, bleibt hier völlig außen vor. Oder habe ich da etwas übersehen ?
Nun, hier ging es vorrangig um die Implementierung des Algorithmus.
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.
Im übrigen ist so etwas wie
Delphi-Quellcode:
result := '';
for i:= 1 to length(uncipheredText) do
begin
result := result + IntToStr(FKey.getIndex(uncipheredText[i]));
end;
sehr ineffizienter und schlechter Programmierstil, weil innerhalb der Schleife der ständig wachsende String (result) pausenlos im Arbeitsspeicher komplett umkopiert werden muss.
Das war mir bewusst, hätte ich wohl besser anmerken sollen, mir fiel nur gestern Nacht nichts besseres ein.
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;
Und das Wichtigste zuletzt:
Der Algorithmus in der Unit polybios ist falsch.
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
Ich habe den Key nun auf Matrix umgestellt - es geht dadurch wirklich viel einfacher.
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:
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;
TestData:
uncipheredText: abcdefghiklmnopqrstuvwxyz
key: abcdefghiklmnopqrstuvwxyz
cipheredText: 11121314152122232425313233343541424344455152535455
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.
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