Einzelnen Beitrag anzeigen

Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: (Delphi) Polybios-Chiffre entschlüsseln

  Alt 6. Mär 2012, 20:09
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
Angehängte Dateien
Dateityp: zip polyBiosProject.zip (459,3 KB, 3x aufgerufen)
Klaus

Geändert von Klaus01 ( 6. Mär 2012 um 21:26 Uhr)
  Mit Zitat antworten Zitat