Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Skytale


Mathematiker - Mi 28.11.12 09:19
Titel: Skytale
Hallo,
nach der Narses' Veröffentlichung der Adents-Spiel-Ankündigung musste ich natürlich versuchen, den Text zu knacken.
Dass es vielleicht die Skytale-Verschlüsselung ist, ergab sich aus dem Adventsspiel 2011, an dem ich ja noch nicht mitgemacht habe. Erst am 24.Dezember habe ich den 1.Jahrestag der aktiven Teilnahme in der EE. Dann darf ich aus der Krabbelgruppe raus. :lol:

Also musste eine Entschlüsselungs-Routine her. Mein Problem war, dass ich stundenlang über die Nichtbuchstaben und Nichtziffern stolperte. Sie wollten einfach nicht in die Verschlüsselung hineinpassen. Außerdem hatte ich einen Denkfehler bei der Zerlegung des Geheimtextes in einzelne Strings.
Im Endergebnis filtere ich nun alle Buchstaben und Ziffern aus, wende auf diese Skytale an und transformiere zurück.

Gibt man "Skytale" in der Suche ein, kommt außer dem Adventsspiel 2011 nichts. Daraus schlussfolgere ich, dass jeder seine eigene, "geheime" Variante nutzt.
Mich würde nun interessieren, ob es ein wesentlich anderes und effizienteres Verfahren, als meins, gibt.
Sollte ich mit dieser Veröffentlichung gegen das ungeschriebene Gesetz, nichts über Skytale zu veröffentlichen, dann einfach löschen.

Im Anhang befindet sich meine Lösung. Diese Lösung ver- und entschlüsselt, auch mit einem anderen Skytaledurchmesser größer 3. Bei meiner Lösung müssen Geheim- und Klartest mit Kopieren/Einfügen in die Textfelder kopiert werden.

Beste Grüße
Mathematiker


Tilman - Do 29.11.12 00:45

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
Gibt man "Skytale" in der Suche ein, kommt außer dem Adventsspiel 2011 nichts.

Psst: http://de.wikipedia.org/wiki/Skytale ;)

Ich hatte die Ankündigung zu spät gelesen, und wurde ausserdem durch den Titel verwirrt. (Römische Zahl, haha mal was neues^^). Aber dass der erste Absatz wohl identisch zu 2011 ist, das war mir klar, hab es trotzdem nicht mehr geschafft es zu knacken :(


Mathematiker - Do 29.11.12 00:52

Hallo Tilman,
user profile iconTilman hat folgendes geschrieben Zum zitierten Posting springen:
Psst: http://de.wikipedia.org/wiki/Skytale ;)

natürlich hast Du Recht. Im ganzen Netz findet man zu diesem Thema massenhaft.
Ich habe mich wahrscheinlich nicht richtig ausgedrückt. Mit der "Suche" meinte ich auch die der Entwickler-Ecke. Und da war ich schon überrascht, dass niemand bisher etwas veröffentlicht hatte.

Beste Grüße
Mathematiker


Tilman - Do 29.11.12 01:13

Du hättest den 2011er Thread mal genau lesen sollen ^^ wie im 2012er richtigerweise gesagt wurde, kannst du dazu sogar dein Programm verwenden, musst nur eben auf Kodieren, statt Dekodieren klicken :)
http://www.entwickler-ecke.de/viewtopic.php?p=654641#654641

P.S. zur Effizienz kann ich nix sagen, die war mir egal, aber wenn du an anderen Lösungen interessiert bist, hier meine von 2011

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:
const
  zeichen = 'abcdefghijklmnopqrstuvwxyz'+
            'ABCDEFGHIJKLMNOPQRSTUVWXYZ'+
            '0123456789öäüÖÄÜß';

procedure TForm1.Button1Click(Sender: TObject);
  var
    kt1,kt2,kt3,gesamt: String;
    n,p,q: Integer;
    modulo: Integer;
begin
  memo2.Text := '';
  kt1 := '';
  kt2 := '';
  kt3 := '';

  p := 0;
  for n := 1 to length(memo1.text) do
    begin
      if pos(memo1.Text[n],zeichen) > 0 then
        begin
          inc(p);
          modulo := (p mod 3);
          case modulo of
            0: kt3 := kt3 + memo1.Text[n];
            1: kt1 := kt1 + memo1.Text[n];
            2: kt2 := kt2 + memo1.Text[n];
          end// case
        end// if pos
    end// for n

    gesamt := kt1+kt2+kt3;
    q := 0;
    for n := 1 to length(memo1.text) do
      begin
        if pos(memo1.Text[n],zeichen) = 0 then
          begin
            memo2.text := memo2.text + memo1.Text[n];
          end else // pos
          begin
            inc(q);
            memo2.Text := memo2.Text + gesamt[q];
          end;  // else pos
      end;
end;