Pseudozufallsgenerator rückwärts, Funktionswert ohne Interation?

Gast #5014296
Lesenswert?

Mein Programm (avr-gcc) soll eine Sequenz pseudozufälliger Werte 
vorwärts und rückwärts generieren/durchlaufen. Dazu zwei Fragen:

1. Lässt sich ein LFSR umkehren (ich vermute: ja)?

2. Gibt es bei PRNG (z.B. LFSR) eine Funktion, um den Zufallswert einer 
bestimmten Iteration direkt zu erhalten?

Dagegen spricht https://de.wikipedia.org/wiki/Pseudozufall
> Generell definiert man in der Berechenbarkeitstheorie als pseudozufällig, was 
durch effiziente Algorithmen nicht vorhergesagt werden kann. Pseudozufälligkeit 
ist aber immer noch berechenbar (man kann sie effizient erzeugen), nur nicht 
vorhersagbar.

Aber evtl. trifft das ja nicht auf LFSR zu.
Bei bekannter Anzahl von Werten könnte man alternativ ja den Zustand 
vorbereiten und dann als seed für den umgekehrten Algorithmus nutzen, 
richtig?

Weitere Wikipedia-Artikel:
https://de.wikipedia.org/wiki/Zufallszahlengenerator#Pseudozufallszahlengenerator
https://de.wikipedia.org/wiki/Linear_rückgekoppeltes_Schieberegister
#5014334
Lesenswert?

Interessante Fragen, die Antworten kenne ich leider nicht.

Aber ich kann noch zwei weitere Fragen stellen:

- Wie kriege ich aus einer Pseudozufallszahlenfolge das generierende 
Polynom raus, also das LFSR?

- Wie kriege ich für ein LFSR raus, ob es eine 'maximum length sequence' 
erzeugt.

So viele interessante Themen, so wenig Zeit.

Cheers
Detlef
#5014357
Lesenswert?

Adam schrieb:
> 1. Lässt sich ein LFSR umkehren (ich vermute: ja)?

Nein.

> 2. Gibt es bei PRNG (z.B. LFSR) eine Funktion, um den Zufallswert einer
> bestimmten Iteration direkt zu erhalten?

Nein.

Aber man kann natürlich eine Funktion bauen, die einen Parameter bekommt 
(0 ... 65535 oder so), und ihn mit einem Startwert (z.B. diesmal 5623) 
verrechnet, so daß die Ergebniszahlen wild hin und her springen.

Jedesmal, wenn man einen anderen Parameter verwendet, kommt eine andere 
Zahl raus, aber jedesmal, wenn man denselben Parameter reinsteckt, 
kommt, beim gleichen Startwert, dieselbe Zahl raus. Eine einfache 
vorgefertigte Funktion dafür wäre MD5 (berechnet gleich einen Haufen 
Ergebniswerte auf ein Mal). Man muss etwas auspassen, wenn man den 
Zahlenbereich einschränken will, daß die Ergebnisse gleichverteilt 
bleiben.

Die Sache mit dem Startwert ist ja auch per PRNG bekannt. ein Programm 
läuft mit gl4ichen Startwert immerg leich ab (deterministisch) und man 
braucht andere Startwerte für andere Zufallsfolgen.
#5014396
Lesenswert?

Adam schrieb:
> Detlef _. schrieb:
>> - Wie kriege ich aus einer Pseudozufallszahlenfolge das generierende
>> Polynom raus, also das LFSR?
>
> https://en.wikipedia.org/wiki/Berlekamp%E2%80%93Massey_algorithm
>
>

Dann ist die Antwort auf Deine erste Frage doch klar: Du steckst die 
umgekehrte Folge in den Berlekamp/Massey Algorithmus und bekommst das 
Polynom.

math rulez!
Cheers
Detlef
Gast #5014428
Lesenswert?

Kleiner Test:
1
#!python3
2
#coding=utf-8
3

4
def xorshift(seed=None):
5
    if seed is not None:
6
        xorshift.bits = seed
7
    xorshift.bits ^= xorshift.bits << 13
8
    xorshift.bits ^= xorshift.bits >> 17
9
    xorshift.bits ^= xorshift.bits << 5
10
    return xorshift.bits & 0xFF
11

12
xorshift.bits = 1;  # "static" function attribute
13

14
output = "{:2}\t{:3}"
15

16
print("forward")
17
for i in range(0, 32, 1):
18
    print( output.format(i, xorshift(i)) )
19

20
print()
21
print("backward")
22
for i in range(31, -1, -1):
23
    print( output.format(i, xorshift(i)) )
#5015059
Lesenswert?

Detlef _. schrieb:
> Interessante Fragen, die Antworten kenne ich leider nicht.
>
> Aber ich kann noch zwei weitere Fragen stellen:
>
> - Wie kriege ich aus einer Pseudozufallszahlenfolge das generierende
> Polynom raus, also das LFSR?
>
> - Wie kriege ich für ein LFSR raus, ob es eine 'maximum length sequence'
> erzeugt.
>
> So viele interessante Themen, so wenig Zeit.
>
> Cheers
> Detlef

Ob es eine Maximum Length Sequence ist, kann man anhand des Polynoms 
sagen. Die Polynome, die eine MLS erzeugen, haben bestimmte spezielle 
Eigenschaften, und man kann dann beweisen, dass man damit eine MLS 
erhält. Ich hatte da mal eine Vorlesung drüber, bei Interesse kann ich 
die Unterlagen hervorkramen.
#5015647
Lesenswert?

Tobias P. schrieb:

> Ob es eine Maximum Length Sequence ist, kann man anhand des Polynoms
> sagen. Die Polynome, die eine MLS erzeugen, haben bestimmte spezielle
> Eigenschaften, und man kann dann beweisen, dass man damit eine MLS
> erhält. Ich hatte da mal eine Vorlesung drüber, bei Interesse kann ich
> die Unterlagen hervorkramen.

Hallo Tobias,

schön von Dir zu hören, wir hatten das Thema mal früher diskutiert:

Beitrag "Hadamard Transformation"

Ja, ich weiß, dass man anhand des Polynoms entscheiden kann, ob das eine 
MLS gibt oder, ich kann das leider aber immer noch nicht ;/

Ich hatte damals verschiedene 2^17-1 lange Folgen gesucht und auch alle 
7170 oder so erzeugenden Polynome durch ne Woche Rechner laufenlassen 
gefunden.

Auch die Rückrechnung des Polynoms aus der Folge (Berlekamp/Massey 
Algorithmus) habe ich noch nicht so verstanden, dass ich ihn 
implementieren könnte.

Es gibt imer was zu tun.
math rulez!
Cheers
Detlef
#5015674
Lesenswert?

Detlef _. schrieb:
> schön von Dir zu hören, wir hatten das Thema mal früher diskutiert:
>
> Beitrag "Hadamard Transformation"
>
> Ja, ich weiß, dass man anhand des Polynoms entscheiden kann, ob das eine
> MLS gibt oder, ich kann das leider aber immer noch nicht ;/

Stimmt, an diese Diskussion habe ich gar nicht mehr gedacht :-)
damals konnte ich das auch nicht (entscheiden, ob ein Polynom eine MLS 
ergibt). Habe aber mittlerweile durch den Dienst am Vaterland einiges 
über Kryptographie gelernt und hatte dort ein paar Vorlesungen zu dem 
Thema, auch MLS und diese Polynome wurden behandelt. Im Moment kann ich 
es auch grade nicht mehr sagen, was genau die Eigenschaft war, aber in 
den Vorlesungsunterlagen ist es definitiv beschrieben. Ich schaue übers 
Wochenende mal, das Zeug müsste irgendwo noch rum liegen.


> Es gibt imer was zu tun.
> math rulez!
*dito!*
Gast #5015677
Lesenswert?

Adam schrieb:
> 1. Lässt sich ein LFSR umkehren (ich vermute: ja)?

was meinst du mit umkehren? Etwa op man das rückkoppelte Schieberegister 
auch in die entgegngesetzte Richtung schieben lassen kann? Denk mal 
nach!

Kann man sagen wenn ein XOR bspw eine 1 ausgibt rückschliessen an 
welchen Eingang welcher Wert anliegt? Kann man das bei einer '0' am 
Ausgang?


Oder stellst Du die Frage ob man zwei LFSR konstruieren kann die die 
gleiche Sequenz nur in entgegengesetzter Reihenfolge ausgeben?

> 2. Gibt es bei PRNG (z.B. LFSR) eine Funktion, um den Zufallswert einer
> bestimmten Iteration direkt zu erhalten?

Was meinst du mit direkt? Meinst du eher "schneller" als durch 
Durchlaufen lassen der Iterationen? So ein LSFR lässt sich leicht in 
einem FPGA nachbilden, der dann mit 300 MegaIterationen pro sekunde 
läuft. also ein 32bit LSFR in 13 Sekunden wegnudelt.
Gast #5018383
Lesenswert?

1.) zu jedem nicht reduzierbaren Polynom eines LFSRs exitiert ein 
inverses Polynom mit gleichen Eigenschaften wie das nicht inverse 
Polynom
2.) kennt man das LFSR Polynom und dessen Seed so kann man auf einfache 
Art und Weise das inverse Polynom und dessen Seed berechnen
3.) die Sequenz der erzeugten Bits beider LFSR ist dann zueinander 
gespiegelt, ebenso der Inhalt der LFSR Register
4.) LFSR mit maximaler Länge benutzen immer nicht reduzierbare Polynome 
(das ist wie eine Primzahl in N aber eben bei LFSRs stattdessen in 
GF(2^x))
5.) nicht reduzierbare Polynome kann man direkt berechnen, man muß sie 
also nicht per Brute Force erzeugen. Dazu muß man in GF(2^x) ein 
gegebenes Polynom faktorisieren und die sich daraus ergebenden 
Teilpolynome überprüfen. Wie bei natürlichen Zahlen faktorisiert man 
diese in Primzahlen und kann so die Eigenschaften der zusammengesetzten 
Zahlen ermitteln. So geht dies auch mit Zahlen in Galois Feldern.
6.) bei bekanntem Polynom eines LFSRs und einer unvollständigen Folge an 
Ausgabebits kann man die nächsten Bits berechnen. Das, und der Fakt das 
LFSR meistens sehr kleine Polynome verwenden, ist der Grund warum LFSRs 
in der Kryptographie als unsicher einzustufen sind. Man kann sie also 
knacken und das benutzte Polynom aus eine gegebenen Folge von 
Ausgabebits berechnen.
7.) im FHT Thread findest du meinen Source in dem du auch die par Zeilen 
Source finden kannst die aus einem Polynom+Seed das passende inverse 
Polynom+Seed direkt berechnet. Essentiell: Bitreichenfolge des Polynoms 
invertieren und dabei gleich den Seed für das inverse Polynom berechnen, 
ist nur eine kleine Schleife im Source.

Gruß Hagen

PS: weil oben der BBS=Blum Blum Shub RNG angesprochen wurde. Dieser ist 
der einzige als mathematisch sicher beweisbare PRNG. Kennt man dessen 
Parameter, also auch die im allgemeinen geheimen Parameter, kann man 
mathematisch auf direktem Wege:
1.) das Bit mit Index X berechnen
2.) den internen Status des BBS vor- und zurück"spulen", also den 
Ausgabestrom der PRNG Bits überpringen um +- X Datenbits.
3.) demzufolge den Ausgabestrom auch rückwärts ablaufen lassen
Gast #5018386
Lesenswert?

Georg B. schrieb:
> Ich denke, die Intention des TO ist, die ausdrückliche Iteration des
> LSFR einzusparen indem er direkt aus einem alten Wert rechnet. BBS ist
> so ein Algorithmus, der das kann.

Natürlich geht auch dies: man benötigt nur das benutzte LFSR Polynom und 
den aktuellen Seed und schwups berechnet man das nächste Datenbit. Also 
exakt das was man sowieso macht wenn man mit einem LFSR die Zufallsbits 
erzeugen würde. Da man aus einem gegebenen Polynom+Seed das inverse 
Polynom+Seed berechnen kann, kann man also auch ab dieser Bitposition in 
die Gegenrichtung die vorherigen Datenbits berechnen.

Gruß Hagen
Beitrag #5020826 wurde von einem Moderator gelöscht.
#5020829
Lesenswert?

Hallo,

bist Du's, Hagen RE ? Bei dem alten thread warst Du auch beteiligt,
schon damals war ich leider nicht in der Lage gewesen Dir zu folgen :/ .
Habe mich mal bisschen gebildet und C-Routinen gebastelt, die mit
Galoisfeldern rechnen, siehe file. Ich kann in Galoisfeldern jetzt
addieren, multiplizieren und dividieren. Inverse Polynome über modulo
Polynomen kann ich auch berechnen, alles schick.

Jetzt war Deine Aussage:
>>>>>>
1.) zu jedem nicht reduzierbaren Polynom eines LFSRs exitiert ein
inverses Polynom mit gleichen Eigenschaften wie das nicht inverse
Polynom
<<<<<<<

Ein inverses Polynom p^-1 zum Polynom p hat die Eigenschaft
(p^-1 * p) modulo m = 1 , mit einem Modulopolynom m. Wenn p das LFSR
Polynom ist, was ist den dann m? Das irreduzible  Polynom x^2+x liefert
für 3Bit eine MLS der Länge 7, dito das Polynom x^2+1. Die beiden Folgen
sind 'rückwärts', das was der TO will, also nehme ich an dass die
Polynome invers zueinander sind, aber mit welchem Modulopolynom, man
will ja in GF(2^3) bleiben?

Fragen über Fragen.

Als nächstes plane ich Berlekamp/Massey und Test, ob ein Polynom
irreduzibel ist, so Zeit vorhanden.

Cheers
Detlef

PS: Die C source dient zur Ansicht und meiner Bildung, die ist weder
fehlersicher noch richtig noch schön noch effizient.
Angehängte Dateien:
Gast #5021341
Lesenswert?

Ähm, vielleicht liegts an meiner verfälschenden Wortwahl: ich meinte 
nicht inverses Polynom sondern invertiertes Polynom. Du verstehst 
wahrscheinlich unter "invers" das Modulare Inverse zum Polynom, das 
meinte ich natürlich nicht.

Wenn ich am WE wieder zu Hause bin schaue ich mal nach meinen alten GF() 
Sourcen um nicht reduzierbare Polynome zu berechnen, bin allerdings im 
Umzugsstreß :(

Gruß hagen
#5049910
Lesenswert?

Liebe Freunde der linearen Algebra (es sind wenige, wie die mageren 
Downloadzahlen zeigen),

anbei der Berlekamp-Massey Algorithmus für Bitfelder. Damit ist Frage 1 
des lange verschollenen TO beantwortet.

Wenn man bei einem 4-er 'Linear feedback shift Register' den letzten und 
den vorletzten anzapft kommt eine 'Maximum length sequence' raus. Wenn 
man die 'umdreht' und in den Berlekamp-Massey schickt sagt der, dass man 
den letzten und den ersten anzapfen soll um diese Folge zu erhalten. 
Wieso das das 'inverse Polynom' ist enzieht sich meiner schwachen 
Kenntnis.

Als nächstes werde ich ich rausfinden, wie man prüft ob ein Polynom 
'irreducible' ist, also eine MLS liefert.

Großer Spaß.

math rulez !
stay tuned !
Cheers

Detlef
Angehängte Dateien:
#5113941
Lesenswert?

Hallo,

anbei ein Programm, das für ein linear feedback shift register der 
maximalen TAP Anzahl 64 alle primitiven Polynome berechnet, die eine 
maximum length sequence liefern. War nen schwieriger hack, Geschichte 
dazu siehe hier:

www.matheplanet.de/matheplanet/nuke/html/viewtopic.php?topic=230404&post 
_id=1677816

Jetzt rechne ich allerdings für 17 taps alle 7710 Polynome in 13sec, 
hatte ich schon mal 3 Wochen Rechenzeit für benötigt.

War ein grosser Spaß, ich poste das in der Hoffnung, dass das 
irgendjemenden interessieren könnte.

Rückfragen willkommen.
math rulez!
Cheers
Detlef
Angehängte Dateien:
#5115134
Lesenswert?

Ach so, die Ursprungsfrage lautete ja, wie man die MLS umdreht. Die 
Antwort kenne ich jetzt als Beifang:

Für ein z.B. 4-Tap LFSR lautet das Polynom p^4+b3*p^3+b2*p^2+b1*p^1+1
Das Polynom ist also normiert und der Koeffizient von p^0 ist immer 1 
(ansonsten wäre das Polynom durch p teilbar).

Die umgedrehte MLS kriegt man mit dem Polynom
p^(4-4)+b3*p^(4-3)+b2*p^(4-2)+b1*p^(4-1)+1*p^(4-0), also die 
Koeffizienten quasi spiegeln.

Anbei ein richtigeres Programm.

Cheers
Detlef
Angehängte Dateien:
#5126360
Lesenswert?

Die zweite Frage des TO lautete

>>>>>>>
2. Gibt es bei PRNG (z.B. LFSR) eine Funktion, um den Zufallswert einer
bestimmten Iteration direkt zu erhalten?
<<<<<<<

Ja, die gibt es. Beispiel seien 5 taps, primitives Polynom ist 
p(x)=x^5+x^2+1, ein Galois LFSR, dh. das höchste Bit wird unten wieder 
reingeschoben und xored in die zweitunterste Stufe, siehe

https://de.wikipedia.org/wiki/Linear_r%C3%BCckgekoppeltes_Schieberegister

Dann lautet die Folge beginnend bei #1=00010: #2=00100, #3=01000, 
#4=10000, #5=00101, #6=01010

#23 lautet 01111, es kommt also aus dem LFSR eine 0 nach der 23. 
Iteration raus. Das entspricht dem Ausdruch x^23 mod p(x).
x^23 ist mit 'square and multiply' schnell zu  berechnen, siehe gal_exp 
in der source:

x^23 =(((x^2)^2*x)^2*x)^2*x

https://de.wikipedia.org/wiki/Bin%C3%A4re_Exponentiation.

So kriegt man mit O(log n) mit n als Bitlänge des Schieberegisters eine 
beliebige Iteration 'direkt' (mit O(log n) Laufzeit) raus, das geht 
schnell.

Cheers
Detlef

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren