AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

(Delphi) Polybios-Chiffre entschlüsseln

Offene Frage von "Klaus01"
Ein Thema von Hajaku · begonnen am 4. Mär 2012 · letzter Beitrag vom 6. Mär 2012
Antwort Antwort
Hajaku

Registriert seit: 4. Mär 2012
2 Beiträge
 
#1

(Delphi) Polybios-Chiffre entschlüsseln

  Alt 4. Mär 2012, 18:39
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.
  Mit Zitat antworten Zitat
Klaus01

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

AW: (Delphi) Polybios-Chiffre entschlüsseln

  Alt 4. Mär 2012, 19:14
Hallo,

PolyBios benutzt doch eine Matrix (5x5; Array[1..5,1..5] bzw. Array[0..4,0..4]) um aus dem Geheimtext wieder den Klartext zur erhalten, musst Du nur die Spalte und Zeile der Matrix aufsuchen.

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
Klaus

Geändert von Klaus01 ( 5. Mär 2012 um 10:58 Uhr)
  Mit Zitat antworten Zitat
Hajaku

Registriert seit: 4. Mär 2012
2 Beiträge
 
#3

AW: (Delphi) Polybios-Chiffre entschlüsseln

  Alt 4. Mär 2012, 20:14
Nun ja ich benutze aber keine Matrix.

Aber wenn man eine Matrix benutzen würde, wie implementiert man diese?
  Mit Zitat antworten Zitat
Klaus01

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

AW: (Delphi) Polybios-Chiffre entschlüsseln

  Alt 5. Mär 2012, 23:39
Anwendung:

polybios in die uses mit aufnehmen.

Delphi-Quellcode:
// 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;
was noch zu tun ist,
- 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
Angehängte Dateien
Dateityp: pas polybios.pas (3,2 KB, 4x aufgerufen)
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#5

AW: (Delphi) Polybios-Chiffre entschlüsseln

  Alt 6. Mär 2012, 08:16
Crossposts bitte künftig verlinken. Danke
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
ASM

Registriert seit: 16. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: (Delphi) Polybios-Chiffre entschlüsseln

  Alt 6. Mär 2012, 10:41
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 ?

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.

Um das zu vermeiden, sollte man so etwas besser machen wie z.B.:
Delphi-Quellcode:
   // 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;
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

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.

Geändert von ASM ( 6. Mär 2012 um 16:14 Uhr) Grund: kleine Korrektur im Code mit Hilfe einer zusätzlichen Positionsvariablen "j"
  Mit Zitat antworten Zitat
Klaus01

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

AW: (Delphi) Polybios-Chiffre entschlüsseln

  Alt 6. Mär 2012, 21: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 22:26 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz