Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Informatik klausur / krytologie (https://www.delphipraxis.net/1667-informatik-klausur-krytologie.html)

Timo 17. Dez 2002 15:44


Informatik klausur / krytologie
 
hi!
habt ihr schonmal ne klausur über kryptologie geschrieben? insbesondere transposition / substitution ( caesar / co )
caesar ist ja einfach und dazu hab ich auch schon ein nettes prog geschrieben - nur irgendwie bekomm ich das hier nicht so ganz auf die reihe:

aufgabe:

du haste ein codewort: hausburg: daraus macht der computer hausbrg ... er lässt alle buchstaben weg die schonmal vorkamen
daraus macht der pc ein geheimalphabet: in diesem falle hausbrgcdefijklmnopqtvwxyz
"darunter" legst du das normale alaphabet und verschlüsselst ein wort

kann mir wer das programmieren *Dreist gefragt*

am besten man arbeitet mit 2 arrays, oder?

helft mir bitte bitte bitte :love:

danke !!!

Timo 17. Dez 2002 15:48

das einlesen hab ich soweit fertig - er stoppt nur beim 2. gleichen buchstaben:

Code:
procedure TForm1.Button1Click(Sender: TObject);

var
   gtext: array[1..26] of char;
   gwort, alpha: string;
   a, b, f, x, zaehler: integer;
   i: char;

begin
   alpha := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
   gwort := Edit1.Text;
   b := 0;
   f := 1;
      for a := 1 to 26 do gtext[a] := ' ';
      for zaehler := 1 to length(gwort) do
         begin
            i := gwort[zaehler];
              if i <> ' ' then
                  begin
                     x := ord(i);
                        if (x <= 122) and (x >= 97) then x := x-32;
                            i := chr(x);
                        for a := 1 to 26 do
                        if gtext[a] = i then f := -1;
                        if f = 1 then begin
                            b := b + 1;
                           gtext[b] := i;
                  end;
         end;
memo1.text := gtext;
end;

Christian Seehase 17. Dez 2002 16:29

Moin Timo,

meinst Du das etwa so:

Delphi-Quellcode:
var
  sGeheim : string;

const
  _sAlpha = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';

procedure TForm1.Button1Click(Sender: TObject);

var
  sBasis : string;
  i     : integer;

begin
  // Erzeugen des Geheimalphabetes
  sBasis := UpperCase(Edit1.Text)+_sAlpha;
  sGeheim := StringOfChar(#32,26);
  for i := 1 to 26 do
  begin
    sGeheim[i] := sBasis[1];
    sBasis    := StringReplace(sBasis,sGeheim[i],'',[rfReplaceAll]);
  end;
  // Nur zu Testzwecken
  ShowMessage(sGeheim);
end;

procedure TForm1.Button2Click(Sender: TObject);

var
  i        : integer;
  sCrypt   : string;
  sOriginal : string;

begin
  // Ergebnis initialisieren
  sCrypt   := StringOfChar(#32,Length(Edit2.Text));
  sOriginal := UpperCase(Edit2.Text);
  // Alle Zeichen A bis Z codieren, den Rest
  // unverändert übernehmen
  for i := 1 to Length(Edit2.Text) do
  begin
    if sOriginal[i] in ['A'..'Z'] then
    begin
      sCrypt[i] := sGeheim[ord(sOriginal[i])-64];
    end
    else
    begin
      sCrypt[i] := sOriginal[i];
    end;
  end;
  Edit3.Text := sCrypt;
end;

nailor 17. Dez 2002 16:53

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    function KickDouble(Old: String): String;
    function BuildKey(Upon_What: String): String;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Schlussel: String;

Const Allowed: string = 'abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVXYZ1234567890';

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i : integer;
begin
Schlussel := edit1.Text;
Schlussel := KickDouble(Schlussel);
Label1.Caption := Schlussel;

Schlussel := BuildKey(Schlussel);
label2.Caption := Schlussel;
end;

function TForm1.KickDouble(Old: String): String;
var i,j: integer;
begin
SetLength(Result,1);
Result[1] := Old[1];
for i := 2 to Length(Old) do
    for j := 1 to Length(Result) do
        if Old[i] = Result[j] then
                    break
        else
        if j = Length(Result) then
            begin
                SetLength(Result,succ(Length(Result)));
                Result[Length(Result)] := Old[i];
            end;
end;

function TForm1.BuildKey(Upon_What: String): String;
var i,j: integer;
begin
Result := KickDouble(Upon_What + Allowed);
end;

end.
Das macht die doppelten weg und den Schlüssel. Nicht so perfekt, aber immerhin!

nailor 17. Dez 2002 16:55

Der Schlüssel muss mindestens 2 Stellen lang sein, aber das geht ja wohl, an sonsten muss man es gleich einfügen. Was du dann damit machen muss kommt gleich.

nailor 17. Dez 2002 17:24

So, dann noch das dabei

Delphi-Quellcode:
function TForm1.Encrypt(Plain_Text: String; KeyToUse: String): String;
var
    i,j:        integer;
    lpt,lks:     integer;  //Längenangaben: PlainText, KeyString
begin
lks := Length(KeyToUse);   //Länge der Schlüsselzeilen
lpt := Length(Plain_Text); //Länge des zu verschlüsselnden Textes

SetLength(Result,lpt);     //Länge des Ergebnisses

for i := 1 to lpt do                        //Den kompletten String lang
 for j := 1 to lks do                       //Die komplette Schlüssel-Zeile
  if Plain_Text[i] = Allowed[j] then        //vergleichen
   begin
    Result[i] := KeyToUse[j];               //und den entsprechenden Eintrag
    Break;                                  //wählen und abbrechen
   end
  else
   if j = lks then                          //Wenn nicht gleich und alle durch
     Result[i] := Plain_Text[i];            //alten nehmen
end;


function TForm1.Decrypt(Crypted_Text: String; KeyToUse: String): String;
var
    i,j:        integer;   //Schleifenvariablen
    lct,lks:    integer;   //Längenvariablen
begin
lks := Length(KeyToUse);    //Länge der Schlüssezeilen
lct := Length(Crypted_Text); //Länge der zu entschlüsselnden Textes

SetLength(Result,lct);      //Länge des Ergebnisses

for i := 1 to lct do                       //Den kompletten String lang
 for j := 1 to lks do                      //Die komplette Schlüssel-Zeile
  if KeyToUse[j] = Crypted_Text[i] then    //vergleichen
   begin
    Result[i] := Allowed[j];        //und den entsprechenden Eintrag
    Break;                          //wählen und abbrechen
   end
  else
   if j = lks then                  //Wenn nicht gleich und alle durch
     Result[i] := Crypted_Text[i];  //gleich lassen
end;
und dann kannst du mit
EinString := Encrypt('blabla',Schlussel);
Test := DeCrypt(Einstring,Schlussel);

ver und entschlüsseln.

Test muss dann 'blabla' ergeben. Du kannst die variable "allowed" nach belieben ändern.
Der Code ist für deinen Fall nicht der einfachste, aber du kannst dafür einfach:

nailor 17. Dez 2002 17:26

für keytouse einen array of string nehmen und dann jedes zeichen mit einem anderen schlüssel verschlüsseln


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:12 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 by Thomas Breitkreuz