Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Hilfe:Caesar-Verfahren (https://www.delphipraxis.net/37789-hilfe-caesar-verfahren.html)

HelmHut 10. Jan 2005 16:53


Hilfe:Caesar-Verfahren
 
Hallo Leute,

ich muss bis Donnerstag, den 13.01.2005, ein Projekt abgeben. Ich soll mit Delphi einen Text im CAESAR-VERFAHREN verschlüsseln. Ich habe auch einen Quelltext gefunden, der aber für meine Verhältnisse zu schwer ist. Ich würde mich über eine Antwort mit einem LEICHTEREN QUELLTEXT freuen oder über eine ERKLÄRUNG MEINES QUELLTEXTES, da ich ihn inner Schule erklären muß. Ich bin sonst aufgeschmissen. BITTE UM HILFE!!!

Das ist mein Quelltext:

Delphi-Quellcode:
IF Memo1.Lines.Count > 0 THEN
begin
FOR ZNr:= 1 TO Memo1.Lines.Count DO
begin
ZOrgText:= Memo1.Lines[ZNr - 1]; // 
IF length(ZOrgText) > 0 THEN
begin
ZVerschlText:= ''; // 
FOR BNr:= 1 TO length(ZOrgText) DO
begin
OrgReih:= Ord(ZOrgText[BNr]); // 
NeuReih:= OrgReih + SpinEdit1.Value; // 
ZVerschlText:= ZVerschlText + Chr(NeuReih); // 
end;
Memo2.Lines.Add(ZVerschlText); // 
end
ELSE
Memo2.Lines.Add('') // 
end
end;
[edit=r_kerber]Doppelpost gelöscht. Delphi-Tags eingefügt (das nächste mal bitte selbst machen)! Mfg, r_kerber[/edit]

Dax 10. Jan 2005 16:54

Re: Hilfe:Caesar-Verfahren
 
Ich denke doch, ein Thread reicht für dein "Problem".. :roll:

HelmHut 10. Jan 2005 17:07

Re: Hilfe:Caesar-Verfahren
 
Hey Dax,
ich bin leider Anfänger, was meinst denn du? Kannste mir das ausführlich aufschreiben?

Nikolas 10. Jan 2005 17:08

Re: Hilfe:Caesar-Verfahren
 
Fertige Projekte oder Quelltexte wird es hier nicht geben.
Dein Quelltext veschlüsselt alle Zeilen in einem Memo. Du solltest dir erstmal eine Funktion schreiben, die dir einen übergebenen String um eine auch übergebene Anzahl von Stellen verschiebt.
Um die Buchstaben in Zahlen zu verwandeln, werden dir die Befehle Delphi-Referenz durchsuchenord chr helfen. Die Verwendung ist recht einfach, du kannst da alles in der OH nachlesen. Wenn du dann den Ascii-Wert eines Buchstaben hast, addierst du dazu deinen Schlüssel und wandelst in per chr wieder in einen Buchstaben um. Dabei musst du natürlich darauf achten, dass, wenn du ein Z mit 2 verschlüsselst, du das Abfangen musst, um nicht aus dem Bereich der Buchstaben herrauszulaufen.

// EIn Tipp: Um aus einem Buchtstaben eine Zahl zwischen 0 und 25 zu machen kannst du diesen Code benutzen;
Delphi-Quellcode:
NR:= ord(Buchstabe)-ord('A');
Dadurch, dass du ord('A') abziehst, bekommt das A die 1 und nicht den normalen Ascii-Wert von 80 oder so.

r_kerber 10. Jan 2005 17:09

Re: Hilfe:Caesar-Verfahren
 
Soll heißen, es genügt, wenn Du Deine Frage einmal stellst! Habe eben drei Deiner weiteren Anfragen gelöscht!

RedDust 10. Jan 2005 17:12

Re: Hilfe:Caesar-Verfahren
 
Delphi-Quellcode:
IF Memo1.Lines.Count > 0 THEN
  begin
    FOR ZNr:= 1 TO Memo1.Lines.Count DO
      begin
        ZOrgText:= Memo1.Lines[ZNr - 1];
//Auslesen des Textes der in der Zeile (ZNr - 1) steht (Im Memo ist die 1. Zeile immer mit der 0 Gek.)
        IF length(ZOrgText) > 0 THEN
          begin
            ZVerschlText:= ''; //Leeren des Strings, da es ja mehrere Durchläufe sind
            FOR BNr:= 1 TO length(ZOrgText) DO
              begin
                OrgReih:= Ord(ZOrgText[BNr]); //Umwandeln von Text in ASCII
                NeuReih:= OrgReih + SpinEdit1.Value; // ???
                ZVerschlText:= ZVerschlText + Chr(NeuReih); //Umwandeln von ASCII IN Text
              end;
            Memo2.Lines.Add(ZVerschlText); //Inzufügen des oben erm. textes
          end
        ELSE
          Memo2.Lines.Add('') //Ist die akt. Zeile leer dann wird aich eine leere hinzugef.
        end;
      end;
Ich hab' mal versucht es einfach auszudrücken.

HelmHut 10. Jan 2005 17:16

Re: Hilfe:Caesar-Verfahren
 
Könntet ihr denn vielleicht die wichtigsten Zeilen in meinem Quelltext erklären, damit ich es dann verstehe?
Und wie komme ich mit dem vorhanden Quelltext nur in den Bereich der Buchstaben? So komme ich nämlich auch in die Sonderzeichen, das wollte ich aber net.

HelmHut 10. Jan 2005 17:19

Re: Hilfe:Caesar-Verfahren
 
was heißen denn speziell die ersten Zeieln, der Anfang wird wohl wichtig sein.

r_kerber 10. Jan 2005 17:21

Re: Hilfe:Caesar-Verfahren
 
Zitat:

Zitat von HelmHut
Könntet ihr denn vielleicht die wichtigsten Zeilen in meinem Quelltext erklären, damit ich es dann verstehe?
Und wie komme ich mit dem vorhanden Quelltext nur in den Bereich der Buchstaben? So komme ich nämlich auch in die Sonderzeichen, das wollte ich aber net.

Wie bitte? Von wem ist denn der Quelltext?
Und pushen nach drei Minuten ist hier nicht gern gesehen (genauswenig wie Mehrfachposting)!

MaBuSE 10. Jan 2005 17:22

Re: Hilfe:Caesar-Verfahren
 
Zitat:

Zitat von HelmHut
ich muss bis Donnerstag, den 13.01.2005, ein Projekt abgeben. Ich soll mit Delphi einen Text im CAESAR-VERFAHREN verschlüsseln. Ich habe auch einen Quelltext gefunden, der aber für meine Verhältnisse zu schwer ist. Ich würde mich über eine Antwort mit einem LEICHTEREN QUELLTEXT freuen oder über eine ERKLÄRUNG MEINES QUELLTEXTES, da ich ihn inner Schule erklären muß. Ich bin sonst aufgeschmissen. BITTE UM HILFE!!!

Hallo,
zuerst mal herzlich willkommen im Delphi Praxis Forum.

Ein paar Punkte dind mit bei Deinem 1. Beitrag aufgefallen:
  1. Du hast in Tutorials und Kurse geposted
    Diese Sparte ist eigentlich dafür da um tutorials zu posten, nicht Fragen.
    Ich vermute das Du das nur nicht gewust hast weil Du neu hier bist.
    (An einen Admin: Kann man diesen Thread bitte verschieben?)
  2. Ich möchte Dich freundlich aber bestimmt auf den Verhaltenskodex hinweisen.
    Abschnit 2.3.2.3 ( http://www.delphipraxis.net/dpX_faq_...?faq=Q_10#Q_10 )

Da Du das bestimmt nicht mit Absicht gemacht hast, gebe ich Dir hier ein paar Tips und Hinweise (keine Lösung)

Was ist die Caesar Verschlüsselung?
Jeder Buchstabe wird um 3 Buchstaben verschoben.
Aus A wird D, aus B wird E, ...
Das könnte man z.B. so lösen:
Delphi-Quellcode:
var
  s: string;
...
begin
  s := 'Das ist ein Test.'
...
  s[2] = Chr( Ord(s[2]) + 3);
...
Mit s[2] greift man auf den 2. Buchstaben von der Zeichenkette s zu. (s[3] ist der 3. Buchstabe usw)

Ord( Buchstabe ) wandelt einen Buchstaben in den Ascii Wert um (Byte von 0 bis 255)
Chr( Ascii Wert ) wandelt einen Ascii Wert in einen Buchstaben um (Char)

Ein erfahrener Delphi Programmierer würde einen Anderen Befehl benutzen:
Delphi-Quellcode:
...
  inc(s[i], 3);
...
Damit wird der Ascii Wert auch um 3 Zeichen verschoben.

Zum Entschlüsseln verwendet man folgendes:
Delphi-Quellcode:
...
  s[2] = Chr( Ord(s[2]) - 3);
  // oder
  dec(s[i], 2);
...
Mit Length(s) bekommt man die Länge des Strings.

Also braucht man nur noch eine Schleife zu bauen vom 1. bis zum letztem Buchstaben und für jeden Buchstaben diese Verschlüsselung anwenden.

Mach Dir auch ein paar Gedanken zu den Buchstaben X, Y und Z.
Diese können nicht durch einfaches Addieren einer 3 verschlüsselt werden, da 'X' + 3 nicht A ergibt, sondern ein Sonderzeichen.

So, nun müsstest Du aber selbst zurecht kommen.

Viel Spaß

HelmHut 10. Jan 2005 17:24

Re: Hilfe:Caesar-Verfahren
 
Hey,
so ist es ja nun auch net, aheb ich mir teilwesie schon selber gedacht, aber cih brauchte halt bestimmt befehle, weil wir uns ds selbst beibringen mussten und uns nicht geholfen wurde. Ich will ja auch net nerven, aber ich bin halt sonst hilflos. Ich weiß einfach net mehr weiter und die Zensur ist mir schon wichtig!

Nikolas 10. Jan 2005 17:33

Re: Hilfe:Caesar-Verfahren
 
Zitat:

aber cih brauchte halt bestimmt befehle
Welche Befehle brauchst du denn genau?

HelmHut 10. Jan 2005 17:38

Danke euch!!!
 
ja es steht schon eigentlich alles im Quelltext drin, nur möchte ich gerne im Alphabet (a-z) bleiben, aber das kriege ich mit meienm Quellcode leider net hin. Das müsste ein einfacher Befehl sein, aber keine Ahnung.
Aber danke schon mal. Ihr habt mir schon jetzt geholfen.
Achso und was heißen diese Befehle:

Memo1.Lines.Count > 0

ZNr:= 1 TO Memo1.Lines.Count DO

Nochmal Danke!!!

fred.reichbier 10. Jan 2005 17:44

Re: Hilfe:Caesar-Verfahren
 
[1] wenn memo1 nicht leer ist...
[2] setze ZNr bei jedem Durchgang eins rauf und höre auf wenn ZNr die Zahl der Zeilen im Memo erreicht hat.

malo 10. Jan 2005 17:58

Re: Danke euch!!!
 
Zitat:

Zitat von HelmHut

ZNr:= 1 TO Memo1.Lines.Count DO

es heißt eigentlich
Delphi-Quellcode:
for ZNr := 1 to Memo1.Lines.Count do
das heißt, der code, der nach do kommt, wird bei jeder Zeile des Memos ausgeführt ;)

HelmHut 10. Jan 2005 18:04

Re: Hilfe:Caesar-Verfahren
 
Das war schon wirklich gut. Ich bin euch sehr dankbar.
Ich kriege es nur leider nicht hin, den Text nur im Alphabet zu verschlüsseln, aslo nicht mit Sonderzeicehn(ASCII). Das mag ich nämlich net. Mir fällt nur leider nichts ein, wie ich das schaffe. Bsp.: Das X soll um 5 Stellen verschlüsselt werden, also:
x -> y -> z -> (und dann soll wieder a kommen)a -> b -> c
Also aus dem x soll ein c werden und KEIN Sonderzeichen.

Ihr seid doch alle Profis. Kann mir jemand das helfen?

MaBuSE 10. Jan 2005 18:12

Re: Hilfe:Caesar-Verfahren
 
Zitat:

Zitat von HelmHut
...
x -> y -> z -> (und dann soll wieder a kommen)a -> b -> c
Also aus dem x soll ein c werden und KEIN Sonderzeichen
...
Kann mir jemand das helfen?

Dann werd ich doch eine Lösung geben ;-)
Delphi-Quellcode:
...
function decode(s: string): string;
var
  i: Integer;
