Autor Beitrag
Curby
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Do 11.09.03 20:30 
Tach zusammen,

ich bin totaler Anfänger und muss für die Schule ein Verschlüsselungsprogramm für Texte schreiben.
Es kann so simpel sein, wie es eben geht, d.h. z.B.: Buchstabentauschen (aus A wird H), oder Buchstaben feste Zahlen zuorden (aus A wird 12) - hauptsache simpel!

Ich wäre Euch sehr dankbar, wenn Ihr mir dabei helfen könntet!
Im vorraus schon mal ein Dankeschön für Eure Mühen

Curby
obbschtkuche
Gast
Erhaltene Danke: 1



BeitragVerfasst: Do 11.09.03 21:50 
das hier ist absolut unsicher, aber simpel.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
function bla(s: string; key: byte): string;
var
 i: integer;
begin
 result := '';
 for i := 1 to length(s) do
  result := result + chr(byte(s[i]) xor key)
end;
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 11.09.03 22:56 
Stimmt, ist simpel und unsicher. Aber durch das XOR kommen doch nicht nur wieder Buchstaben raus, oder?
Damit man nach der Kodierung auch wieder was lesen kann, kann man z.b
ROT13 nehmen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.Button1Click(Sender: TObject);
var
    i: integer;
begin
    edit2.text:='';
    for i := 1 to length(Edit1.Text) do
        edit2.Text:=Edit2.Text+
        chr((((ord(Edit1.Text[i])-65)+13mod 26)+65);
end;

Dies kodiert den Text von Edit1 nach Edit2.
Erklärung: die 65 ist die Nummer von 'A' im Ascii-Code. Die zieh ich ab, so dass die Buchstaben 'A' - 'Z' auf die Werte 0-25 kommen.
Auf diesen Wert pack ich 13 drauf, rechne das ganze modulo 26 (d.h. bei z.b. 24+13 kommt 37 raus. Modulo 26 ergibt das 11, denn 26+11=37).
Zum Schluss kommt wieder die 65 drauf, damit die Umwandlung mit chr zu einem Buchstaben wieder klappt.

So funktioniert das nur mit GROSSBUCHSTABEN.
Übrigens: Um den Text wieder zu entschlüsslen, kannst du dieselbe Funktion nehmen. Warum das so ist, verrat ich nicht, das ist ein Geheimnis ;-)
Und natürlich ist auch diese Funktion extrem unsicher.

_________________
We are, we were and will not be.
Curby Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Fr 12.09.03 10:54 
Das sieht ja schonmal super aus, aber wie kann ich denn den Text so vorbehandeln, dass nur noch Großbuchstaben vorhanden sind?
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Fr 12.09.03 12:07 
Es gibt zum einen die Funktion AnsiUpperCase. Dann bleiben aber immer noch die Nicht-Buchstaben, z.b. zahlen, leerzeichen, sonderzeichen und die umlaute (!) übrig.
Lösungsmöglichkeiten:
- diese Zeichen vorher löschen
- diese Zeichen unkodiert übernehmen
- den Algorithmus zu verändern, so dass er alle druckbaren Zeichen akzeptiert. Welche das sind, weiss ich nicht 100%ig. Wenn ich mich recht erinnere sind das alle bis auf die ersten 12 oder so. Du müßtest dann die Werte 65 und 26 in dem Algorithmus entsprechend anpassen.

_________________
We are, we were and will not be.
Curby Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Fr 12.09.03 20:49 
Ahja, kann mir da jemand einen Quelltext schreiben?
FeG
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 77

Win XP Home, SuSE Linux 8.2 Prof
D3 Prof, D7 Prof
BeitragVerfasst: Sa 13.09.03 00:27 
Curby hat folgendes geschrieben:
Ahja, kann mir da jemand einen Quelltext schreiben?

Ähh.... du hast doch schon zwei Codebeispiele!

Für deine ursprüngliche Idee: nimm mal "Case...", also z.B.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
Case Key of
  'A': EncodedKey:='X';
  'B': EncodedKey:='F';
  //...
  end;

Halt irgendwelche Buchstaben aussuchen...

Zitat:
ich [...] muss für die Schule ein Verschlüsselungsprogramm für Texte schreiben.

Genau! DU musst das Programm schreiben! Also: Streng dich mal ein bisschen an... Wenn es egal ist, wie sicher die Verschlüsselung sein soll, dann ist's doch wirklich net kompliziert...

MfG,
FeG
Curby Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: So 14.09.03 12:16 
Das Problem liegt dadrin, dass ich vorher noch nie mit Delphi gearbeitet habe. Ich kenn mich ziemlich gut mit HTML und CO. aus, aber eben nicht mit Delphi! Mein Lehrer war der Ansicht, dass wenn man HTML kann auch Delphi können sollte - seh ich aber nicht so ;)
Curby Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Di 16.09.03 15:23 
Sieht jetzt so aus: (Entschlüsselung!!!)


ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
var
i : integer;
EncodedKey : string;
Key : Char;

begin
Klartext := '' ;
Vorbehandeln(Geheimtext);

