[Excel] Shuffle - reverse Shuffle
#1
Hallo,

vor mehr als hundert Jahren haben Fisher-Yates einen Algorithmus für ein zufälliges Shuttle und die Rückrechnung auf die Original-Liste entwickelt.

Für mehrere Programmiersprachen sind Beispielcodes auf

https[:]//stackoverflow.com/questions/3541378/reversible-shuffle-algorithm-using-a-key

Ein Umsetzung in VBA ist:

Code:
' https://stackoverflow.com/questions/3541378/reversible-shuffle-algorithm-using-a-key

Sub Start()
Dim Tx As String, enc As String, dec As String

Tx = "This is the message"

enc = Shuffle(Tx)
dec = deShuffle(enc)
Debug.Print enc
Debug.Print dec
End Sub

Function Shuffle(ByVal Tx As String) As String
Dim Size As Integer, Char, i As Integer, Ar, n As Integer
Dim tmp As String

Size = Len(Tx)
ReDim Char(Size) As String

For i = 1 To Size:    Char(i - 1) = Mid(Tx, i, 1): Next i

Ar = iRND(Size, 9)

For i = Size - 1 To 0 Step -1
    n = Ar(Size - 1 - i)
    tmp = Char(i)
    Char(i) = Char(n)
    Char(n) = tmp
Next i

Shuffle = Join(Char, "")
End Function

Function deShuffle(ByVal Tx As String) As String
Dim Size As Integer, Char, i As Integer, Ar, n As Integer
Dim tmp As String

Size = Len(Tx)
ReDim Char(Size) As String

For i = 1 To Size:    Char(i - 1) = Mid(Tx, i, 1): Next i

Ar = iRND(Size, 9)

For i = 0 To Size - 1
    n = Ar(Size - i - 1)
    tmp = Char(i)
    Char(i) = Char(n)
    Char(n) = tmp
Next i

deShuffle = Join(Char, "")
End Function

Function iRND(ByVal Size As Integer, key As Integer) As Variant
Dim rd As Integer, i As Integer, Ar

Rnd (-1)
Randomize (-key)
ReDim Ar(Size - 1) As Integer

For i = Size - 1 To 1 Step -1
    Ar(Size - 1 - i) = Size * Rnd
Next i

iRND = Ar
End Function

Nutzung:

In "Sub Start()" wird ein String erstellt und zuerst mit den rotierten Buchstaben im Debug-Fenster ausgegeben. Zur Kontrolle wird auch die Rückrechnung gezeigt.

Braucht man das?

Nein, nicht unbedingt, um in VBA einen String zu verschleiern ist vermutlich XOR einfacher.

Aber im Rahmen der "digitalen Selbstverteidigung" ist es eine der genutzten Varianten, wie Base64 oder Zeichen als Hexadezimal (auch eine andere Basis möglich) darzustellen.

mfg
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste