2016-08-03 5 views
0

ich eine einfache Funktion, die überläuft mit Modulo-OperatorWie umkehren ich den Mod-Operator

Private Function RandomizeBlock(seed As Integer, ByVal block() As Byte) As Byte() 
     Dim Generator As System.Random = New System.Random(seed) 
     Dim newblock(255) As Byte 
     Dim i As Integer = 0 
     For i = 0 To block.Length - 1 
      newblock(i) = (block(i) + Generator.Next(0, 256)) Mod 256 
     Next 

     Return newblock 
    End Function 

Wie rückgängig ich die Randomisierung zu einem Block getan behandelt?

Ich weiß mod funktioniert wie folgt:

253,254,255,0,1,2,3,4 Umhüllungen auf 0.

Kann ich hier die Umkehrung von reverse finden?

rndValue = Generator.Next(0, 256) 
reverse_1 = ((256 - rndValue) + block(i)) Mod 256 
reverse_2 = ((256 + rndValue) - block(i)) Mod 256 
+0

Es ist unklar, was Sie erreichen wollen: Sie scheinen zu wissen, dass 'Mod' eine irreversible Funktion im Allgemeinen. Sie haben 'x + b Mod 256 = a', und Sie scheinen' x' (mod 256) abrufen zu wollen. Aber das funktioniert nur, wenn du 'a' * und *' b' kennst. Im Moment kennen Sie nur "a", denn "b" ist in keiner Weise ermittelbar. Dies kann nicht funktionieren. –

+0

nichts ist verloren mit dem Mod-Operator es ist nur gehalten in, was ich Muskelspeicher nennen, auch wenn es zu einer niedrigeren Zahl übergelaufen ist, könnte es immer noch als eine große Zahl imaginäre und subtrahiert von ihm betrachtet werden .. nein? Ich kenne den RNG-Wert, der hinzugefügt wurde, und ich kenne den neuen Wert, der geändert wurde. – SSpoke

+0

Mod gibt nur den Rest nach der Division zurück. Wenn Sie also Rest = x Mod 256 setzen, erhalten Sie eine Zahl, die den Betrag darstellt, der übrig bleibt, nachdem x durch viele 256er Fits geteilt wurde. Um die Mod-Funktion rückgängig zu machen, müssen Sie wissen, wie viele 256 zusätzlich zum Rest passen. – Beth

Antwort

1

Wenn Sie den Zufallswert kennen, ist die Rekonstruktion des ursprünglichen Werts sehr einfach.

Sie müssen nur daran denken, dass modulo p arbeiten, haben Sie keine tatsächlichen Zahlen, sondern Restklassen. Als Vertreter dieser Klassen werden üblicherweise die ersten natürlichen Zahlen verwendet. Glücklicherweise sind Subtraktion und Addition perfekt mit Restklassen kompatibel. Die Mod Implementierung von VB konvertiert jede positive Zahl in den Vertreter ihrer Restklasse. Bei negativen Zahlen ist dies jedoch nicht möglich. Du musst es selbst machen.

Lange Rede kurzer Sinn, das ist der Code:

Dim reverse As Integer = block(i) - rndValue; 
If reverse < 0 Then reverse = reverse + 256 'Convert to representative of remainder class 
+0

+ 256 statt + 255 und es funktioniert – SSpoke

+1

Oh, mein Schlechter. Natürlich hast du recht. –