For i:=[1..7to length(Geheimtext) do

begin
key:=Geheimtext[i];

Case Key of
'XZYJVPQ': EncodedKey:= 'A';
'XYJVPQZ': EncodedKey:= 'B';
'JXZYVPQ': EncodedKey:= 'C';
'XZYJQVP': EncodedKey:= 'D';
'XZJVPQY': EncodedKey:= 'E';
'XZYVJPQ': EncodedKey:= 'F';
'JVPQXZY': EncodedKey:= 'G';
'ZYJVXPQ': EncodedKey:= 'H';
'JVPXZYQ': EncodedKey:= 'I';
'XVZYJPQ': EncodedKey:= 'J';
'XZYQJVP': EncodedKey:= 'K';
'XZJVYPQ': EncodedKey:= 'L';
'XZYJPVQ': EncodedKey:= 'M';
'XZYJVQV': EncodedKey:= 'N';
'XYJZVPQ': EncodedKey:= 'O';
'XYJVZPQ': EncodedKey:= 'P';
'YJVPQXZ': EncodedKey:= 'Q';
'QXZYJVP': EncodedKey:= 'R';
'XZYPJVQ': EncodedKey:= 'S';
'ZYJVPQX': EncodedKey:= 'T';
'XZYVJPQ': EncodedKey:= 'U';
'XZJYVPQ': EncodedKey:= 'V';
'XZYJVQP': EncodedKey:= 'W';
'ZYJXVPQ': EncodedKey:= 'X';
'XZYJPQV': EncodedKey:= 'Y';
'XZYVPQJ': EncodedKey:= 'Z';
end;

Klartext := Klartext + EncodedKey;

end;

end;


Problem: Verschlüselung klappt nun bestens, aber die Entschlüsselung haut mit diesem Quelltext nicht hin.
Frage: Was ist dadran falsch?
Curby Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Mi 17.09.03 18:22 
Kann mir keiner helfen?
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 17.09.03 18:32 
Wenn Du Dir anschaust, wie "Key" deklariert ist, sollte Dir das zeigen, was mit Deinem Code nicht stimmt. Wie soll ein Character mehr als ein Zeichen haben?

Und was soll das sein:
ausblenden Delphi-Quelltext
1:
For i:=[1..7to length(Geheimtext) do					

Kann sich das Programm aussuchen, bei welcher Zahl es beginnt? ;-)

Ach ja, Du solltest Deinen Code einrücken, sonst kann den ja niemand lesen.

MfG
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Curby Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: So 21.09.03 12:10 
Mein Problem liegt dadrin, dass ich nicht weiß, wie ich Delphi sage "Nimm 7 Zeichen und guck nach, welcher Buchstabe das ist".

Wenn i:=1, dann klappt das doch nicht, weil er mit einem einzelnen Buchstaben nichts anfangen kann.

Wie proggt man das denn?
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: So 21.09.03 12:44 
Am besten machst Du das Ganze nicht mir einer For- sondern mit einer While-Schleife. Bei der erhöhst Du den Zähler jeweils um 7 und holst Dir Deine 7er-Gruppen mittels Copy aus dem String heraus.

Den Vergleich kannst Du nicht mit Case machen. Ich würde die verschlüsselten Buchstaben, die Du jetzt für den Vergleich verwendest, in einem Array speichern und anhand der Position im Array den Klartextbuchtaben bestimmen.

MfG
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Curby Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Mo 22.09.03 17:17 
Weißt du wieviel ich davon verstanden habe?
Fast nichts - sorry, aber wie gesagt habe ich davon kaum Ahnung.

Ich würde dich bitten den Quelltext so umzuwandeln, da ich es nicht kann.
Ich wäre Dir sehr sehr sehr dankbar!
Ist mir peinlich, aber ich kann es wirklich nicht...
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 22.09.03 17:34 
Aber nur, weil ich ein so unglaublich toller Kerl bin!!!!

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
var
  Form1: TForm1;
{  sequences : Array[65..90] OF String
            = ('XZYJVPQ','XYJVPQZ', 'JXZYVPQ', ...);}

  sequences : Array[65..67OF String
            = ('XZYJVPQ','XYJVPQZ''JXZYVPQ');

implementation

{$R *.dfm}

function LetterFromSequence(sequence : String) : Char;
VAR i : INTEGER;
begin
  //for i:=65 TO 90 DO
  for i:=65 TO 67 DO
  if sequence = sequences[i] then
  begin
    result := Chr(i);
    exit;
  end;
  result := '*';
end;

function ClearFromEnc (Enc : String) : String;
VAR i : Integer;
    part : String;
begin
  i:=1;
  result:= '';
  while i <= Length(Enc)-6 do
  begin
    part := Copy(Enc, i, 7);
    result := result + LetterFromSequence(part);
    i := i + 7;
  end;
end;

function EncFromClear (Clear : String) : String;
VAR i, index : INTEGER;
begin
  result := '';
  for i:=1 TO Length(Clear) do
  begin
    index := Ord(Clear[i]);
    //if index IN [65..90]
    if index IN [65..67then
    result := result + sequences[index];
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  edit2.text := EncFromClear(edit1.text);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  edit1.text := ClearFromEnc(edit2.text);
end;


So, kurz erklärt: auf der Form befindet sich edit1 für den Klartext, edit2 fürs Verschlüsselte. Button1 verschlüsselt edit1 und schreibt das Ergebnis in edit2, Button2 macht genau das umgekehrte.
In "sequences" stehen die verschlüsselten Buchstaben, der Index entspricht dem ASCII-Code. Ich habe erstmal nur die ersten drei verschlüsselten Buchstaben eingetragen (also A, B, C), den Rest musst Du machen und entsprechend den Code nutzen, den ich jetzt auskommentiert habe.
Den Rest musst Du Dir selber erklären, damit Du auch noch ein bisschen Arbeit hast. Aber das Prinzip steht schon in dem Posting, das Du nicht verstanden hast. ;-)

MfG
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".


Zuletzt bearbeitet von Christian S. am Mo 22.09.03 19:17, insgesamt 1-mal bearbeitet
Curby Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Mo 22.09.03 19:16 
Danke!!!!!! :wink: :D