begin
  for i := 1 to Length(s) do
  begin // Für alle Buchstaben
    if UpCase(s[i]) in ['A'..'W'] then
    begin // Wenn Buchstabe zwischen A und W ist
      Inc(s[i],3); // Um 3 Zeichen nach rechts verschieben
    end
    else
    begin
      if UpCase(s[i]) in ['X'..'Z'] then
      begin // Wenn Buchstabe zwischen X, Y oder Z ist
        Dec(s[i],23); // Um 23 Zeichen nach links verschieben
                      // X = A, Y = B, Z = C
      end;
    end;
  end;
  Result := s; // Verschlüsselten Text zurückgeben
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Memo1.Lines.Text := decode(Memo1.Lines.Text);
end;
...

oder :mrgreen:

Delphi-Quellcode:
...
function decodeBuchstabe(c: Char): Char;
begin
  case c of
    'a' : Result := 'd';
    'b' : Result := 'e';
    'c' : Result := 'f';
    'd' : Result := 'g';
    'e' : Result := 'h';
    'f' : Result := 'i';
    'g' : Result := 'j';
    'h' : Result := 'k';
    'i' : Result := 'l';
    'j' : Result := 'm';
    'k' : Result := 'n';
    'l' : Result := 'o';
    'm' : Result := 'p';
    'n' : Result := 'q';
    'o' : Result := 'r';
    'p' : Result := 's';
    'q' : Result := 't';
    'r' : Result := 'u';
    's' : Result := 'v';
    't' : Result := 'w';
    'u' : Result := 'x';
    'v' : Result := 'y';
    'w' : Result := 'z';
    'x' : Result := 'a';
    'y' : Result := 'b';
    'z' : Result := 'c';
    'A' : Result := 'D';
    'B' : Result := 'E';
    'C' : Result := 'F';
    'D' : Result := 'G';
    'E' : Result := 'H';
    'F' : Result := 'I';
    'G' : Result := 'J';
    'H' : Result := 'K';
    'I' : Result := 'L';
    'J' : Result := 'M';
    'K' : Result := 'N';
    'L' : Result := 'O';
    'M' : Result := 'P';
    'N' : Result := 'Q';
    'O' : Result := 'R';
    'P' : Result := 'S';
    'Q' : Result := 'T';
    'R' : Result := 'U';
    'S' : Result := 'V';
    'T' : Result := 'W';
    'U' : Result := 'X';
    'V' : Result := 'Y';
    'W' : Result := 'Z';
    'X' : Result := 'A';
    'Y' : Result := 'B';
    'Z' : Result := 'C';
  else
    Result := c;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  i: Integer;
  s: string;
