AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Caeser Verschlüsselung

Ein Thema von SirMaurice · begonnen am 26. Mär 2019 · letzter Beitrag vom 26. Mär 2019
Antwort Antwort
Seite 1 von 2  1 2   
SirMaurice

Registriert seit: 7. Dez 2018
Ort: Berlin
16 Beiträge
 
Delphi 5 Enterprise
 
#1

Caeser Verschlüsselung

  Alt 26. Mär 2019, 15:26
Hallo, ich bin's mal wieder.

Ich muss ein Programm schreiben welches die Zeichen eines Strings um 'key' Stellen verschiebt. Also wenn der 'key' ein B ist wird aus einem A ein B. Soweit klappt das auch, also für einzelne Zeichen. Da kommt auch mein Problem. Ich verstehe nicht ganz, wie das Ganze für einen kompletten String gehen soll bzw. wie ich die nun umgewandelten Zeichen zu einem String zusammen schließe.

Mein Code sieht im MOment so aus:

Code:
//-------- GetText (public) --------------------------------------------
function TCaeser.GetText : string;
var
i : integer;
begin
  for i:=1 to length(text) do begin
  //##############################
  text:= chr(ord(text[i]) + key);
  end;
  result:=text;
end;
LG Maurice
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.116 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Caeser Verschlüsselung

  Alt 26. Mär 2019, 15:28
Hallo,
und wo ist da jetzt Dein Problem?
Außer dem fehlenden [i].

text[i]:= chr(ord(text[i]) + key);

Und natürlich der Tatsache, dass nach der "Verschlüsselung" der Originaltext text auch weg ist.
Besser wäre eine lokale String-Variable.
Heiko

