Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Freitagsfrage: String-Encoding
#1
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
Antworten Top
#2
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.
Antworten Top
#3
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
Antworten Top
#4
Könnt Ihr mal auch für AD-Leser (alt und dumm) schreiben?
Antworten Top
#5
@LCohen:

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

@Warkings:

Danke, danach kann ich suchen
Antworten Top
#6
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.
Antworten Top
#7
Hier ist das Ergebnis nur ein Anagram von 'constructor'.
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Antworten Top
#8
Ich geb's auf.
Antworten Top
#9
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
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Antworten Top
#10
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 ...
Antworten Top


Gehe zu:


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