begin
  s := Memo1.Lines.Text;
  for i := 1 to Length(s) do
  begin
    s[i] := decodeBuchstabe(s[i]);
  end;
  Memo1.Lines.Text := s;
end;
...

HelmHut 11. Jan 2005 14:10

???Verschlüsselung nur im Alphabet???
 
Also ich hatte mal ein bisschen rumprobiert, aber bekomme es net hin, aus dem vorhandenen Quelltext, eine verschlüsselung zu vollführen OHNE Sonderzeichen. Ich möchte also, dass die Verschlüsselung im Alphabet bleibt. Aber ich muss nicht um 3 Buchstaben den Text verschlüsseln sondern um eine Variable, sonst wäre es ja ent so schwer. Aber das überfordert mich.
Bitte nochmals um Hilfe!
Quelltext: siehe erste Eintragung.

Danke euch!!!

MaBuSE 11. Jan 2005 14:27

Re: ???Verschlüsselung nur im Alphabet???
 
Zitat:

Zitat von HelmHut
Also ich hatte mal ein bisschen rumprobiert, aber bekomme es net hin, aus dem vorhandenen Quelltext, eine verschlüsselung zu vollführen OHNE Sonderzeichen. Ich möchte also, dass die Verschlüsselung im Alphabet bleibt. Aber ich muss nicht um 3 Buchstaben den Text verschlüsseln sondern um eine Variable, sonst wäre es ja ent so schwer. Aber das überfordert mich.
Bitte nochmals um Hilfe!
Quelltext: siehe erste Eintragung.

Danke euch!!!

Ich habe die Lösung ja oben schon gepostet. (Fix mit 3)

Statt 3 einfach Anzahl verwenden.
Statt 23 einfach 26 - Anzahl verwenden.
Um den richtigen Buchstaben auszuwählen verwende ich hier ein Array.
(Es geht auch effizienter, aber das Array ist sehr anschaulich).

Ließ Dir meine oberen Postings noch mal durch, dann solltest Du den Quelltext verstehen.

Hier die Lösung:

Delphi-Quellcode:
...
const
  Buchstabe : Array[1..26] of Char =
    ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
     'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z');

function decode(s: string; Anzahl: Integer): string;
var
  i: Integer;
begin
  // Anzahl darf nur zw. 1 und 25 sein !!!

  for i := 1 to Length(s) do
  begin // Für alle Buchstaben
    if UpCase(s[i]) in ['A'..Buchstabe[26 - Anzahl]] then
    begin // wenn es ein Buchstabe ist, der gefahrenlos verschoben werden kann
      Inc(s[i], Anzahl); // Um Anzahl Zeichen nach rechts verschieben
    end
    else
    begin
      if UpCase(s[i]) in [Buchstabe[27 - Anzahl]..'Z'] then
      begin // wenn es ein Buchstabe ist, der ncht so einfach verschoben werden kann
        Dec(s[i],26 - Anzahl); // Um 26 - anzahl Zeichen nach links verschieben
                               // bei Anzahl = 3 zB: X = A, Y = B, Z = C
      end;
    end;
  end;
  Result := s; // Verschlüsselten Text zurückgeben
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Lines.Text := decode(Memo1.Lines.Text, 3);
end;
...

