AES - Unicamp
Transcrição
AES - Unicamp
O Cifrador AES Instituto de Computação - UNICAMP Julio López Disciplina MC889 O Algoritmo AES Julio López Disciplina MC889 O Algoritmo AES Advanced Encryption Standard (FIPS PUB 197) Julio López Disciplina MC889 O Algoritmo AES Advanced Encryption Standard (FIPS PUB 197) Cifrador de blocos Julio López Disciplina MC889 O Algoritmo AES Advanced Encryption Standard (FIPS PUB 197) Cifrador de blocos Tamanho dos blocos : 128 bits Julio López Disciplina MC889 O Algoritmo AES Advanced Encryption Standard (FIPS PUB 197) Cifrador de blocos Tamanho dos blocos : 128 bits Tamanho das chaves criptográficas: 128/ 192/ 256 bits Julio López Disciplina MC889 O Algoritmo AES Advanced Encryption Standard (FIPS PUB 197) Cifrador de blocos Tamanho dos blocos : 128 bits Tamanho das chaves criptográficas: 128/ 192/ 256 bits Número de etapas: 10/ 12/ 14 Rijndael (Vicent Rijmen e Joan Daemen), 1998. http://www.conxx.net/rijndael anim conxx.html Julio López Disciplina MC889 Um Byte! 10000100101010100010 1001 1011 0001010111000011 Julio López Disciplina MC889 Aritmética de Bytes Um byte: (b7 b6 b5 b4 b3 b2 b1 b0 ), bi ∈ {0, 1} (00001111), (1010 0011), (1100 0001), etc. Julio López Disciplina MC889 Aritmética de Bytes Um byte: (b7 b6 b5 b4 b3 b2 b1 b0 ), bi ∈ {0, 1} (00001111), (1010 0011), (1100 0001), etc. Em base hexadecimal (16), um byte é representado por dois dı́gitos: 1000 0011 = 0x83, 0111 1100 = 0x7c, etc. Julio López Disciplina MC889 Aritmética de Bytes Um byte: (b7 b6 b5 b4 b3 b2 b1 b0 ), bi ∈ {0, 1} (00001111), (1010 0011), (1100 0001), etc. Em base hexadecimal (16), um byte é representado por dois dı́gitos: 1000 0011 = 0x83, 0111 1100 = 0x7c, etc. Um byte pode ser interpretado como um polinômio binário de grau máximo 7: (10001111) = x 7 + x 3 + x 2 + x + 1, (00111100) = x 5 + x 4 + x 3 + x 2 . Julio López Disciplina MC889 Aritmética de Bytes Um byte: (b7 b6 b5 b4 b3 b2 b1 b0 ), bi ∈ {0, 1} (00001111), (1010 0011), (1100 0001), etc. Em base hexadecimal (16), um byte é representado por dois dı́gitos: 1000 0011 = 0x83, 0111 1100 = 0x7c, etc. Um byte pode ser interpretado como um polinômio binário de grau máximo 7: (10001111) = x 7 + x 3 + x 2 + x + 1, (00111100) = x 5 + x 4 + x 3 + x 2 . Soma e multiplicação de bytes? soma e multiplicação de polinômios binários (com coeficientes 0 e 1). Julio López Disciplina MC889 Aritmética de Bytes 7 X GF (28 ) = { ai x i , ai ∈ {0, 1}} i=0 Julio López Disciplina MC889 Aritmética de Bytes 7 X GF (28 ) = { ai x i , ai ∈ {0, 1}} i=0 P P Soma: A + B = 7i=0 ai x i + 7i=0 bi x i = P 7 i=0 (ai + bi mod 2) = A ⊕ B (xor). Julio López Disciplina MC889 Aritmética de Bytes 7 X GF (28 ) = { ai x i , ai ∈ {0, 1}} i=0 P P Soma: A + B = 7i=0 ai x i + 7i=0 bi x i = P 7 i=0 (ai + bi mod 2) = A ⊕ B (xor). P i 8 4 3 Multiplicação: A × B = 14 i=0 ci x mod x + x + x + x + 1. Julio López Disciplina MC889 Aritmética de Bytes 7 X GF (28 ) = { ai x i , ai ∈ {0, 1}} i=0 P P Soma: A + B = 7i=0 ai x i + 7i=0 bi x i = P 7 i=0 (ai + bi mod 2) = A ⊕ B (xor). P i 8 4 3 Multiplicação: A × B = 14 i=0 ci x mod x + x + x + x + 1. (GF(28 ), +, ×): estrutura algébrica chamada: corpo finito binário. Julio López Disciplina MC889 Multiplicação de Bytes A · B ∈ GF (28 ) Julio López Disciplina MC889 Multiplicação de Bytes A · B ∈ GF (28 ) A · B = (a7 x 7 + · · · + a2 x 2 + a1 x + a0 ) · B Julio López Disciplina MC889 Multiplicação de Bytes A · B ∈ GF (28 ) A · B = (a7 x 7 + · · · + a2 x 2 + a1 x + a0 ) · B = a7 (x 7 B) + · · · + a2 (x 2 B) + a1 (xB) + a0 B Julio López Disciplina MC889 Multiplicação de Bytes A · B ∈ GF (28 ) A · B = (a7 x 7 + · · · + a2 x 2 + a1 x + a0 ) · B = a7 (x 7 B) + · · · + a2 (x 2 B) + a1 (xB) + a0 B = x(· · · x(x(a7 B) + a6 B) + a5 B) · · · ) + a0 B Julio López Disciplina MC889 Multiplicação de Bytes A · B ∈ GF (28 ) A · B = (a7 x 7 + · · · + a2 x 2 + a1 x + a0 ) · B = a7 (x 7 B) + · · · + a2 (x 2 B) + a1 (xB) + a0 B = x(· · · x(x(a7 B) + a6 B) + a5 B) · · · ) + a0 B x ·B mod p(x) = x 8 + x 4 + x 3 + x + 1? Julio López Disciplina MC889 Multiplicação por x B = (1110 0011), p(x) = (100011011) x · B mod p(x) = x · (x 7 + x 6 + x 5 + x + 1) mod p(x) Julio López Disciplina MC889 Multiplicação por x B = (1110 0011), p(x) = (100011011) x · B mod p(x) = x · (x 7 + x 6 + x 5 + x + 1) mod p(x) = x 8 + x 7 + x 6 + x 2 + x mod p(x) Julio López Disciplina MC889 Multiplicação por x B = (1110 0011), p(x) = (100011011) x · B mod p(x) = x · (x 7 + x 6 + x 5 + x + 1) mod p(x) = x 8 + x 7 + x 6 + x 2 + x mod p(x) = (1 1100 0110) mod p(x) Julio López Disciplina MC889 Multiplicação por x B = (1110 0011), p(x) = (100011011) x · B mod p(x) = x · (x 7 + x 6 + x 5 + x + 1) mod p(x) = x 8 + x 7 + x 6 + x 2 + x mod p(x) = (1 1100 0110) mod p(x) = (1 1100 0110) ⊕ 1 0001 1011 Julio López Disciplina MC889 Multiplicação por x B = (1110 0011), p(x) = (100011011) x · B mod p(x) = x · (x 7 + x 6 + x 5 + x + 1) mod p(x) = x 8 + x 7 + x 6 + x 2 + x mod p(x) = (1 1100 0110) mod p(x) = (1 1100 0110) ⊕ 1 0001 1011 = 0 1101 1101. x ·B = (B << 1) ⊕ 00011011 se b7 = 1; (B << 1) se b7 = 0. Julio López Disciplina MC889 Multiplicação de Bytes Entrada: A, B ∈ GF (28 ), P(x) = x 8 + x 4 + x 3 + x + 1 Saı́da: C = A × B mod P(x) Julio López Disciplina MC889 Multiplicação de Bytes Entrada: A, B ∈ GF (28 ), P(x) = x 8 + x 4 + x 3 + x + 1 Saı́da: C = A × B mod P(x) A = (a7 a6 a5 · · · a1 a0 ); C = a7 B; for(i = 6; i >= 0; i--){ C = x · C mod P(x); C = C ⊕ ai B; } Julio López Disciplina MC889 Multiplicação de Bytes Entrada: A, B ∈ GF (28 ), P(x) = x 8 + x 4 + x 3 + x + 1 Saı́da: C = A × B mod P(x) A = (a7 a6 a5 · · · a1 a0 ); C = a7 B; for(i = 6; i >= 0; i--){ C = x · C mod P(x); C = C ⊕ ai B; } Exercı́cio: Calcular 0x8e · 0x4F. Julio López Disciplina MC889 Multiplicação de Bytes e Palavras C = A · B C3 |C2 |C1 |C0 = A3 |A2 |A1 |A0 · B3 |B2 |B1 |B0 Byte por Byte = Byte Palavra (32 bits) por Palavra (32 bits) = Palavra (32 bits) Julio López Disciplina MC889 Polinômios com Coeficientes em GF (28 ) A = a3 x 3 + a2 x 2 + a1 x + a0 , B = b3 x 3 + b2 x 2 b1 x + b0 Julio López Disciplina MC889 Polinômios com Coeficientes em GF (28 ) A = a3 x 3 + a2 x 2 + a1 x + a0 , B = b3 x 3 + b2 x 2 b1 x + b0 Soma: A + B = (a3 + b3 )x 3 + (a2 + b2 )x 2 + (a1 + b1 )x 1 + (a0 + b0 ) Julio López Disciplina MC889 Polinômios com Coeficientes em GF (28 ) A = a3 x 3 + a2 x 2 + a1 x + a0 , B = b3 x 3 + b2 x 2 b1 x + b0 Soma: A + B = (a3 + b3 )x 3 + (a2 + b2 )x 2 + (a1 + b1 )x 1 + (a0 + b0 ) Multiplicação: A × B = ? C = A × B = c6 x 6 + c5 x 5 + c4 x 4 + c3 x 3 + c2 x 2 + c1 x + c0 Julio López Disciplina MC889 Polinômios com Coeficientes em GF (28 ) A = a3 x 3 + a2 x 2 + a1 x + a0 , B = b3 x 3 + b2 x 2 b1 x + b0 Soma: A + B = (a3 + b3 )x 3 + (a2 + b2 )x 2 + (a1 + b1 )x 1 + (a0 + b0 ) Multiplicação: A × B = ? C = A × B = c6 x 6 + c5 x 5 + c4 x 4 + c3 x 3 + c2 x 2 + c1 x + c0 c0 c1 c2 c3 c4 c5 c6 = a0 • b0 = a1 • b0 ⊕ a0 • b1 = a2 • b0 ⊕ a1 • b1 ⊕ a0 • b2 = a3 • b0 ⊕ a2 • b1 ⊕ a1 • b2 ⊕ a0 • b3 = a3 • b1 ⊕ a2 • b2 ⊕ a1 • b3 = a3 • b2 ⊕ a2 • b3 = a3 • b3 Julio López Disciplina MC889 Polinômios com Coeficientes em GF (28 ) A ⊗ B := C mod x 4 + 1 = d3 x 3 + d2 x 2 + d1 x + d0 x x i mod x 4 + 1 = x i Julio López mod 4 Disciplina MC889 Polinômios com Coeficientes em GF (28 ) A ⊗ B := C mod x 4 + 1 = d3 x 3 + d2 x 2 + d1 x + d0 x x i mod x 4 + 1 = x i mod 4 d0 = (a0 • b0 ) ⊕ (a3 • b1 ) ⊕ (a2 • b2 ) ⊕ (a1 • b3 ) d1 = (a1 • b0 ) ⊕ (a0 • b1 ) ⊕ (a3 • b2 ) ⊕ (a2 • b3 ) d2 = (a2 • b0 ) ⊕ (a1 • b1 ) ⊕ (a0 • b2 ) ⊕ (a3 • b3 ) d3 = (a3 • b0 ) ⊕ (a2 • b1 ) ⊕ (a1 • b2 ) ⊕ (a0 • b3 ) Julio López Disciplina MC889 Polinômios com Coeficientes em GF (28 ) A ⊗ B := C mod x 4 + 1 = d3 x 3 + d2 x 2 + d1 x + d0 x d0 a0 d1 a1 d2 = a2 d3 a3 a3 a0 a1 a2 Julio López a2 a3 a0 a1 b0 a1 b1 a2 a3 b2 b3 a0 Disciplina MC889 Polinômios com Coeficientes em GF (28 ) - Encriptação D = {03}x 3 + {01}x 2 + {01}x + {02} ⊗ B d0 02 d1 01 d2 = 01 d3 03 03 02 01 01 Julio López 01 03 02 01 01 b0 b1 01 03 b2 02 b3 Disciplina MC889 Polinômios com Coeficientes em GF (28 ) - Decriptação D = {0b}x 3 + {0d}x 2 + {09}x + {0e} ⊗ B d0 0e 0b 0d 09 b0 d1 09 0e 0b 0d b1 d2 = 0d 09 02 0b b2 d3 0b 0d 09 0e b3 Julio López Disciplina MC889 O AES - o algoritmo chave K128 = (k0 , k1 , k2 , k3 , ..., k12 , k13 , k14 , k15 ) k0 k1 k2 k3 k4 k8 k5 k9 k6 k10 k7 k11 k12 k13 k14 k15 bloco B128 = (b0 , b1 , b2 , b3 , ..., b12 , b13 , b14 , b15 ) b0 b1 b2 b3 b4 b8 b5 b9 b6 b10 b7 b11 Julio López b12 b13 b14 b15 Disciplina MC889 O AES - algoritmo State = [b0 ...b15 ]4×4 Key = [k0 ...k15 ]4×4 AddRoundKey(State, RoundKey ); for i = 1 to Nr − 1 SubBytes(State); ShiftRows(State); MixColums(State); AddRoundKey(State, RoundKey ); SubBytes(State); ShiftRows(State); AddRoundKey(State, RoundKey ). Julio López Disciplina MC889 O AES Julio López Disciplina MC889 O AES em cores Julio López Disciplina MC889 Caixa-S S(x) := S(x) = 1 1 1 1 1 0 0 0 0 1 1 1 1 1 0 0 0 0 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 1 1 1 1 Ax −1 + b se x = 6 0; b se x = 0. 1 1 0 0 0 1 1 1 Julio López 1 1 1 0 0 0 1 1 1 1 1 1 0 0 0 1 x00 x10 x20 x30 x40 x50 x60 x70 Disciplina MC889 + 1 1 0 0 0 1 1 0 mod 2. Caixa-S- Tabela S[xy ] = linha x coluna y Julio López Disciplina MC889 SubBytes(State) Julio López Disciplina MC889 ShiftRows(State) Julio López Disciplina MC889 MixColumns(State) Julio López Disciplina MC889 AddRoundKey(State) Julio López Disciplina MC889 Escalonamento das chaves (128 bits) Entrada: constantes R[1], ..., R[10], e chave k[0], ..., k[15]. Saı́da: Subchaves Ki , i = 0, 1, ..., 10 Ki = (w [4i], w [4i + 1], w [4i + 2], w [4i + 3]). for i = 0 to 3 do w [i] ← (k[4i], k[4i + 1], k[4i + 2], k[4i + 3]) for i = 4 to 43 do temp ← w [i − 1] if i ≡ 0 (mod 4) then temp ← SubWord(RotWord(temp)) ⊕ R[i/4] w [i] ← w [i − 4] ⊕ temp Julio López Disciplina MC889 Escalonamento das chaves (128 bits) Julio López Disciplina MC889 Escalonamento das chaves (128 bits) V = [v0 , v1 , v2 , v3 ] V = SubWord(RotWord(V )) = [v10 , v20 , v30 , v00 ] v10 ← v10 ⊕ RC [i] Julio López Disciplina MC889 Escalonamento das chaves (192 bits) Julio López Disciplina MC889 Escalonamento das chaves (256 bits) Julio López Disciplina MC889 AES-desencriptação Julio López Disciplina MC889 AES-desencriptação Julio López Disciplina MC889 Instruções Intel para AES, 2010 Julio López Disciplina MC889 Instruções Intel para AES, 2010 AESENC AESENCLAST ASDEC AESDECLAST AESKEYGENASSIST AESIMC Julio López Disciplina MC889 Instruções Intel para AES, 2010 AESENC AESENCLAST ASDEC AESDECLAST AESKEYGENASSIST AESIMC AESENC xmm1, xmm2; Tmp = xmm1; RoundKey = xmm2; Tmp = ShiftRows(Tmp); Tmp = SubBytes(Tmp); Tmp = MixColumns(Tmp); xmm1 = Tmp xor RoundKey; Julio López Disciplina MC889 AES-128 com as instruções Intel Julio López Disciplina MC889 AES-128 com as instruções Intel ;O registro xmm15 contém o bloco de dados. ;Os registros xmm0,.., xmm10 contém as subchaves. ;No final, xmm15 contém o bloco encriptado. pxor xmm15, xmm0 ;Etapa 0 aesenc xmm15, xmm1 ;Etapa 1 aesenc xmm15, xmm2 ;Etapa 2 aesenc xmm15, xmm3 ;Etapa 3 aesenc xmm15, xmm4 ;Etapa 4 aesenc xmm15, xmm5 ;Etapa 5 aesenc xmm15, xmm6 ;Etapa 6 aesenc xmm15, xmm7 ;Etapa 7 aesenc xmm15, xmm8 ;Etapa 8 aesenc xmm15, xmm9 ;Etapa 9 aesenclast xmm15, xmm10 ;Etapa 10 Julio López Disciplina MC889