Geändert von hoika (26. Mär 2019 um 15:44 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.034 Beiträge
 
Delphi 7 Professional
 
#3

AW: Caeser Verschlüsselung

  Alt 26. Mär 2019, 15:36
Delphi-Quellcode:
function TCaeser.GetText : string;
var
i : integer;
begin
  for i := 1 to length(text) do begin
    // Diese Zuweisung ist falsch. Text wir damit durch das erste veränderte Zeichen überschrieben.
    text := chr(ord(text[i]) + key);
  end;
  result := text;
end;
Delphi-Quellcode:
function TCaeser.GetText : string;
var
i : integer;
begin
  for i := 1 to length(text) do begin
    // eventuell so
    text[i] := chr(ord(text[i]) + key);
  end;
  result := text;
end;
Delphi-Quellcode:
function TCaeser.GetText : string;
var
i : integer;
begin
  Result := '';
  for i := 1 to length(text) do begin
    Result := Result + chr(ord(text[i]) + key);
  end;
end;
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
1.948 Beiträge
 
#4

AW: Caeser Verschlüsselung

  Alt 26. Mär 2019, 15:42
OffTopic
Zitat:
Ich muss ein Programm schreiben welches die Zeichen eines Strings um 'key' Stellen verschiebt.
Psychologisch gesehen, gehst du falsch an die Sache ran.

Sage dir selber, dass du ein solches Programm schreiben darfst und nicht musst. Dann geht vieles leichter.
  Mit Zitat antworten Zitat
SirMaurice

Registriert seit: 7. Dez 2018
Ort: Berlin
16 Beiträge
 
Delphi 5 Enterprise
 
#5

AW: Caeser Verschlüsselung

  Alt 26. Mär 2019, 16:30
Zitat:
Hallo,
und wo ist da jetzt Dein Problem?
Das [i] hatte ich vergessen, danke dafür schonmal.
Das Problem ist, dass wenn ich einen "Key:= ord(Z) - 65" habe, also die Verschiebung 25 Stellen beträgt und dies mit der Lösung aus der anderen Antwort berechne ein Zeichen "[" rauskommt, es sollte jedoch ein "B" sein.
Ich müsste also jedes mal ein neues Alphabet hinten dranhängen, wenn "ord(text[i]) + key" größer als "ord([)" , also 91, wird.

Das könnte man theoretisch mit einer if-Anweisung umsetzen, ich weiß nun nur nicht, wie ich das zu einer vernünftigen Lösung mit der Form "Result:=" verarbeite.
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
1.948 Beiträge
 
#6

AW: Caeser Verschlüsselung

  Alt 26. Mär 2019, 16:36
[QUOTE=SirMaurice;1428802]
Zitat:
Das Problem ist, dass wenn ich einen "Key:= ord(Z) - 65" habe, also die Verschiebung 25 Stellen beträgt und dies mit der Lösung aus der anderen Antwort berechne ein Zeichen "[" rauskommt, es sollte jedoch ein "B" sein.
Wenn ich zum Testen Caption := Chr(Ord('Z') - 25) ausführen lasse, erhalte ich ein A. Weder ein B noch ein [.
Der Fehler liegt also woanders. Und außerdem. Warum -65? Um von ASCII Z (90) auf Ascii A zu kommen, rechnet man -25.
  Mit Zitat antworten Zitat
SirMaurice

Registriert seit: 7. Dez 2018
Ort: Berlin
16 Beiträge
 
Delphi 5 Enterprise
 
#7

AW: Caeser Verschlüsselung

  Alt 26. Mär 2019, 17:07
Ich möchte ja nicht Z - 25 rechnen sondern der Key ist Z, also 25 Stellen Verschiebung. Zudem wird der Key ja hinzuaddiert und nicht subtrahiert.
Das Problem ist jetzt aber wenn der Key 25 beträgt und man z.B. ein B verschlüsseln möchte, rechnet man den ASCII-Wert von B, also 66, plus den Key, also 25,
dies ergibt dann 91 und somit ein "[".
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.034 Beiträge
 
Delphi 7 Professional
 
#8

AW: Caeser Verschlüsselung

  Alt 26. Mär 2019, 17:09
Wenn bei Key = B aus dem A ein B werden soll, so ist die Differenz = 1.

Ord('A') = 65
Ord('B') = 66

Ord('B') - Ord('A') = 1

Du musst also die Differenz zwischen Ord(Key) und Ord('A') berechnen und zu Ord(text[i]) addieren, also nicht Ord(text[i]) + Key sondern Ord(text[i]) + Ord(key) - Ord('A').

Und natürlich wird Z + Ord(Key) immer ein Zeichen "hinter" den Großbuchstaben ergeben.

Wenn also aus Z + Key -> A werden soll, also ein Buchstabe, dessen Ord < Ord('Z') ist, dann musst Du Dir überlegen, welchen Wert Du dann abziehen musst, um von Ord('Z') -> 90 plus Ord(Key) auf Ord('A') -> 65 zu kommen.
Delphi-Quellcode:
function TCaeser.GetText : string;
var
  i : integer;
begin
  Result := text;
  for i := 1 to Length(Result) do begin
    Result[i] := Chr(Ord(Result[i]) + (Ord(Key) - Ord('A')));
    if Ord(Result[i]) > Ord('Z') then Result[i] := Chr(Ord(Result[i] - (Ord('Z') - Ord('A')));
  end;
end;
PS: Das ist jetzt nur hingedaddelt, keine Ahnung ob's auch korrekt ist.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.116 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Caeser Verschlüsselung

  Alt 26. Mär 2019, 17:13
Hallo,
du musst da schon noch ein if reinpacken,
sowas wie

Delphi-Quellcode:
var
  j: Integer, // oh Gott, i und j ;)


  j:= Ord(text[i]);
  if j<=was_weis_ich then
  begin
    j:= was_weiss_ich_2;
  end;
  j:= j-25;
Damit bekommst Du dein "Ring-Alphabet".

Geh doch das einmal auf einem Blatt Papier durch.
'A'->'Z', Ord('A)=, Ord('Z')

Schreib alles auf und dann weiter mit dem if.
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

AW: Caeser Verschlüsselung

  Alt 26. Mär 2019, 17:28
Kurz, dein Problem ist der Übertrag. Überlege dir wie du feststellst, wann es zu einem und was du dann machen musst.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 13:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf