Lfsr

Neue Frage »

Auf diesen Beitrag antworten »
Onkeliroh Lfsr

Meine Frage:
Hi, Ich soll für meine Kryptographie Veranstalltung einen LFSR Verschlüsselungs Algorithmus implementieren, habe aber bisher leider keine verwertbaren Informationen dazu gefunden. Habt ihr ne Idee wo ich Informationen zu dem Thema erhalte, oder könnt ihr mir helfen?
Die Aufgabe Lautet:
"Sei F_g ein 16-Bit LFSRs mit dem Feedback-Polynom g. Berechnen Sie mit Hilfe ihrer Implementierung die Periodenlängen der angegebenen LFSR für den Startzustand 1^16
bei dem alle 16-Bits des des LFSR auf 1 gesetzt sind. Welche der angegebenen LFSR würden Sie ihrer Kommilitonin Alice empfehlen. Begründen Sie ihre Antwort.
a) Fg1 mit g1(x) = x^16 + x^5 + x^3 + x^1 + 1.
b) Fg2 mit g2(x) = x^16 + 1.
c) Fg3 mit g3(x) = x^16 + x^7 + 1.
d) Fg4 mit g4(x) = x^16 + x^14 + x^13 + x^11 + 1."

Meine Ideen:
Bisher weis ich das ich den Grad des Polynoms brauche und die einzelnen Exponenten. Später wird dann irgendwas XOR gerechnet, aber wann und wo weis ich leider nicht.
 
Auf diesen Beitrag antworten »
Karlito

Hallo Onkeliroh,

am besten ist es du baust die Linear rückgekoppelten Schieberegister aus Wikipedia nach... Ist in Software natürlich etwas hässlicher als in Hardware... Beantwortet dir aber erstmal, wo die XOR verknüpfungen hin müssen. Das Fibonacci-LFSR lässt sich in SW sicher am einfachsten bauen.

VG,

Karlito
Auf diesen Beitrag antworten »
Onkeliroh

Hi,
danke für die schnelle Antwort.
Ich hab nur leider ein großes verständnis Problem.
Gibt es kein "LFSR für Dummies" oder so?
Oder einfach nen Pseudocode wäre schon cool.

Grüße
Onkeliroh
Auf diesen Beitrag antworten »
Karlito

Hi,

muss ich erstmal selbst implementieren. Pseudocode bekomm ich so nicht hin... Hoffe das wird am Wochenende.

VG,

Karlito
 
Auf diesen Beitrag antworten »
Onkeliroh

keine Hektik, hab in der letzten Vorlesung die Funktionsweise des LFSR verstanden und auch gleich als Alg. implementiert.

Nur leider wollte mein Dozent einen ganz anderen Alg. haben, der rein garnichts mit LFSR zu tun hat.

Würde ja jetzt meinen Code posten, weis aber nicht ob das im Forum gern gesehen wird.
Auf diesen Beitrag antworten »
Karlito

Hi,

solange es dein eigener Code ist, sollte es kein Problem darstellen den Code zu posten. Es ist gut Lösungen zu diskutieren.

Habe heute selbst was implementiert, aber das wird vlt nicht die Problemstellung lösen. Es werden jedenfalls alle möglichen Wörter erzeugt. Ich kann den Code auch mal Posten, wenn du magst (aber frühestens morgen, keine Lust den Laptop rauszukramen).

Schick mal deinen Code und beschreib mal was vlt noch dein Verständnisproblem ist. Ich bin auch nicht mehr Fit auf dem Gebiet aber vlt bekommen wir das gemeinsam hin.

VG,

Karlito
Auf diesen Beitrag antworten »
Onkeliroh

Der Code ist speziell auf die Aufgabe zugeschnitten und ist aus meiner Sicht ein LFSR mit Feedbackpolynom:
Sprache: Python

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
__bit=[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] #Eingabe
g1=[16,5,3,1,0] #g1-g4 sind die Feedbackpolynome mit den entsprechenden Exponenten
g2=[16,0]
g3=[16,7,0]
g4=[16,14,13,11,0]

