| 
| Autor | Beitrag |  
| Gausi 
          Beiträge: 8550
 Erhaltene Danke: 478
 
 Windows 7, Windows 10
 D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
 
 | 
Verfasst: Di 23.12.08 11:57 
 
Weil morgen schon Heiligabend ist, und das Gewinnspiel dann endet, kommt hier der Tipp für das letzte Rätsel:
 Wem das hier zu schwer ist, dem sei gesagt: Lass einfach mal das Paranüsse knacken sein und fahr nach Paris auf eine Party. Das liegt ja nichtmal ein Parsec von hier entfernt. Unterhalte dich dort im Parlament mit ein paar paranoiden Parapsychologen über Parabeln in Parallelogrammen und Parfümherstellung im Paradies. Und wer jetzt denkt "Hier sind doch ein paar Par's zu viel...", der hat ganz recht.
 Also: Viel Spaß beim Knobeln, und dabei die Weihnachtseinkäufe nicht vergessen!  _________________ We are, we were and will not be.
 |  |  |  
| Narses 
          
  Beiträge: 10183
 Erhaltene Danke: 1256
 
 W10ent
 TP3 .. D7pro .. D10.2CE
 
 | 
Verfasst: Mi 24.12.08 13:46 
 
Weil heute Weihnachten ist - und nur deswegen - gibt es eine kleine Winkrunde mit dem Gartenzaun: Im ersten Tipp waren ein paar Par's zuviel. Das haben ja alle verstanden (oder auch nicht  ). Im Rätsel selbst ist aber auch eins zuviel drin  Lässt man das weg, kommt man der Lösung schon sehr nahe... 
 mx    Narses_________________ There are 10 types of people - those who understand binary and those who don´t.
 |  |  |  
| Narses 
          
  Beiträge: 10183
 Erhaltene Danke: 1256
 
 W10ent
 TP3 .. D7pro .. D10.2CE
 
 | 
Verfasst: Do 25.12.08 00:30 
 
Und hier die Auflösung für das letzte Rätsel, wieder zuerst die Tipps: Ein "Par" zu viel  Par-affine Verschlüsselung  Affine Chiffre 
Nun, der Tipp sollte sich dann von selbst erklären... 
 Die Buchstaben auf den Kerzen sind mit dem Paar (7,15) affin chiffriert und ergeben mit dem zugehörigen Paar (15,15) dechiffriert wieder:
 	  | Auf den Kerzen steht im Klartext: |  	  | Ruprecht ist doof | 
 Damit ist Antwort 1 die korrekte Lösung.    mx    Narses_________________ There are 10 types of people - those who understand binary and those who don´t.
 |  |  |  
| GTA-Place 
          
  Beiträge: 5248
 Erhaltene Danke: 2
 
 WIN XP, IE 7, FF 2.0
 Delphi 7, Lazarus
 
 | 
Verfasst: Do 25.12.08 00:35 
 
Alles kein Problem. Rezept für ein gelugenes Rätsel 4:
Benötigt: - Tipp 1
 - Titel
 - Wikipedia
 - Geistesblitz (Marke Martok)
 - Delphi
 - BruteForce
Durchführung: Man lese Tipp 1 ungefähr 483.482 Mal durch und verstehe nur Bahnhof. Dazu gibt man einen Geistesblitz von Martok. Hat man nun stundenlang die Wikipedia durchgelesen um herauszufinden, was Araffine Abbildungen sind, prüfe man weitere Möglichkeiten. Zum Schluss noch ein Schuss Delphi und BruteForce dazu. Fertig ist der Affine-Chifre-Knacker à la Carte.
Geschmack:  *****
Anforderung:  ******
Tipp:  *****
Lösungsprogramm: Siehe unten, es gab kein Lösungsprogramm  _________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
 
 Zuletzt bearbeitet von GTA-Place am Do 25.12.08 01:04, insgesamt 1-mal bearbeitet
 |  |  |  
| BenBE 
          Beiträge: 8721
 Erhaltene Danke: 191
 
 Win95, Win98SE, Win2K, WinXP
 D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
 
 | 
Verfasst: Do 25.12.08 00:48 
 
Fand Rätsel 4 auch mehr als gelungen. Hat auf jeden Fall Spaß gemacht ...
Benötigt: - Tipp 1
 - Titel
 - Wikipedia
 - Geistesblitz (Marke Martok)
 - PHP
 - BruteForce
Durchführung: Man lese Tipp 1 ungefähr 4.711 Mal durch und verstehe nur Bahnhof. Dazu gibt man einen Freundlichen Hinweis von GTA. Hat man nun kurz die Wikipedia überflogen, implementiere man eine Quick&Dirty-Lösung in PHP für einen Bruteforce-Ansatz über eine Known-Plaintext-Attacke und einer Invertierungstabelle. Fertig ist der Affine-Chifre-Knacker à la Carte.
Geschmack:  *****
Anforderung:  ******
Tipp:  *****
Lösungsprogramm: 		                       C#-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:
 
 | <?php
 $s = ""; $a = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
 $l = strlen($a);
 
 $t = array();
 for($x = 0; $x < strlen($s); $x++) {
 $t[] = strpos($a, $s[$x]);
 }
 
 $b = array(1, 3, 5, 7, 9, 11, 15, 17, 19, 21, 23, 25);
 
 foreach($b as $j) {
 for($i = 0; $i < $l; $i++) {
 echo "<br/>\n";
 echo "A = $j, B = $i: ";
 for($x = 0; $x < $l; $x ++) {
 $invtab[($j * $x + $i) % $l] = $x;                     }
 for($x = 0; $x < strlen($s); $x++) {
 echo $a[$invtab[$t[$x]]];
 }
 }
 }
 
 ?>
 | _________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
 |  |  |  
| Martok 
          Beiträge: 3661
 Erhaltene Danke: 604
 
 Win 8.1, Win 10 x64
 Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
 
 | 
Verfasst: Do 25.12.08 00:59 
 
Jup, war auf jeden fall geil   Benötigt: - Tipp 1
 - Titel
 - Wikipedia
 - Geistesblitz (Marke Eigenbau)
 - Delphi
 - BruteForce, wurde mir aber abgenommen weil jemand schneller war   Durchführung: Man lese die Frage und verstehe nur Bahnhof. Dann lasse man das etwas ziehen und warte auf Tipp Nummer 1. Streichen von par führt über Wikipedia zum Ergebnis. Implementieren einer sauberen Lösung und basteln an einer Lösung für das Negativ-mod-Problem und mitten drin Nachricht von GTA-Place kriegen weil er schon fertig ist. Damit fällt das Bruteforcen weg, fertig ist der Affine-Chifre-Knacker à la Carte.
Geschmack:  *****
Anforderung:  ******
Tipp:  *****
Lösungsprogramm: 		                       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:
 
 | function index2chr(idx: Smallint): char;begin
 Result:= chr(ord('A') + idx);
 end;
 
 function chr2idx(cc: char): Smallint;
 begin
 Result:= ord(cc) - ord('A');
 end;
 
 function mod26(x: smallint): smallint;
 begin
 if X >= 0 then
 Result:= x mod 26
 else
 Result:= x mod 26 + 26;
 end;
 
 function Decode(s: string; a_index, b: smallint): string;
 var
 p: integer;
 begin
 Result:= s;
 for p:= 1 to length(s) do
 if s[p] in ['A'..'Z'] then
 Result[p]:= index2chr(mod26(crypt[a_index][1] * (chr2idx(s[p]) - b)));
 end;
 | _________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
 |  |  |  
| GTA-Place 
          
  Beiträge: 5248
 Erhaltene Danke: 2
 
 WIN XP, IE 7, FF 2.0
 Delphi 7, Lazarus
 
 | 
Verfasst: Do 25.12.08 01:02 
 
Achja, ich hab mein "Lösungsprogramm" vergessen:
 -> Google -> www.math.temple.edu/...yptology/affine.html -> Schlüssel solange durchprobieren, bis was sinnvolles rauskommt (BruteForce   )_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
 |  |  |  
| Wolle92 
          Beiträge: 1296
 
 Windows Vista Home Premium
 Delphi 7 PE, Delphi 7 Portable, bald C++ & DirectX
 
 | 
Verfasst: Do 25.12.08 01:21 
 
Tja, melde mich mal mit einer Nicht-Lösung:
Also, dank Yogu bin ich darauf gekommen, dass in Narses Tipp ein Hinweis drinsteht:
 Normalerweise schreibt Narses "cu" unter seine Posts, diesmal hat er mx geschrieben...
 
 Also konnte man denken:
 c -> m => 2 -> 12
 u -> x => 20 -> 23
 
 Dann hat man ja die tolle Rechnung in der Chiffre:
 (a * x + b) mod 26...
 Okay, dann hab ich mir also nen Array mit den Werten für a gemacht und zwei for-Schleifen ineinander gepackt und a, b und die beiden für 2 und 20 errechneten Werte ausgegeben, dann nach dem Wertepaar 12, 23 gesucht...
 Problem war nur: Es gab kein Wertepaar 12, 23...
 Und dann war Bescherung, Essen, Lego-Käfer bauen (noch nicht fertig), Gottesdienst und dann wars halb 1 und dann war vorbei...
 _________________ 1405006117752879898543142606244511569936384000000000.
 |  |  |  
