Probleme mit Galois Feld GF(2^8)
-
Hatte das auch mal in meinem Studium:
Soweit ich mich erinnere darfst du das Galoisfeld nicht als Körper modulo 256 sehen.
Aus meinem Buch dazu entnehme ich folgendes:Bytes werden in der Rijndael-Chiffre mit Elementen des endlichen Körpers GF(2^8) identifiziert. Als erzeugendes Polynom wird das über GF(2) irreduzible Polynom:
gewählt. Damit ist GF(2^8) = GF(2)(alpha), Wobei alpha der Gleichung alpha^8 + alpha^4 + alpha^3 + alpha + 1 = 0 genügt.
Ein byte(b_7,b_6, ... , b_0) entspricht also dem ElementHoffe das hilft, bei Fragen dazu, frag !
-
@Kurze Antwort:
(1+1)mod256 = 2
(1-1)mod256 = 0
Rechne es nach!@megaweber
Entspricht denn ein GF(2^8) nicht einem GF(256)?
-
Ishildur schrieb:
@Kurze Antwort:
(1+1)mod256 = 2
(1-1)mod256 = 0
Rechne es nach!Idiot. "Benutzt also auf Mod256" -> nein.
-
1+1 = 0 in GF(2^8) und GF(2^8) ist das gleiche wie GF(256), aber es ist was völlig anderes als Z/256Z. Z/nZ ist nur für n prim ein Körper. Endliche Körper mit nicht primer Anzahl von Elementen werden anders konstruiert, nämlich so wie es megaweber schon beschrieben hat. Dadurch ändert sich die Charakteristik des Körpers nicht und 1+1=0 in diesem Körper. Schau Dir die Konstruktion in Ruhe an, so schwer isses nicht.
-
Ich habe da einen Ausschnitt aus einem PDF:
Die Addition und Multiplikation bei einfachen Galois-Feldern kann problemlos so durchgeführt werden, als ob man sich im natürlichen Zahlenraum befindet. Allei das Endergebnis muss modulo-5 berechnet werden. Beispiele aus der Aufgabe:
1+1=2;
2+3 = 5 = 0 mod 5;
4+4 = 8 = 3 mod 5;
13 = 3;
24 = 8 = 3 mod 5;Dabei handelte es sich um ein GF(5)
Also hatte ich gedacht, es währe doch naheliegend, wenn es sich bei einem GF(256) auch so verhält mit dem Unterschied, dass ich anstatt mod5 einfach mod256 benutze.
In einem anderen Dokument, welches genau den gleichen Stoff behandelt, lese ich schliesslich folgendes:In the polynomial representation, multiplication in GF(2^8) corresponds with multiplication of polynomials modulo an irreducible binary polynomial of degree 8. A polynomial is called m(x) and given by m(x) = x8+x4+x^3+x+1
Also, was solls denn nun bitte sein?
P.S.
Ich bin sicher kein Mathegenie, aber wie gesagt, ich habe nun etwa 25 Dokumente über dieses Thema gesammtelt und überall steht etwas anderes drinnen...Ich möchte auf keinen Fall den Eindruck hinterlassen, es besser zu wissen, sondern möchte zeigen, wesshalb ich soviel Mühe mit dem Verständnis dieser Materie habe. Ich glaube, mir fehlen ein paar Grundlagen, um diese Galoisfelder zu verstehen. Kann mir denn jemand sagen, wo ich im Internet an gute und wahre Literatur komme?
@kurze Antwort
Ich frage mich, ob du auch so daherkeiffen würdest, wenn wir uns gegenüberstehen würden...
Soll keine Drohung sein, finde es nur ein wenig daneben, wie du mich runterputzt! Könnte gut sein, dass es gewisse Dinge gibt, bei denen DU ein wenig unbeholfen wirken würdest. Ich denke ich würde mich dan anders verhalten...
-
das ist immer GF(p^k) wobei p ne primzahl ist. bei 256 ist es also mod2, bei 5 ist es mod5 (weil mod p).
-
Ach so OK, man nimmt die kleinste mögliche Primzahl als Basis. Was ich dann aber immer noch nicht verstehe ist folgendes:
In der Definition von Rijndael wird folgende Vorgehensweise für eine Multiplikation in einem Galoisfeld beschrieben:
c(x) = (a(x) * b(x)) mod x8 + x4 + x3 + x + 1
Wenn ich also folgende Zahlen habe: 0x57 * 0x83, dann mache ich doch:
(0x57 * 0x83) mod 0x11b = 4DAber in der Doku steht 0x57 * 0x83 = 0xC1
Ich blicke einfach nicht durch!
-
Du bist sicher, daß Du richtig multipliziert hast? Polynommultiplikation? Schreib Dir die Elemente mal als Polynome hin und rechne dann.
-
Wie, was jetzt?
Polinome sind doch bloss eine andere Darstellung?Bspw.:
Dez: 283
Hex: 0x11b
Bin: 100011011
Poly: x8 + x4 + x3 + x + 1Was hat denn dies mit der multiplikation zu tun?
-
Polynome werden anders multipliziert als gewöhnliche Zahlen.
Nochmal langsam und zum mitschreiben: GF(256) ist *kein* Z/nZ, Du kannst also nicht einfach normal rechnen und modulo irgendwas tun. Das funktioniert so nicht. Du mußt Dir die Elemente als Polynome hinschreiben und mit denen rechnen.
Beispiel: binär 11, Dezimal 3. Das quadrieren wir mal. In Z kommt 9 raus. In GF(256) ist das aber (x+1)^2 = x^2+2x+1, 2x ist aber 0, also x^2+1, das ist binär 101 oder auch, wenn Du's unebdingt dezimal haben möchtest(macht aber halt keinen Sinn) 5.
-
Ja, aber 3^2 ist doch nicht 5 sondern 9!
Dann stimmt doch schliesslich das Resultat nicht?
Was macht es dann für einen Sinn?
-
Ishildur schrieb:
Ja, aber 3^2 ist doch nicht 5 sondern 9!
In diesem Koerper schon.
-
In dem Körper gibt es keine 9. Rechne mit den Polynomen. Fertig. Normale Zahlen funktionieren in diesem Körper nicht. 1+1 ist dort 0 und deswegen ist 9=1, wenn man so will. Du mußt in die Polynomdarstellung wenn Du verstehen willst was da passiert.
-
Ich habe nun versucht, eine Funktion in Java zu schreiben, welche 2 Werte in einem GF(2^8) berechnet, aber das Resultat stimmt nicht?
Weiss jemand, was ich falsch berechne?
// --------------------------------------- method pmul --------------------------------------- private static byte pmul(byte va1,byte va2){ // declare and init local variables short rst = 0x00,tmp = 0x00; // start a loop for walking each bit for(byte i=0;i<8;++i){ // check if the current bit in the first value is set if((va1 & (0x01 << i)) != 0x00){ // copy the 2nd value into a temporary 16-Bit field and xor the shifted 2nd value tmp = va2; rst ^= (tmp << i); } } // return the result modulo an inreducible polynom of the 8th degree return (byte)(rst % 0x11b); } // -------------------------------------------------------------------------------------------
-
Dein modulo ist immer noch das modulo der ganzen Zahlen. Du mußt schon ne Polynomdivion machen und den Rest zurückgeben. Zumindest glaube ich das.
Hast Du mal ein Beispiel, das "falsch ausgerechnet" wird als Polynom hingeschrieben und von Hand berechnet, und dann den Debugger angeworfen?
-
Ach so, OK, alles klar!
Das letzte Problem ist nun nur noch, ein multiplikatives Inverses zu einem bestimmten Polynom zu berechnen. Also normalerweise ist ja z.B. das multiplikative Inverse von 3 einfach 1/3. Aber dies scheint ja hier wieder nicht zu funktionieren, da ja ein Galois Feld nur natürliche Zahlen enthalten darf. Ich habe in diesem Zusammenhang etwas von einem euklidischen Algorithmus gelesen, mit diesem kann man doch aber nur den grössten gemeinsamen Teiler berechnen:Ich habe mir das mal in Java geschrieben:
private static byte ggt(byte va1,byte va2){ while(va2 != 0x00){ byte tmp = (byte)(va1%va2); va1 = va2; va2 = tmp; } return va1; }
Aber wie ich damit ein multiplikatives Inverses einer bestimmten Zahl in einem Galois Feld als Polynom berechnen soll, ist mir schleierhaft...
Jemand eine Idee?
-
Such mal nach dem erweiterten euklidischen Algorithmus, der liefert Dir die Inverse. Denk aber dran, daß die Multiplikationen und modulos wieder im im richtigen Körper gerechnet werden müssen.
-
Ich bin mir noch nie so blöd vorgekommen, wie gerade nun! Ich verstehe überhaupt nichts! Das fängt schon mal damit an, dass ja der erweiterte euklidische Algorithmus zwei Eingabeparameter braucht, aber ich will ja nur das multiplikative Inverse zu EINEM Wert. Dazu kommt, dass da steht, dass es nicht für jede Zahl ein multiplikatives Inverses gibt, und da frage ich mich doch was das soll. Ich muss eben für jeden Wert zwischen 1 und 255 das multiplikative Inverse auf Polynombasis berechnen... geht das überhaupt?
Ich bin eigentlich normalerweise nicht so schwer von Begriff, aber diese vereinfachten Formeln, deren Herleitung ich nichtmal erahnen kann, verstehe ich einfach nicht! Und Formeln auswendig lernen, ohne sie wirklich zu verstehen, ist ja auch nicht das Wahre!
Gibt es denn keine Literatur, welche diese Dinge ein wenig veranschaulichen und nicht einfach Seitenweise Formeln und Gleichungen auflisten?
Lg Ishildur
-
Du hängst immer noch bei den Werten von 1 bis 255 fest. Vergiss das. In diesem Körper sind keine Zahlen so wie Du sie gewohnt bist.
a(X)*p(X)+b(X)*q(X) = 1
Der erweiterte euklidische Algorithmus liefert Dir zur Eingabe von p(X) und q(X) die beiden anderen Polynome a und b.
Okay, wie hilft uns das nun bei unserer Problemstellung?
Ganz einfach, wir rechnen doch in F_2[X]/(p(X)) für ein bestimmtes p (hatte oben schon jemand gepostet). Wenn Du also ein Elemente q(X) da invertieren möchtest, dann schmeißt Du den euklidischen Algorithmus an und kriegst a(X) und b(X) mit a(X)*p(X)+b(X)*q(X) = 1. Das schauen wir uns nun modulo p(X) an und siehe da, es wird zu b(X)*q(X)=1. Also ist q(X) Inverse. Daß das immer klappt liegt daran, daß p(X) prim ist und jedes Polynom, das in GF(256) nicht 0 ist damit teilerfremd zu p(X) ist und man das daher immer machen kann.
Weils vielleicht auf den ersten Blick etwas kompliziert aussieht, das wichtigste nochmal in Kürze:
GF(256)=F_2[X]/(p(X)), q(X) wollen wir dadrin invertieren.
- Schmeiße euklidischen Algorithmus mit p(X) und q(X) als Eingabe an, erhalte a(X) und b(X).
- b(X) in GF(256) reinstecken (kann sein, daß Du mod p(X) machen mußt).
- Das Ergebnis ist das Inverse zu q(X).
MfG Jester
-
@Jester
Also ich habe einen riesen Respekt, wie du das so einfach ohne Weiteres beschreiben kannst, aber ich verstehe wirklich überhaupt nichts! das liegt aber bestimmt nicht an deinen Ausführungen sondern an meinen mangelnden Kenntnissen:Bspw.
Ich weis nicht, was ein Polynom-Ring ist, ich kenne nicht die Bedeutung Teilerfremd und was ich am schlimmsten finde, ich habe immer noch nicht verstanden, wieso man mit einem Körper rechnet, in dem eigene Gesetze gelten, welche mit jenen, welche man in der Schule lernt, nicht vereinbahr sind...Ich möchte euch auch nicht auf der Pelle sitzen und ständig dumme Fragen stellen, sondern mir stattdessen das benötigte Wissen aneignen. Das Problem hierbei ist nur, dass ich im Internet keine geeignete Literatur finden kann. Alles, was ich finde, sind Vorlesungsscripts von diversen Universitäten, aus deren Ausführungen mir aber wiederum die Grundlagen fehlen.
Gibt es denn wirklich eine Literatur, wo diese Dingen samt Verwendungszweck und Aufbau umfassen und für einen Laien wie mich verständlich erklärt wird?
Lg Ishildur