Puncte:0

Generalizarea schimburilor circulare AES s-box în GF mai mare

drapel tf
Tom

Conform wikipediei:

https://en.wikipedia.org/wiki/Rijndael_S-box

AES face un lucru interesant (unde $<<<$ este o schimbare circulară):

$s = b \oplus (b \lll 1) \oplus (b \lll 2) \oplus (b \lll 3) \oplus (b \lll 4)$

iar acesta este egal cu ($\ori$ este înmulțirea în $GF(2^8)$):

$s = b \times 31 \mod 257$

Acest lucru oferă un pic de amestec ochiului meu. Să presupunem că am 128 de biți $x$ și $y$ și vreau să calculez ceva similar:

$x = y \oplus (y \lll 1) \oplus (y \lll 2) \oplus (y \lll 3) \oplus ... \oplus (y \lll 64)$

Pot să o fac mai repede folosind înmulțirea în $GF(2^{128}) \mod 2^{128}+1$? Nu cunosc teoria din spatele acestui lucru, așa că am două tipuri de multiplicatori pentru asta:

$2^{125}-1$

și

$2^{65}-1$

Cred că al doilea poate funcționa în același mod $GF(2^{128})$, aceasta este regula.Deci, există un număr similar pe care îl pot folosi? Care este acel număr?

EDITARE: Se pare că există o greșeală în articol și schimbarea circulară ar putea fi în altă direcție:

$s = b \oplus (b \ggg 1) \oplus (b \ggg 2) \oplus (b \ggg 3) \oplus (b \ggg 4)$

Oricum, putem generaliza? În acest document nu există nimic despre egalitatea cu multiplicarea GF a acelui pas:

https://csrc.nist.gov/csrc/media/publications/fips/197/final/documents/fips-197.pdf

Puncte:3
drapel sa

OK, problema deplasării la stânga versus la dreapta are legătură cu dacă variabila este reprezentată prin convenția „big-endian” sau „little-endian”, adică dacă bitul cel mai puțin semnificativ este în stânga sau în dreapta.

Operațiunea:

$$s = b \oplus (b \lll 1) \oplus (b \lll 2) \oplus (b \lll 3) \oplus (b \lll 4)$$

este echivalentă cu înmulțirea (unde este deplasarea $\ori x$ de mai jos)

$$ s(x)=b(x)(1+x+x^2+x^3+x^4)=b(x)\frac{x^5-1}{x-1} $$ dar din moment ce schimbarea la stânga se dublează, lasă $x=2,$ a obține $s(x)=(2^5-1)b(x).$ În orice caz, deplasarea ciclică este echivalentă cu operarea $\pmod x^n-1$ Unde $n$ este lungimea cuvântului în biți.

A doua ta operație este într-adevăr echivalentă cu înmulțirea cu $2^{65}-1.$

Deoarece pari suficient de capabil din punct de vedere matematic, aș sugera:

Citiți integral documentul „Propunerea AES” de Daemen și Rijmen pentru a vă familiariza cu aceste tipuri de operațiuni și reprezentări. Există și cartea Designul lui Rijndael de aceiaşi autori. Învățați despre interacțiunea dintre Câmpurile Galois din caracteristica 2, $GF(2^n)$ și inele întregi $\mathbb{Z}_{2^n-1}$ care poate fi de asemenea „descompus” în $\mathbb{Z}_{2^{n/2}-1} \times \mathbb{Z}_{2^{n/2}+1},$ când $n$ este chiar.Un alt loc de căutat este documentația privind designul SAFER-64 de către Jim Massey. Mai general, Transformele teoretice ale numerelor (NTT) care generalizează transformata Fourier rapidă.

Dacă aveți descompoziții recursive de tipul pe care l-am menționat mai sus, aveți implementări rapide. Cea mai simplă astfel de transformare este matricea Sylvester Hadamard utilizată în transformările rapide Walsh-Hadamard unde $n$ Produse Kronecker din aceeași matrice $H_2$ este folosit: $$ H_n =H_2 \otimes H_2 \otimes \cdots \otimes H_2 $$ cu $$ H_2=\left[\begin{array}{cc} +1 & +1 \ +1 & -1 \end{array} \right]. $$ Din moment ce aceasta este cel Transformată Fourier pentru spațiul vectorial binar $GF(2)^n=\{0,1\}^n$ în mod echivalent, rândurile matricei Hadamard de mai sus sunt caracterele de grup ale grupului aditiv al $(\mathbb{GF(2)^n},\oplus)$ totul are sens.

Oricum, lectură plăcută.

Tom avatar
drapel tf
Tom
Am a doua întrebare despre numărul 99. Bănuiesc că este vorba despre un fel de echilibrare a celei mai semnificative probleme de biți (dacă am dreptate, aceasta chiar ar putea fi o problemă), care sunt întotdeauna egale cu 1 în fiecare număr. Dar nu pot face un echivalent al acestui număr pentru exemplul meu. Știți de unde a venit numărul 99? Ce ar putea fi în GF(2^128)?
Tom avatar
drapel tf
Tom
Încerc să-l verific manual și asta nu funcționează pentru mine. Există o reducere cu un polinom sau x 31 este doar o multiplicare fără transport? În ambele cazuri se pare că nu funcționează. Să luăm b = 10000001. b
Tom avatar
drapel tf
Tom
L-am redus cu polinomul x^9+1. Și în sfârșit funcționează.
Puncte:1
drapel tf
Tom

Există ceva înșelător în articolul Wikipedia. Ei au scris:

$s = b \oplus (b \lll 1) \oplus (b \lll 2) \oplus (b \lll 3) \oplus (b \lll 4)$

Este egal cu:

$s = b \times 31 \mod 257$

Unde $\ori$ este înmulțirea polinomială a $b$ și $31$ luate ca matrice de biți. Dar $\mod 257$ nu este o operație modulo standard, este mod în $GF(2^8)$ și $257$ este de fapt polinom de forma $x^{9}+1$.

Putem vedea cu ușurință acea multiplicare fără transport a $b \times 31$ este egal cu:

$s = b \oplus (b \ll 1) \oplus (b \ll 2) \oplus (b \ll 3) \oplus (b \ll 4)$

în biți $7,6,5,4$, Unde $\ll$ este deplasare pe biți, nu sfift circular. Dar în exemplul Wikipedia și în AES există o schimbare circulară. Deci de unde vine circulara? Ea provine din reducerea prin polinom $x^9+1$. Acesta este modul în care funcționează înmulțirea cu reducerea polinomială $GF(2^8)$:

#include <cstdint>
#include <cstdio>
#include <set de biți>
#include<iostream>


uint8_t multiplica (uint a, uint b)
    {
        uint8_t p = 1;
        uint16_t L = 1;
        uint16_t c = 0;

        pentru (unsigned int i = 0; i < 8; ++i)
        {
            c ^= a & (L << i) ? (uint16_t)b << i : 0;
        }

        pentru (unsigned int i = 8; i-- > 0; )
        {
            dacă (c & (L << (i + 8)))
            {
                c ^= L << (i + 8);
                c ^= (uint16_t)p << i;
            }
        }

        return (uint8_t)c;
    }

int main()
{
    uint rezultat = 0;
    
    rezultat = multiplicare(131,31);
    std::cout << rezultat;
    
    întoarce 0;
}

Avem nevoie de polinom de grad $9$, dar putem defini polinomul reducător în implementare practică luând doar primul său $8$ biți cei mai puțin semnificativi, deci în cazul nostru $p=1$. Acum, dacă ne uităm cum funcționează multiplicarea fără transport (prima buclă), putem vedea asta în $7,6,5,4$ biți am obține același rezultat, ca și în cazul deplasărilor:

$s = b \oplus (b \ll 1) \oplus (b \ll 2) \oplus (b \ll 3) \oplus (b \ll 4)$

Dar în loc de biți $11,10,9,8$ vor fi exact biți deplasați (anulați) în procesul de deplasare pe biți. Acest lucru se datorează faptului că înmulțirea fără transport le mută spre stânga $1,2,3...$ poziții și apoi totul este xored. Ca aici:

introduceți descrierea imaginii aici

Din moment ce înmulțim cu $31$ am primi mereu $4$ biți suplimentari în jumătatea semnificativă mai mare a rezultatului nostru pe 16 biți. Și ar fi deranjați, pentru că așa funcționează înmulțirea fără transport. Deci acum avem bucăți $7,6,5,4$ egal cu rezultatul:

$s = b \oplus (b \ll 1) \oplus (b \ll 2) \oplus (b \ll 3) \oplus (b \ll 4)$

Și biți $11,10,9,8$, care ar putea fi în loc de biți $3,2,1,0$. Pentru a face o schimbare circulară, trebuie să facem doar xor înapoi acești biți. Aceasta se realizează prin:

pentru (unsigned int i = 8; i-- > 0; )
        {
            dacă (c & (L << (i + 8)))
            {
                c ^= L << (i + 8);
                c ^= (uint16_t)p << i;
            }
        }

Dacă $p=1$. Putem vedea că acest cod chiar verifică dacă există un pic egal cu $1$ pe poziția stângă $i$ din jumătatea noastră superioară, iar dacă este, atunci xor aceia bit cu bit $i$ pe jumătatea noastră de jos. Și tot acel algoritm este egal cu xoring cu deplasare circulară $\lll$:

$s = b \oplus (b \lll 1) \oplus (b \lll 2) \oplus (b \lll 3) \oplus (b \lll 4)$

Știind acest lucru, devine clar că acest tip de echivalență este valabil pentru oricare $GF(2^k)$, cu condiția să alegem $p=1$ (prin convenția codului postat) ca polinomul și multiplicatorul nostru egal cu $2^{\frac {k}{2}+1}+1$.

kelalaka avatar
drapel in
În $\LaTeX$ există `\ll \lll \gg` și `\ggg` pentru a produce $\ll, \quad \lll, \quad \gg \quad \text{ și } \quad \ggg$

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.