MaBuSE 11. Jan 2005 14:51

Re: ???Verschlüsselung nur im Alphabet???
 
Zitat:

Zitat von HelmHut
Aber ich muss nicht um 3 Buchstaben den Text verschlüsseln sondern um eine Variable, sonst wäre es ja ent so schwer.

Die Lösung habe ich ja schon oben gepostet, aber:
Die klassische Cäsar Verschlüsselung ist mit drei Buchstaben!
Und Du wolltest eine Cäsar Verschlüsselung.

Das steht im WikiPedia
Der Name Cäsarchiffre rührt aus der historischen Verwendung dieses Chiffres durch Julius Cäsar zur verschlüsselten Kommunikation. Cäsar rotierte das Alphabet um 3 Buchstaben.

[equote:739ac0d25c="Das Verfahren wird bei Sueton wie folgt beschrieben (De Vita Caesarum: Divus Julius LVI)"]... si qua occultius perferenda erant, per notas scripsit, id est sic structo litterarum ordine, ut nullum verbum effici posset: quae si qui investigare et persequi velit, quartam elementorum litteram, id est D pro A et perinde reliquas commutet.

... wenn etwas Geheimes zu überbringen war, schrieb er in Zeichen, das heißt, er ordnete die Buchstaben so, dass kein Wort gelesen werden konnte: Um diese zu lesen, vertausche man den vierten Buchstaben, also D, für A und ebenso mit den restlichen.[/equote:739ac0d25c]

generic 12. Jan 2005 07:46

Re: Hilfe:Caesar-Verfahren
 
wie ist es damit?
Delphi-Quellcode:
const rotation: Integer=3;

