Die S-Box von Rijndael wird häufig bei der AES- Verschlüsselung und -Entschlüsselung eingesetzt. Es wird normalerweise als 256-Byte-Nachschlagetabelle implementiert. Das ist schnell, bedeutet aber, dass Sie eine 256-Byte-Nachschlagetabelle in Ihrem Code aufzählen müssen. Ich wette, jemand in dieser Menge könnte es mit weniger Code tun, angesichts der zugrunde liegenden mathematischen Struktur.
Schreiben Sie eine Funktion in Ihrer Lieblingssprache, die Rijndaels S-Box implementiert. Kürzester Code gewinnt.
code-golf
math
cryptography
Keith Randall
quelle
quelle
Antworten:
Ruby, 161 Zeichen
Um die Ausgabe zu überprüfen, können Sie den folgenden Code verwenden, um sie in tabellarischer Form auszudrucken:
quelle
GolfScript, 60 Zeichen
Dieser Code definiert eine benannte Funktion
S
, die ein Byte einnimmt und die Rijndael S-Box darauf anwendet. (Es wird auch eine interne Hilfsfunktion verwendetr
, um ein paar Zeichen zu speichern.)Diese Implementierung verwendet eine Logarithmentabelle, um die GF (2 8 ) -Inversen zu berechnen , wie von Thomas Pornin vorgeschlagen . Um einige Zeichen zu sparen, wird die gesamte Logarithmentabelle für jedes Eingangsbyte neu berechnet. Trotzdem, und obwohl GolfScript im Allgemeinen eine sehr langsame Sprache ist, benötigt dieser Code nur etwa 10 ms, um ein Byte auf meinem alten Laptop zu verarbeiten. Durch Vorberechnung der Logarithmentabelle (as
L
) wird eine Geschwindigkeit von bis zu 0,5 ms pro Byte erreicht, und dies zu moderaten Kosten von drei weiteren Zeichen:Der Einfachheit halber hier ein einfaches Testkabel, das
S
die oben definierte Funktion zum Berechnen und Ausdrucken der gesamten S-Box in hexadezimaler Form wie bei Wikipedia aufruft :Versuchen Sie diesen Code online.
(Die Online-Demo berechnet die Logarithmus-Tabelle vorab, um zu vermeiden, dass zu viel Zeit benötigt wird. Trotzdem kann es vorkommen, dass die Online-GolfScript-Site eine willkürliche Zeitüberschreitung aufweist. Dies ist ein bekanntes Problem, das in der Regel durch ein erneutes Laden behoben wird.)
Erläuterung:
Beginnen wir mit der Berechnung der Logarithmentabelle und speziell mit der Hilfsfunktion
r
:Diese Funktion belegt zwei Eingänge im Stack: ein Byte und eine Reduktionsbitmaske (eine Konstante zwischen 256 und 511). Es dupliziert das Eingangsbyte, multipliziert die Kopie mit 2 und wenn das Ergebnis 255 überschreitet, wird es mit der Bitmaske XOR-verknüpft, um es wieder unter 256 zu bringen.
Innerhalb des Protokolltabellen-Erzeugungscodes wird die Funktion
r
mit der Reduktionsbitmaske 283 = 0x11b (die dem Rijndael GF (2 8 ) -Reduktionspolynom x 8 + x 4 + x 3 + x + 1 entspricht) aufgerufen, und das Ergebnis ist XOR-verknüpft Multiplizieren Sie das ursprüngliche Byte mit 3 (= x + 1, als Polynom) im endlichen Rijndael-Feld. Diese Multiplikation wird ab Byte 1 255-mal wiederholt, und die Ergebnisse (plus ein anfängliches Null-Byte) werden in einem Array mit 257 Elementen gesammeltL
, das wie folgt aussieht (mittlerer Teil weggelassen):Der Grund, warum es 257 Elemente gibt, ist, dass wir mit der vorangestellten 0 und 1, die zweimal vorkommen, die modulare Inverse jedes gegebenen Bytes finden können, indem wir einfach seinen (nullbasierten) Index in diesem Array nachschlagen, ihn negieren und suchen up das Byte am negierten Index im gleichen Array. (In GolfScript, wie in vielen anderen Programmiersprachen, werden negative Array-Indizes vom Ende des Arrays an rückwärts gezählt.) In der Tat ist dies genau das, was der Code
L?~)L=
am Anfang der FunktionS
tut.Der Rest des Codes ruft die Hilfsfunktion
r
viermal mit der Reduzierungsbitmaske 257 = 2 8 + 1 auf, um vier bitgedrehte Kopien des invertierten Eingangsbytes zu erstellen. Diese werden zusammen mit der Konstanten 99 = 0x63 zu einem Array zusammengefasst und zusammen mit XOR-Verknüpfungen versehen, um die endgültige Ausgabe zu erhalten.quelle
x86-64 Maschinencode -
23 22 2019 BytesVerwendet den AES-NI-Befehlssatz
Verwendet Windows-Aufrufkonventionen, nimmt ein Byte auf und gibt ein Byte aus. Es ist nicht notwendig, das umzukehren,
ShiftRows
da es das erste Byte nicht beeinflusst.quelle
Die Tabelle kann ohne Berechnung von Inversen im endlichen Feld GF (256) unter Verwendung von Logarithmen erzeugt werden. Es würde so aussehen (Java-Code,
int
um Probleme mit dem signiertenbyte
Typ zu vermeiden ):Die Idee ist, dass 3 ein multiplikativer Generator von GF (256) * ist. Die Tabelle
t[]
ist so, dasst[x]
sie 3 x entspricht . da 3 255 = 1, erhalten wir das 1 / (3 x ) = 3 255-x .quelle
0x1B
(eine 1 im Hex-Literal) anstatt0x11B
int
Typ ist in Java 32-Bit. Ich muss das höhere Bit streichen.GolfScript (82 Zeichen)
Verwendet globale Variablen
A
undB
und erstellt die Funktion als globale VariableS
.Die Galois-Inversion ist rohe Gewalt; Ich experimentierte mit einer separaten
mul
Funktion, die für die affine Transformation nach der Inversion wiederverwendet werden konnte, die sich jedoch aufgrund des unterschiedlichen Überlaufverhaltens als teurer herausstellte.Dies ist zu langsam für eine Online-Demo - es würde sogar in den ersten beiden Zeilen der Tabelle eine Zeitüberschreitung auftreten.
quelle
Python, 176 Zeichen
Diese Antwort ist für Paŭlo Ebermanns Frage nach der Konstanthaltung der Zeit. Dieser Code passt zur Rechnung.
quelle
d
Dies kann die Nachschlagetabelle zur Kompilierungszeit generieren. Ich könnte einige einsparen, indem ich ubyte zu einem generischen Parameter mache
Bearbeiten direkt
ubyte
an ,ubyte
ohne Array - Lookups, keine Verzweigung und vollständig abrollbares Schlaufenedit2 hat @Thomas 'Algo zum Erstellen der Nachschlagetabelle verwendet
quelle
Stax , 53 Bytes
Führen Sie es aus und debuggen Sie es
Ich habe kein besonderes Verständnis für S-Boxen. Dies ist eine Konvertierung der (8 Jahre alten!) Lösung von Thomas Pornin .
quelle