| Marc. 
          Beiträge: 1876
 Erhaltene Danke: 129
 
 Win 8.1, Xubuntu 15.10
 
 
 | 
Verfasst: Do 25.12.08 01:22 
 
Benötigt:
- Tipp 1
 - Titel
 - Wikipedia
 - Geistesblitz (BenBe "Les den Tipp nochmal genau durch...")
 - Delphi
 - BruteForce
Durchführung: Man lese Tipp1 mehrmals und gibt Gausi bei jedem Durchlesen recht, dass hier doch ein paar Par's zu viel sind...
 Diese Aussage nimmt man jedoch zunächst als Fakt hin, bevor einem der eigentliche Sinn dieses Satzes plötzlich erschließt.
 Die Umsetzung lief daraufhin beinahe reibungslos.
Geschmack:  ******
Anforderung:  ****
Tipp:  *******
Lösungsprogramm: 												| 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:
 
 | function Crypt(s: string; a, b: Integer): string;var
 i: integer;
 a1: integer;
 begin
 SetLength(Result, length(s));
 for i := 1 to length(result) do
 begin
 result[i] := Chr(((Ord(s[i]) - 65) * a + b) mod 26 + 65);
 end;
 end;
 
 function DeCrypt(s: string; a, b: Integer): string;
 const
 ar1: array[1..12] of Integer = (1, 9, 21, 15, 3, 19, 7, 23, 11, 5, 17, 25);
 ar: array[1..12] of Integer = (1, 3, 5, 7, 9, 11, 15, 17, 19, 21, 23, 25);
 var
 i, j: integer;
 a1: integer;
 begin
 for j := 1 to 12 do
 if (ar[j] = a) then
 begin
 a1 := ar1[j];
 break;
 end;
 
 SetLength(Result, length(s));
 for i := 1 to length(result) do
 begin
 result[i] := Chr((Ord(s[i]) - 65 - b + 26) * a1 mod 26 + 65);
 end;
 end;
 |  |  |  |  
| Jann1k 
          Beiträge: 866
 Erhaltene Danke: 43
 
 Win 7
 TurboDelphi, Visual Studio 2010
 
 | 
Verfasst: Do 25.12.08 01:27 
 
Bin ich eigentlich der einzige Idiot, der ne halbe Stunde lang überlegt hat was es denn bringen soll das "par" von "paar Buchstaben-Kerzen" wegzustreichen? Egal, großes Lob an das Team die Rätsel versüssen einem die Adventszeit immer wieder aufs neue. |  |  |  
| Nersgatt 
          Beiträge: 1581
 Erhaltene Danke: 279
 
 
 Delphi 10 Seattle Prof.
 
 | 
Verfasst: Do 25.12.08 09:56 
 
Diese Mod mit negativen Zahlen hat mich wahnsinnig gemacht. Dass das ein Problem ist, habe ich bisher nicht gewusst. 
 Wikipedia-Beispiel durchgespielt -> Zu dem Schluss gekommen, dass die da falsch gerechnet haben. 
 Noch eine andere Erklärung zu der Verschlüsselung gesucht -> Die rechnen ja auch falsch.... oder??
 Irgendwann habe ich es dann doch zusammen bekommen und bin mit Brute Force auf die richtige Lösung gekommen. Es sind ja nur 119 Schlüssel möglich. Man hätte aber auch auf die Idee kommen können, dass der selbe Schlüssel wie in dem Wiki-Beispiel verwendet wurde. (Bei Miau war die Programmstruktur mit der vom Wiki-Beispiel ja auch sehr ähnlich).
 Das ganze Zusammen ergibt folgenden grauenhaften Code (aber funktioniert):
 		                       Delphi-Quelltext 
 									| 1:2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 
 | type TSchluessel = Recorda : Integer;
 b : Integer;
 End;
 
 const ar  : Array [0..11] of Integer = (1, 3,  5,  7, 9, 11, 15, 17, 19, 21, 23, 25);
 const ar1 : Array [0..11] of Integer = (1, 9,  21,  15,  3, 19,  7, 23, 11,  5, 17, 25);
 [...]
 private
 arSchluessel : Array of TSchluessel;
 |  Alle möglichen Schlüsselpaare berechnen:
 												| 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:
 
 | Procedure TForm1.FillSchluessel;var a, i, b, k : Integer;
 bGGT : Boolean;
 begin
 SetLength(arSchluessel, 0);
 
 for i := low(ar) to high(ar) do
 begin
 a := ar[i];
 
 for b := a + 1 to 25 do
 begin
 
 bGGT := False;
 for k := 2 to a do
 begin
 if (a mod k = 0) and (b mod k = 0) then
 begin
 bGGT := True;
 break;
 end;
 end;
 
 if not bGGT then
 begin
 setLength(arSchluessel, high(arSchluessel) + 2);
 arSchluessel[high(arSchluessel)].a := a;
 arSchluessel[high(arSchluessel)].b := b;
 end;
 
 end;
 end;
 
 end;
 |  Mod-Krücke
 		                       Delphi-Quelltext 
 									| 1:2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 
 | Function TForm1.Rest (wert : Integer) : Integer;begin
 if wert >= 0 then
 result := wert mod 26
 else
 begin
 result := wert;
 while result < 0 do
 result := result + 26;
 end;
 end;
 |  Entschlüsselung:
 		                       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:
 
 | function TForm1.Decrypt(s: TSchluessel; sText: String): String;var a1, i, y: Integer;
 begin
 
 result := '';
 
 a1 := 0;
 i := 0;
 while (a1 = 0) and (i <= high(ar)) do
 begin
 if ar[i] = s.a then
 a1 := ar1[i];
 inc(i);
 end;
 
 
 for i := 1 to length(sText) do
 begin
 y := ord(sText[i]) - 65;
 result := result + Chr(rest(a1 * (y - s.b)) + 65);
 end;
 
 end;
 |  Mit Brute Force alles durchprobieren:
 		                       Delphi-Quelltext 
 									| 1:2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 14:
 15:
 
 | procedure TForm1.Button1Click(Sender: TObject);var i : Integer;
 begin
 mem.Lines.Clear;
 FillSchluessel;
 for i := 0 to high(arSchluessel) do
 begin
 mem.lines.Add(intToStr(arSchluessel[i].a) + ';' + intToStr(arSchluessel[i].b) + '   ' + Decrypt(arSchluessel[i], eText.Text));
 end;
 
 mem.Lines.Add(intToStr(mem.Lines.Count));
 
 
 end;
 |  Ich wäre dankbar, wenn mir jemand noch etwas Hintergrundinfo zu diesem Mod-Problem mit negativen Zahlen geben könnte? Ist die Mod-Funktion bei Delphi einfach nur anders definiert?
 Danke,
 Jens_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi) |  |  |  
| Arne K. 
          
  Beiträge: 112
 
 
 C# (VS 2008 Professional)
 
 | 
Verfasst: Do 25.12.08 12:57 
 
Hallo,
 ich habe mich mit PHP dran versucht und bin auch beim mod (allerdings nur bei der Dechiffrierung?) kleben geblieben. Ich habe 15 Minuten hin und her überlegt, weil mir mein Computer (calc.exe und php.exe) ebenso wie mein Taschenrechner für 60/26=2R8<=>60mod26=8 ergeben hat und nicht 3R18. Die Funktion hat sich hier ja quasi der 60 "von oben" (bzw. im Negativen "von unten") genähert? Ich habe mir dann einfach eine eigene Mod-Funktion geschrieben, die genau das gemacht hat und weiter ging's, aber der mathematische Zusammenhang ist mir da bisher auch unklar.
 
 Ergo: Ich würde mich über eine kurze Erklärung auch freuen =)
 
 Beste Grüße,
 Arne
 |  |  |  
| jakobwenzel 
          Beiträge: 1889
 Erhaltene Danke: 1
 
 XP home, ubuntu
 BDS 2006 Prof
 
 | 
Verfasst: Do 25.12.08 13:05 
 
Delphi scheint bei mod  mit negativen Zahlen einfach mit dem Betrag zu rechnen.
 Hier muss mans aber anders angehen, wie es auch schon im Wiki-Artikel zur Affinen Chiffre steht:
 	  | de.wikipedia.org/wik...Entschl.C3.BCsselung (letzter Satz des Abschnitts): |  	  | Anstatt durch 26 zu teilen kann man bei negativen Zahlen auch sooft 26 addieren, bis man eine positive Zahl erhält. Diese Zahl ist mit dem Rest der Division identisch. 
 | 