def LFSR(g):
  biterg=__bit[:]
  i=0 #Zyklenzaehler
  ausg=''
  run=True
  while run:
    k=biterg[g[0]]^biterg[g[1]] #rechnet XOR mit den ersten beiden Stellen
    for j in range(2,len(g)):
      k=k^biterg[g[j]] #verrechnet die weiteren Stellen XOR
    ausg=ausg+str(biterg[len(biterg)-1])
    biterg.insert(0,k) #fuegt neues Bit an erster Stelle ein  
    biterg.pop(len(biterg)-1) # nimmt letztes Bit weg
    i+=1
    if biterg==__bit:
      run=False
  return i,ausg

def main():
  print('Zyklenlaenge | Zyklus')
  print('a: ',LFSR(g1))
  print('b: ',LFSR(g2))
  print('c: ',LFSR(g3))
  print('d: ',LFSR(g4))

main()

Der Code ist nicht optimal und kann durchaus verbessert werden. Zum mal bei 3von 4 Feedbackpolynomen eine Zyklen länge von 1 raus kommt was, meiner Meinung nach, korrekt ist. Die Eingabe für diese Aufgabe ist unglücklich gewählt.
Auf diesen Beitrag antworten »
Karlito

Hallo Onkeliroh,

bist du dir sicher, dass du die Überlagerung mit dem Feedbackpolynom richtig gemacht hast? Mein Programm ist etwas anders. Es überlagert die erste Stelle nicht mit dem Feedbackpolynom. Ich habe mir noch nicht angeschaut, welche Unterschiede sich dadurch ergeben. Ich müsste es dahingehend noch einmal umschreiben. Ich komme aber nicht vor heute abend dazu. Vtl hilft mein momentanes Programm schonmal weiter (leider nicht kommentiert...) Jedenfalls komme ich schonmal auf andere Periodenlängen, wobei ich Wortweise zähle.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
#include <stdlib.h>
#include <stdio.h>

int getDegree(unsigned int polynom){
	int result = 0;
	for(int i=0; i <32; i++){
		if(polynom&0x1){
			result=i;
		}
		polynom>>=1;
	}

	return result;
}

int getParity(unsigned int value){
	int result = 0;

	for(int i = 0; i<32;i++){
		result^=(value&0x1);
		value>>=1;
	}

	return result;
}

void printBinary(unsigned int value){
	char chars[33];
	chars[33]=0;

	printf("%X: ", value);

	for(int i = 32; i>=0; i--){
		chars[i] = 0x30 + value%2;
		value>>=1;
	}

	printf("%s\n", chars);
}

void lfsr(unsigned int polynom, unsigned int startWord){
	unsigned int degree = getDegree(polynom);
	unsigned int currentWord = 0;
	unsigned int wordMask = (0x1<<(degree))-1;
	unsigned int lsb = 0;

	printf("%d\n", degree);
	printf("%X\n", wordMask);
	printf("%X\n", startWord);

	polynom>>=1;

	startWord &= wordMask;

	currentWord = startWord;

	int ctr = 0;

	do{
		lsb = 0;

		lsb = getParity(currentWord&polynom);

		currentWord=((currentWord<<1) + lsb)&wordMask;

		printBinary(currentWord);

		ctr ++;

	} while(currentWord!=startWord);

	printf("ctr: %d\n", ctr);

}


int main(){
	
	lfsr(0x10001,0xFFFF);
	lfsr(0x1002B,0xFFFF);
	lfsr(0x10081,0xFFFF);
	lfsr(0x16801,0xFFFF);

	return EXIT_SUCCESS;
}


Die Periodenlänge erhältst du mit "./a.out | grep ctr".

VG,

Karlito
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »