Kann man in Python Buchstaben mischen und wieder zurückmischen?

7 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Mit random.shuffle nicht.

Aber du könntest z.B. etwas in der Art benutzen:

def my_shuffle(lst, seed = 123, revert = False):
    if not type(lst) == list: raise TypeError('can only shuffle a list.')
    def xorshift(seed):
        x = 123456789
        y = 362436069
        z = 521288629
        w = seed
        while True:
            t = x ^ (x << 11)
            x = y
            y = z
            z = w
            w ^= (w >> 19) ^ t ^ (t >> 8);
            yield w
    xor = xorshift(seed)
    sbox = [next(xor) % len(lst) for i in range(len(lst))]
    if revert: sequence = range(len(lst)-1,-1,-1)
    else: sequence = range(len(lst))
    for i in sequence:
        tmp = lst[sbox[i]]
        lst[sbox[i]] = lst[i]
        lst[i] = tmp

#Der String, der "geshuffelt" wird
lst = list("lorem ipsum dolor sit amet")

#Einmal "shuffeln"
my_shuffle(lst, 123)
print(''.join(lst))

#und wieder "entshuffeln" (ACHTUNG: Funktioniert nur, wenn der selbe Seed wie beim "shuffeln" verwendet wird)
my_shuffle(lst, 123, True)
print(''.join(lst))
Woher ich das weiß:eigene Erfahrung
Tbear44 
Fragesteller
 26.02.2020, 11:12

Vielen Dank!

0

shuffle() ist eine auf Zufall aufgebaute Funktion und damit irreversible.

Stell dir das mischen eines Kartenspiels vor... du kannst anschließend die Karten zwar wieder sortieren, aber es ist fraglich, ob das Ergebnis dem Ausgangszustand entspricht?

Im besten Fall wäre sort() als komplementär-Methode zu shuffle() anzusehen.

Tbear44 
Fragesteller
 26.02.2020, 11:20

Tut mir leid. Aber tatsächlich basiert jede Zufallszahl eines Computers auf einen Algorythmus, der sich, wenn man sich die Parameter merkt, zurückverfolgen lässt und damit auch umkehren lässt.

0
Lolwis111  26.02.2020, 11:30
@Tbear44

Dann musst du eben mal schauen wie die Zufallszahlen deines Computers berechnet werden! Oder shuffle selber bauen. Dann kannst du kontrollieren welcher Seed für random genutzt wurde und es dadurch entsprechend zurückrechnen.

0

Wenn du dir statt dem "Zurückmischen" einfach den ursprünglichen String merkst?

Ansonsten musst du dir das Misch-Muster merken und rückwärts anwenden. Wenn du aber ohnehin nur auf den Ausgangsstring zurück willst, ist die obige Methode viel einfacher.

qugart  26.02.2020, 09:01

Ich hätte da auch ein zusätzliches

liste_original = list(string) 

gemacht. Ist halt nur nicht das gewünschte. Die Frage ist, ob das gewünschte notwendig ist.

0
Ja ist schon klar, aber da ein Computer nicht zufällig rechnen kann

Doch, ein Computer kann zufällig rechnen, das kommt auf die Vorgehensweise an. dev/random etwa erzeugt echte Zufallszahlen, bei denen kein Algorithmus genutzt wird, sondern das Umgebungsrauschen.

Und selbst wenn auf die Weise nur ein Startwert (seed) für einen Zufallsalgorithmus erzeugt wird, dann ist dieser Startwert echt zufällig. Diesen Wert müsstest du als Erstes herausfinden, um die Verschlüsselung zu knacken und den durchzuprobieren ist wahrscheinlich performancemäßig noch schlechter als ein Bruteforce-Angriff auf den String selbst.

Tbear44 
Fragesteller
 26.02.2020, 09:00
sondern das Umgebungsrauschen

Algrorythmus.

0
bluebird5  26.02.2020, 09:03
@Tbear44

Das Umgebungsrauschen entsteht eben nicht durch einen Algorithmus, sondern durch physikalische Prozesse.

2
Lamanini  26.02.2020, 09:46
@Tbear44

Nein, eben nicht.

Da werden Strahlen aus dem Weltraum vom Urknall aufgenommen.

0
Tbear44 
Fragesteller
 26.02.2020, 11:15
@Lamanini

Es IST ein Algorythmus! Der Physikalische Prozess wird eben DURCH den Algorythmus bearbeitet.

0
Tbear44 
Fragesteller
 26.02.2020, 11:15
@bluebird5

Es IST ein Algorythmus! Der Physikalische Prozess wird eben DURCH den Algorythmus bearbeitet.

0
bluebird5  26.02.2020, 11:40
@Tbear44

Und dieser Algorithmus kommt von Gott, oder wie? Und wie heißt der Algorithmus eigentlich, Algorithmen haben in der Regel einen Namen.

Denn aus irgendeiner Software kann der Algorithmus nicht kommen, da das Rauschen von physikalischen Bauteilen stammt. Ein simpler ohm'scher Widerstand zum Beispiel kann rauschen, wo soll da in der Schaltung dein Algorithmus hängen?

Ich hab übrigens Informatik studiert, ein bisschen was verstehe ich daher schon von dem Thema. Und bei dir so?

0
Lamanini  26.02.2020, 12:15
@Tbear44

Ja dann. Einen Algorithmus musst du ja vorhersagen können. Dann knack mal kurz eine der sichersten Lösungen für Zufall die wir haben.

Dann funktioniert nämlich auch dein Ansatz.

1
string = "".join(liste)
Tbear44 
Fragesteller
 26.02.2020, 08:47

Das kommt anstelle dieser

Hier for Schleife, die die Liste wieder in einen String um wandelt

oder? Danke!

1
qugart  26.02.2020, 08:52
@Tbear44

Das hilft dir nicht.

Das gibt dir nur die Ausgabe ohne Auflistung aus.

0
Tbear44 
Fragesteller
 26.02.2020, 08:53
@qugart

ich weiß. aber er hat einen sehr umständlichen code viel einfacher gemacht

0
qugart  26.02.2020, 08:59
@Tbear44

Der Code macht aber nicht das, was du willst.

0
qugart  04.03.2020, 14:49
@Tbear44

Ach so....du wolltest gar keine Lösung zu deiner Frage. Auch gut. Kann man ja nicht wissen.

0