_________________ I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
 |  |  |  
| Arne K. 
          
  Beiträge: 112
 
 
 C# (VS 2008 Professional)
 
 | 
Verfasst: Do 25.12.08 13:09 
 
Ach, interessant!
 Den Teil hatte ich gar nicht gelesen. Ich habe mich wie gesagt quasi "von oben" genähert:
 		                       Quelltext 
 									| 1:2:
 3:
 
 | 60%26 ?= 1826*3 = 78 = 60+18
 => 60%26 = 18
 |  So habe ich es auch implementiert und es hat wunderbar funktioniert, obwohl es ja im Wesentlichen dasselbe ist.
 (warum das mathematisch so sein soll, frage ich mich aber immernoch. Für mich ist (-60)%26 per Definition eigentlich 8 )
 Edit:
 Ah ja, wer sich noch dafür interessiert, siehe hier:
de.wikipedia.org/wik..._der_Modulo-Funktion |  |  |  
| Boldar 
          Beiträge: 1555
 Erhaltene Danke: 70
 
 Win7 Enterprise 64bit, Win XP SP2
 Turbo Delphi
 
 | 
Verfasst: Do 25.12.08 14:33 
 
mmmh ich hab Benbe's Geistesblitz verpasst... |  |  |  
| Xentar 
          Beiträge: 2077
 Erhaltene Danke: 2
 
 Win XP
 Delphi 5 Ent., Delphi 2007 Prof
 
 | 
Verfasst: Do 25.12.08 15:56 
 
Ahh, verdammt..
 hab zwar das richtige Lösungswort raus, aber dieses dann falsch gedeutet     War irgendwie der Meinung, dass "Die Kerzen ergeben eine verschlüsselte, abfällige Bemerkung über Engelchen." besser passt, auch wenn Ruprecht ja eigentlich kein Engel ist (könnt ja ein anderer so heißen).    Nagut, trotzdem schönes Rätsel. 
 Hatte zeurst an Caesar Verschlüsselung gedacht, aber da kam nichts sinnvolles raus._________________ PROGRAMMER: A device for converting coffee into software.
 |  |  |  
| Xong 
          Beiträge: 113
 
 WIN 2000
 Borland Developer Studio 2006
 
 | 
Verfasst: Do 25.12.08 20:56 
 
	  |  Arne K. hat folgendes geschrieben  : |  	  | ich habe mich mit PHP dran versucht und bin auch beim mod (allerdings nur bei der Dechiffrierung?) kleben geblieben. | 
 Es reicht eine hinreichende große Zahl, die durch 26 geteilt, den Rest 0 ergibt, hinzuzuaddieren. So umgeht man die fehlerhafte Implementation des Modulo-Operators in den Programmiersprachen.
 Ich habe einfach 2600 dazuaddiert.
 Um Modulo zu verstehen, muss man sich mit Restklassen und Zahlenkörpern auseinandersetzen. Hat man eigentlich bei jedem Informatikstudium...    LG,
 Xong |  |  |  
| elundril 
          Beiträge: 3747
 Erhaltene Danke: 123
 
 Windows Vista, Ubuntu
 Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
 
 | 
Verfasst: Fr 26.12.08 03:15 
 
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
 |  |  |  
| Narses 
          
  Beiträge: 10183
 Erhaltene Danke: 1256
 
 W10ent
 TP3 .. D7pro .. D10.2CE
 
 | 
Verfasst: Fr 26.12.08 14:16 
 
Moin!
 	  |  Wolle92 hat folgendes geschrieben  : |  	  | Also, dank Yogu bin ich darauf gekommen, dass in Narses Tipp ein Hinweis drinsteht: Normalerweise schreibt Narses "cu" unter seine Posts, diesmal hat er mx geschrieben...
 | 
   Wollte nur nett sein und mal "Merry Christmas" wünschen...    (also wieder verwirrungsfreies) cu    Narses_________________ There are 10 types of people - those who understand binary and those who don´t.
 |  |  |  
| jaenicke 
          Beiträge: 19326
 Erhaltene Danke: 1749
 
 W11 x64 (Chrome, Edge)
 Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
 
 | 
Verfasst: Fr 26.12.08 14:25 
 |  |  |  |