Clever-Excel-Forum

Normale Version: Freitagsfrage: String-Encoding
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hallo,

gegeben ist ein encodierter String:

"lofwvscrdcutometnpnisktoqurgycazhjxrb"

und ein Algorithmus zum Dekodieren.

Frage: Wie kommt man vom Klartext zum enkodierten String?

Code:
Option Explicit

Function decode(ByVal Tx As String) As String
Dim s As Long, p, x As Long, m As Long, q As Integer, y As Integer, e As String, b As Integer, t As Integer

s = 325197
t = Len(Tx)

ReDim p(t)

For b = 0 To t - 1
    p(b) = Mid(Tx, b + 1, 1)
Next b

For b = 0 To t - 1
    x = s * (b + 412) + (s Mod 21331)
    m = s * (b + 467) + (s Mod 43934)
    q = x Mod t
    y = m Mod t
    e = p(q)
    p(q) = p(y)
    p(y) = e
    s = (x + m) Mod 1769511
Next b
decode = Join(p, "")
End Function

Sub T_1()
Debug.Print Mid(decode("lofwvscrdcutometnpnisktoqurgycazhjxrb"), 1, 11)

End Sub

Das Ergebnis ist: constructor

Der Code vertauscht mehrfach zwei Buchstaben, an einigen Positionen auch mehrfach.

Ein Buchstabe mehr oder weniger führt zu völlig anderen Ergebnissen.

Der gesuchte Algorithmus zum Encodieren sollte für beliebe String funktionieren.


mfg
Ich finde nirgends das Wort "Constructor". 

Oder setzst Du hier einen Begriff aus der OOP voraus?

Desweiteren solltest Du komplette Artikel schreiben, also auch das Ergebnis nennen.

Ich komme mit dem Code nicht klar und erhalte über Einfügen in ein Modul und F5 oder F8 kein Ergebnis.
Zitat:Der gegebene Code verwendet einen modifizierten Fisher-Yates Shuffle-Algorithmus, um den Klartext zu verschlüsseln. Der Algorithmus funktioniert, indem er Buchstaben an verschiedenen Positionen im String vertauscht. Hier ist eine kurze Erklärung des Algorithmus:

Eine Startzahl s wird festgelegt (in diesem Fall ist es 325197).
Der Klartext wird in ein Array p konvertiert.
Eine Schleife durchläuft jedes Element des Arrays und tauscht die Buchstaben an verschiedenen Positionen basierend auf Berechnungen mit der Startzahl s.
Die Berechnungen (Modulo und Multiplikation) erzeugen Pseudozufallszahlen, die dazu verwendet werden, zwei Positionen im Array zu wählen und die Buchstaben an diesen Positionen zu vertauschen.
Der neue verschlüsselte String wird durch Verbinden der Array-Elemente erstellt.
Um den Klartext zu verschlüsseln, könnte man den gleichen Algorithmus verwenden, indem man den Code leicht ändert, um den Prozess umzukehren. Hier ist eine angepasste Funktion für die Verschlüsselung:


Code:
Function encode(ByVal Tx As String) As String
    Dim s As Long, p() As String, x As Long, m As Long, q As Integer, y As Integer, e As String, b As Integer, t As Integer

    s = 325197
    t = Len(Tx)

    ReDim p(t - 1)

    For b = 0 To t - 1
        p(b) = Mid(Tx, b + 1, 1)
    Next b

    For b = t - 1 To 0 Step -1
        x = s * (b + 412) + (s Mod 21331)
        m = s * (b + 467) + (s Mod 43934)
        q = x Mod t
        y = m Mod t
        e = p(q)
        p(q) = p(y)
        p(y) = e
        s = (x + m) Mod 1769511
    Next b

    encode = Join(p, "")
End Function

Du kannst diese Funktion dann verwenden, um einen Klartext zu verschlüsseln:

Code:
Sub T_2()
    Debug.Print encode("constructor")
End Sub
Das Ergebnis sollte dem ursprünglichen verschlüsselten String entsprechen.
behauptet ChatGPT
Könnt Ihr mal auch für AD-Leser (alt und dumm) schreiben?
@LCohen:

Wenn der Code ausgeführt wird, ist das Ergbnis im Direkt-Fenster "constructor"

@Warkings:

Danke, danach kann ich suchen
Kann ich nichts mit anfangen. Scheint VBA-Spezies vorbehalten zu sein. Bei mir gibt es kein Fenster "constructor", und im Debug-Fenster seh ich auch nix.
Hier ist das Ergebnis nur ein Anagram von 'constructor'.
Ich geb's auf.
Musst Du nicht, LCohen!
Das Direktfenster wird im VBE mittels Strg+G angezeigt.
"lofwvscrdcutometnpnisktoqurgycazhjxrb"
wird zu 
"constructor"
verschlüsselt.
Fennek möchte
"constructor"
zu "lofwvscrdcutometnpnisktoqurgycazhjxrb"
entschlüsseln.

Das, was Chat-GPT da vorschlägt, ist wie erwartet Müll.
Er entschlüsselt zu "otsoctrncru"
was natürlich verdammt nahe an "lofwvscrdcutometnpnisktoqurgycazhjxrb" ist …

Zum Thema habe ich aber nichts zu schreiben, nicht mein Gebiet.

Gruß Ralf
Hallo,

mit dem Suchwort gab es einen Treffer bei "stackoverflow". Nach VBA portiert:

Code:
Option Explicit
' 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

Die Ausgangsfrage konnte ich bis jetzt nicht lösen.

PS: Lästern:

Wer versucht seinen Code so zu verschleiern, aber den Algorithmus direkt dazu schreibt, ist ...
Seiten: 1 2