Wer kann das lösen?

Habe mir gestern eine Verbesserung für ein altes Verschlüsselungssytem ausgedacht... Wollte einmal fragen ob es wer schaft es zu lösen ;). Den Lösungsweg erkläre ich wenn es keiner schafft.

Code:
JHXBO OEKKP JRWHI MZAPV IJGYJ DYVHY IHGEK XHIZ

und es ist nicht so schwer wie ihr denkt...

Algorithmus :

Beim Code "015" :

Code:
01501
hallo
 
:::::
vvvvv
 
hbqlp

Code:
01501
hbqlp
 
:::::
vvvvv
 
hallo


Viel Glück,
Acheloos
 
Zuletzt bearbeitet:
Ich helfe gerne (falls notwendig). Wenn ihr Probleme habt schreibt mich einfach an oder schreibt es einfach in dieses Thema.
 
Sinn einer Verschlüsselung, die nur dann sicher ist, wenn keiner das Verfahren kennt? Da nimmt man gleich One-Time-Pad und nicht Enigma(?) Modifikationen ;)

Ansonsten ist das Erfinden von neuen Verschlüsselungen ein "beliebtes" Hobby :rolleyes: und wurde mal hier sehr schön zusammengefasst:
Kurze Chiffretexte knacken - Warum dein Bytestring für den Arsch ist - BuHa-Security Board

Sprich: es wird sich niemand ernsthaft mit einem "Cryptotext" befassen (es sei denn, man gibt es als Rätsel aus ;) ), da eine ernsthafte Analyse viel Zeit in Anspruch nimmt und das Ergebniss zu 99% nicht für die "neue Verschlüsselung" sprechen würde.

Edit: verschoben aus "Cryptography & Encryption"
 
Sorry ich hab den Wald vor lauter Bäumen nicht gesehen. Ich befass mich mal damit, wenn ich Zeit/Langeweile hab
Das Problem ist immernoch, dass wir die Schlüssellänge nicht kennen. Außerdem Ist der Text wahrscheinlich zu kurz für eine Effektive Analyse.
Daher wird vermutlich niemals jemand die Lösung finden.
 
Zuletzt bearbeitet:
Ich habe mir das "Rätsel" mal angeschaut und hoffe gelöst.

Klartext : Herzlichen Glueckwunsch du hast es geschafft
Schlüssel : 2 3 6

Mein Lösungsansatz war ein Brute-Force auf den Schlüssel. Hierfür
habe ich ein kleines Programm geschrieben, welches alle möglichen
Schlüsselkombinationen auf den Chiffre-Text anwendet und in eine
Datei abspeichert. Habe dies für Schlüssellängen von 1 - 5 gemacht,
da keine genaue Angabe über die Länge vorgegeben war (das es letztendlich eine Länge von 3 ist, hätte man sich jedoch aus dem
Beispiel heraus evtl. denken können :)). Danach habe ich mit dem Programm find (MS-DOS lässt grüßen) in diesen Dateien nach Wörtern
gesucht, welche du evtl. für die Lösung verwendet haben köntest.
Eine manuelle Suche hätte ewig gedauert, die Datei für Schlüssel mit
der Länge 5 ist ca. 785 MB groß ! und ein anderes Programm, welches
einen Text in einer Menge von unsinnigen Buchstabenkombinationen findet,
habe ich auf die Schnelle nicht gefunden.
Na ja, bei der Such nach dem Wort "Herzlichen" kam dann o.g. Lösung
zum Vorschein.

Allerdings gibt es 3 Buchstaben in dem Text, die bei o.g. Schlüssel nicht
stimmen, meine Suche ergab nämlich eigentlich folgende Lösung :
Herzlichen Glueckwunsch d(s) hast es ge(a)ch(r)fft
Richtig wäre : (u) (s) (a)

Hast du dich da verschrieben, oder stimmt die Lösung nicht ?

Bitte um Antwort, ob die Lösung richtig ist !
 
Zuletzt bearbeitet:
Ich bin es nochmal :

@Stiepen
der verwendete Algorithmus hier ist eine erweiterte Form der
Caesar-Verschlüsselung (siehe Wiki). Hier wird das Alphabet
einfach nur um einen entsprechenden Wert (den Schlüssel) verschoben.
Wenn der Schlüssel z.B. 3 ist, wird aus dem Buchstaben A ein D usw.
Allerdings gibt es bei dieser "sehr einfachen" Verschlüsselung nur
einen Schlüsselwert, der auf alle Buchstaben des Klartextes angewendet
wird. Acheloos verwendet hier jedoch einen Schlüssel aus mehreren
Schlüsselwerten (hier 3) die nacheinander auf die Buchstaben angewendet
werden (1. Schlüsselwert auf 1.Buchstaben, 2. Schlüsselwert auf 2. Buchstaben und 3. Schlüsselwert auf 3. Buchstaben). Ist der zu verschlüsselnde Text länger als der Schlüssel, wird der Schlüssel einfach
ständig wiederholt. Beispiel :