function decode(s: string):string;
var i: Integer;
begin
  Result:='';
  for i:=1 to Length(s) do
  begin
    if Upcase(s[i]) in ['A'..'Z'] then
      Result:=Result+chr((Ord(Upcase(s[i]))-Ord('A')+rotation) mod 26+Ord('A'))
    else
      Result:=Result+s[i];
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Edit2.Text:=decode(Edit1.Text);
end;

MaBuSE 12. Jan 2005 10:36

Re: Hilfe:Caesar-Verfahren
 
Zitat:

Zitat von generic
wie ist es damit?
Delphi-Quellcode:
...
      Result:=Result+chr((Ord(Upcase(s[i]))-Ord('A')+rotation) mod 26+Ord('A'))
...

Mod 26 ist viel effizienter als ein if.
(An mod hatte ich in dem Moment gar nicht gedacht ;-))

Nikolas 12. Jan 2005 17:05

Re: Hilfe:Caesar-Verfahren
 
@ Mabuse:
Ein mod ist hier aber falsch, da du bei der Mod-Funktion die '0' als Ergebniss erhalten kannst. Wenn du also das Y mit dem A verschlüsselst, und dann Mod 24 anwendest, bekommst du als Ergebniss 0 und nicht 25. Also ist der Ansatz mit if
Delphi-Quellcode:
if Zahl>24 Then Zahl:=Zahl-24;
der richtige, um die Zahlen in der Menge [1..24] einzusperren.

MaBuSE 12. Jan 2005 17:42

Re: Hilfe:Caesar-Verfahren
 
Zitat:

Zitat von Toxman
@ Mabuse:
Ein mod ist hier aber falsch, da du bei der Mod-Funktion die '0' als Ergebniss erhalten kannst. Wenn du also das Y mit dem A verschlüsselst, und dann Mod 24 anwendest, bekommst du als Ergebniss 0 und nicht 25. Also ist der Ansatz mit if
Delphi-Quellcode:
if Zahl>24 Then Zahl:=Zahl-24;
der richtige, um die Zahlen in der Menge [1..24] einzusperren.

???

Warum, MOD ist doch der Rest einer ganzzahligen Division.

Angenommen wir wollen Ziffern verschlüsseln. um 5 Stellen

Code:
0 -> 5 : 0 + 5 = 5 : 5 mod 10 = 5
1 -> 6 : 1 + 5 = 6 : 6 mod 10 = 6
2 -> 7 : 2 + 5 = 7 : 7 mod 10 = 7
3 -> 8 : 3 + 5 = 8 : 8 mod 10 = 8
4 -> 9 : 4 + 5 = 9 : 9 mod 10 = 9
5 -> 0 : 5 + 5 = 10 : 10 mod 10 = 0
6 -> 1 : 6 + 5 = 11 : 11 mod 10 = 1
7 -> 2 : 7 + 5 = 12 : 12 mod 10 = 2
8 -> 3 : 8 + 5 = 13 : 13 mod 10 = 3
9 -> 4 : 9 + 5 = 14 : 14 mod 10 = 4
Passt doch !!!

Delphi-Quellcode:
Result := Result + chr( (Ord( Upcase(s[i]) ) - Ord('A') + rotation) mod 26 + Ord('A') )

Ord( Upcase(s[i]) ) - Ord('A') // => 0 für A, 1 für B, ... und 25 für Z

rotation := 3
(Ord( Upcase(s[i]) ) - Ord('A') + rotation) // => 3 für A, ... und 28 für Z

(Ord( Upcase(s[i]) ) - Ord('A') + rotation) mod 26 // => 3 mod 26 = 3 für A, ... 28 mod 26 = 2 = Z

chr( (Ord( Upcase(s[i]) ) - Ord('A') + rotation) mod 26 + Ord('A') ) // = D für A, E für B, ... und C für Z
Stimmt !!!

[edit]
Zitat:

Zitat von Toxman
Delphi-Quellcode:
if Zahl>24 Then Zahl:=Zahl-24;

Delphi-Quellcode:
if (zahl>24) and (zahl<=48) then zahl := zahl - 24;
ist absolut identisch mit
Delphi-Quellcode:
zahl := zahl mod 24;
ps: warum hat Dein Alphabet nur 24 Buchstaben ?
[/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:44 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