(Schlüssel 1 2 3)

H A L L O (Klartext)
1 2 3 1 2 (Buchstabe im Alphabet um den Schlüsselwert verschieben !)
I C O M Q (Chiffre)

(Ich hoffe, die Beschreibung ist verständlich und richtig !)
 
Naja, das hatte ich schon verstanden. Aber auf die Idee mit dem BruteForce bin ich nicht gekommen.

Ein Problem bei BruteForce wäre es bei einer größeren schlüssellänge geworden (6+). Hier wäre eine Häufigkeitsanalyse der Buchstaben effizienter gewesen. Dazu hatte jedoch der Text länger sein müssen. Außerdem braucht man dazu die Schlüssellänge (oder vieeel Geduld :P).
Das war das, worauf sich mein letzter Beitrag bezog.
 
Sorry, ich dachte, du hättest den Algorithmus nicht durchschaut :).
Hatte mir schon gedacht, dass die Schlüssellänge 3 ist, da es im Beispiel
auch so ist, habe aber vorsichtshalber bis 5 probiert. Länger wäre ein
Problem gewesen, stimmt !
Ist es eigentlich korrekt, dass es sich um OTP handeln würde, wenn er einen Schlüssel benutzt hätte, der genau so lange ist wie der Klartext ? Habe ich OTP da richtig verstanden ?
 
Sorry, wenns so rüberkam, als hätte ich ihn nicht gelesen...
zu OTP: Ja, wenn Schlüssellänge >= Textlänge ist, handelt es sich um OTP. Normalerweise verwendet man imho jedoch eine XOR-Verknüpfung (zumindest in der modernen Technik). Die Kombination mit Caesar-Verschlusselung ist jedoch bei der Verwendung von Stift und Papier besser.
Das einzige Problem bei OTP ist, dass man nun Schlüssel und verschlüsselten Text dem Empfänger auf unterschiedlichen Wegen zukommen lassen muss. (gehört aber weniger zur Vershlüsselung)
 
Die Lösung war richtig!
Und ich habe diesen Text per Hand "verschlüsselt" also die 3 Buchstaben waren von mir aus schon falsch :-D
Könntest du mir vieleicht das Programm senden mit dem du es entschlüsselt hast?

MfG,
Acheloos
 
Zuletzt bearbeitet:
Kann ich machen, aber ob du damit was anfangen kannst, ist die Frage.

Ist nur ein kleines Komandozeilen-Tool ohne Benutzerinteraktion, deinen
Chiffretext habe ich direkt im Quelltext eingegeben. Werde es mal erweitern, so dass der Benutzer den Chiffretext und die Schlüssellänger vorher eingeben kann. Dann kannst du es haben.

Außerdem gibt es nicht direkt die Lösung aus, sondern erzeugt (wie in der Lösung schon beschrieben) einfach nur eine Datei, in der alle möglichen Kombinationen für diese Schlüssellänge drin stehen. Die Lösung (einen sinnergebenden Satz) musst du dann selbst dort raussuchen. Auch ist es ein 16-Bit-Programm, ich weiss nicht, ob es überall läuft, einfach ausprobieren. Habe es eben nur für diese Aufgabe schnell mal zusammengeschustert !

Werde mal die Benutzerinteraktion hinzufügen und es dann zur Verfügung
stellen, wenn ich die Zeit dazu finde :-) evtl. am Wochenende !
 
Mein Lösung in Perl sah so aus

Code:
sub decrypt($$)
{
    my ($key, @message) = @_;
    my $digits = int(log($key)/log(10)) + 1;

    my $i = 1;
    foreach (@message)
    {
        $i = ($digits + 1) if $i == 1;
        $i--;
        $_ = chr(ord($_) - int($key % (10 ** $i) / 10 ** ($i - 1)));
        $_ = chr(ord('Z') - (abs(ord($_) - ord('A') + 1))) if ($_ lt 'A')
    }

    return @message;
}

my @message = split '', "JHXBOOEKKPJRWHIMZAPVIJGYJDYVHYIHGEKXHIZ";
my @good = qw(HABO HACKER BOARD SUPER HERZLICHEN TOLL LOESUNG ACHELOOS SCHREIBEN TUTORIAL COOL);

foreach (1..9999)
{
    my $secret = join '', &decrypt($_, @message);
    foreach (@good)
    {
        if ($secret =~ m/$_/)
        {
            print "$secret\n";
            last;
        }
    }
}
 
Häufigkeit von 'E' und Entropie als Filter, die Kandidaten werden danach sortiert und das Ergebniss 'manuell' bestimmt. Kommt ohne "Vorkenntnisse" bzw. Wörterbuchabgleich aus ;) (allerdings unbrauchbar für Schlüssellängen >= 5. Andererseits - bei längeren Texten sollten die üblichen Non-BF Methoden gut klappen)
PHP:
#! /usr/bin/env python
# -*- coding: utf-8 -*-

from collections import Counter
from string import uppercase as alphabet
from math import log
from itertools import product

cipher_text = "JHXBOOEKKPJRWHIMZAPVIJGYJDYVHYIHGEKXHIZ"
key_min_len = 1
key_max_len = 4
min_entropy = 3.89
show_lines = 25

def entropy(text):
    """ http://www.bearcave.com/misl/misl_tech/wavelets/compression/shannon.html """
    stats = Counter(text)
    rel_freq = [float(freq) / len(text) for freq in stats.values()]
    return -sum([freq * (log(freq) / log(2)) for freq in rel_freq]), stats.get('E')

def decrypt(text, key):
    result = [alphabet[(alphabet.find(char) - key_val) % len(alphabet)]
            for char,key_val in zip(text, key * (len(text)/len(key) + 1))]
    return entropy(result), "".join(result)

def dec_loop():
    result = []
    for key_len in xrange(key_min_len, key_max_len + 1):
        for key in product(xrange(10), repeat = key_len):
            (entropy, e), text = decrypt(cipher_text, key)
            if entropy < min_entropy and e:
                result.append((-e, entropy, key, text))

    return sorted(result)

candidates = dec_loop()
for i in xrange(0, len(candidates), show_lines):
    for line in candidates[i:i+show_lines]:
        print line
    raw_input()
Ergebniss:
Code:
>python simple_dec.py
(-9, 3.8097900388203336, (5, 3, 4), 'EETWLKZHGKGNREEHWWKSEEDUEAUQEUDECZHTCFV')
(-8, 3.7914365135676227, (5, 3, 6), 'EERWLIZHEKGLRECHWUKSCEDSEASQESDEAZHRCFT')
(-7, 3.729734668527451, (5, 3, 7), 'EEQWLHZHDKGKREBHWTKSBEDREARQERDEZZHQCFS')
(-7, 3.7716698486146227, (0, 3, 2), 'JEVBLMEHIPGPWEGMWYPSGJDWJAWVEWIEEEHVHFX')
(-7, 3.829738118011813, (3, 3, 4, 6), 'GETVLLAEHMFLTEEGWXLPFGCSGAUPEVEBDBGREFV')

(-7, 3.829738118011813, (5, 3, 1), 'EEWWLNZHJKGQREHHWZKSHEDXEAXQEXDEFZHWCFY')
(-7, 3.844868642775478, (5, 3, 4, 6), 'EETVJLAEFMFLREEGUXLPDGCSEAUPCVEBBBGRCFV')

(-7, 3.8516548608906165, (8, 3, 4), 'BETTLKWHGHGNOEEEWWHSEBDUBAUNEUAECWHTZFV')
(-7, 3.8710109506896804, (5, 3, 8), 'EEPWLGZHCKGJREAHWSKSAEDQEAQQEQDEYZHPCFR')
(-7, 3.8835808223736046, (5, 3, 3), 'EEUWLLZHHKGOREFHWXKSFEDVEAVQEVDEDZHUCFW')
(-6, 3.6475995783256527, (4, 3, 6), 'FERXLIAHELGLSECIWULSCFDSFASRESEEAAHRDFT')
(-6, 3.692095411492566, (5, 4, 4), 'EDTWKKZGGKFNRDEHVWKREECUEZUQDUDDCZGTCEV')
(-6, 3.743377462774617, (2, 3, 4), 'HETZLKCHGNGNUEEKWWNSEHDUHAUTEUGECCHTFFV')
...
(-5, 3.8627370020580427, (8, 3, 3), 'BEUTLLWHHHGOOEFEWXHSFBDVBAVNEVAEDWHUZFW')

(-5, 3.8652976551377827, (4, 3, 7), 'FEQXLHAHDLGKSEBIWTLSBFDRFARREREEZAHQDFS')
(-5, 3.8695232201731815, (2, 3, 6), 'HERZLICHENGLUECKWUNSCHDSHASTESGEACHRFFT')
(-5, 3.8695232201731815, (5, 6, 9), 'EBOWIFZEBKDIRBZHTRKPZEAPEXPQBPDBXZEOCCQ')
(-5, 3.884653744936846, (3, 4, 4, 7), 'GDTULKADHLFKTDEFWWLOFFCRGZUOEUEADAGQEEV')

(-5, 3.8846537449368466, (2, 3, 4, 0), 'HETBMLAKIMFRUEEMXXLVGGCYHAUVFVEHEBGXFFV'
)
(-5, 3.8846537449368466, (5, 0, 6, 3), 'EHRYJOYHFPDORHCJUAJSDJAVEDSSCYCEBEEUCIT'
)
 
Zurück
Oben