
2008 рдореЗрдВ рдЗрдВрдЯреЗрд▓ рдиреЗ x86 рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рдирдИ рдЯреАрдореЛрдВ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджрд┐рдпрд╛, рдЬрд┐рд╕рдореЗрдВ рд╕рдордорд┐рдд рдПрдИрдПрд╕ (рдЙрдиреНрдирдд рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рд╕реНрдЯреИрдВрдбрд░реНрдб) рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд▓рд┐рдП рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ред рдПрдИрдПрд╕ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдмреНрд▓реЙрдХ рд╕рд┐рдлрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдПрдХ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЗрд╕ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо (рдУрдкрдирдПрд╕рдПрд╕рдПрд▓, рдж рдмреИрдЯ, рдЯреНрд░реВрдХреНрд░реЙрдлреНрдЯ
... ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреА рдЙрддреНрдкрд╛рджрдХрддрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдЯреАрдореЛрдВ рдХреЗ рдирдП рд╡рд┐рд╕реНрддрд╛рд░ рдХреЛ рдПрдИрдПрд╕-рдПрдирдЖрдИ рдирд╛рдо рдорд┐рд▓рд╛ред рдЗрд╕рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрджреЗрд╢ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
- рдПрдИрдПрд╕рдПрдирд╕реА - рдПрдИрдПрд╕ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХрд╛ рдПрдХ рд░рд╛рдЙрдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ,
- AESENCLAST- рдПрдИрдПрд╕ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рдЕрдВрддрд┐рдо рджреМрд░ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдХрд░реЗрдВ,
- AESDEC - AES рдХреЗ рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рдХрд╛ рдПрдХ рд░рд╛рдЙрдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ,
- AESDECLAST - AES рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рдЕрдВрддрд┐рдо рджреМрд░ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдХрд░реЗрдВ,
- AESKEYGENASSIST - AES рдЧреЛрд▓ рдХреБрдВрдЬреА рдХреА рдкреАрдврд╝реА рдореЗрдВ рдпреЛрдЧрджрд╛рди,
- рдПрдИрдПрд╕рдЖрдИрдПрдорд╕реА - рд░рд┐рд╡рд░реНрд╕ рдорд┐рдХреНрд╕ рдХреЙрд▓рдоред
рдЪреВрдВрдХрд┐ рдПрдИрдПрд╕ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рд╣рдо рдЗрди рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдПрдИрдПрд╕ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрди рдирд┐рд░реНрджреЗрд╢реЛрдВ рдореЗрдВ рдХреНрдпрд╛ рддрдВрддреНрд░ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдПрдИрдПрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо 4 рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:
- AddRound - XOR (рдЕрдирдиреНрдп рдпрд╛) рдПрдХ рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рд╕рдВрджреЗрд╢,
- SubBytes - рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╕рдорд╛рд░реЛрд╣,
- ShiftRows - рджрд┐рдП рдЧрдП рдирд┐рдпрдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмреНрд▓реЙрдХ рдореЗрдВ рдЦреЗрддреЛрдВ рдХреА рдЪрдХреНрд░реАрдп рдкрд╛рд░реА,
- MixColumns - рдорд┐рд╢реНрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ред
рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЦреБрдж рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

рд╢реБрд░реБрдЖрдд рд╣реЛ рд░рд╣реА рд╣реИ
рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рдПрдИрдПрд╕-рдПрдирдЖрдИ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдореМрдЬреВрдж рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡рд┐рд╢реЗрд╖ CPUID рдХрдорд╛рдВрдб рд╣реИ, рдЬреЛ рдХрд┐ рдореВрд▓реНрдп eax = 0x00000001 рдХреЗ рд╕рд╛рде, рд╡рд░реНрддрдорд╛рди рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ рдмрд┐рдЯреНрд╕ рд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдИрдПрд╕ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдИрд╕реАрдПрдХреНрд╕ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ 25 рдмрд┐рдЯреНрд╕ рд╣реИ:
рдПрдИрдПрд╕-рдПрдирдЖрдИ рд╕рддреНрдпрд╛рдкрди рдХреЛрдб:
mov eax,0x00000001; CPUID; test ecx,0x2000000; je L_no_AES;
рдпрджрд┐ рдмрд┐рдЯ 1 рдкрд░ рд╕реЗрдЯ рд╣реИ, рддреЛ рд╣рдо рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдкрд░ рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдореБрдЦреНрдп рдПрдХреНрд╕рдЯреЗрдВрд╢рди / ExpandKey
рдЫрджреНрдо рдХреЛрдб рдореЗрдВ рдкреНрд░рдореБрдЦ рд╡рд┐рд╕реНрддрд╛рд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
KeyExpansion(byte key[4*Nk], word w[Nb*(Nr+1)], Nk) begin word temp i = 0; while ( i < Nk) w[i] = word(key[4*i], key[4*i+1], key[4*i+2], key[4*i+3]) i = i+1 end while i = Nk while ( i < Nb * (Nr+1)) temp = w[i-1] if (i mod Nk = 0) temp = SubWord(RotWord(temp)) xor Rcon[i/Nk] else if (Nk > 6 and i mod Nk = 4) temp = SubWord(temp) end if w[i] = w[i-Nk] xor temp i = i + 1 end while end
рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╕рдорд░реНрдерди рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ AESKEYGENASSIST рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛:
AESKEYGENASSIST xmm1, xmm2/m128, imm8 Tmp := xmm2/LOAD(m128) X3[31-0] = Tmp[127-96]; X2[31-0] = Tmp[95-64]; X1[31-0] = Tmp[63-32]; X0[31-0] = Tmp[31-0]; RCON[7-0]:= imm8; RCON [31-8]:= 0; xmm1 :=[RotWord (SubWord (X3)) XOR RCON, SubWord (X3), RotWord (SubWord (X1)) XOR RCON, SubWord (X1)]
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдиреБрджреЗрд╢ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:
w[i] = w[i-Nk] xor temp
рдЖрдкрдХреЛ рдПрдордПрдордПрдХреНрд╕ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реНрд╡рдпрдВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдкреНрд░рдореБрдЦ рд╡рд┐рд╕реНрддрд╛рд░ 128b рдЙрджрд╛рд╣рд░рдг aeskeygenassist xmm2, xmm1, 0x1 ; 1 pshufd xmm2, xmm2, 0xff; movups xmm3, xmm4; pxor xmm2,xmm3; pshufd xmm2, xmm2, 0x00; pshufd xmm3, xmm3, 0x39; pslldq xmm3,0x4; pxor xmm2,xmm3; pshufd xmm2, xmm2, 0x14; pshufd xmm3, xmm3, 0x38; pslldq xmm3,0x4; pxor xmm2,xmm3; pshufd xmm2, xmm2, 0xA4; pshufd xmm3, xmm3, 0x34; pslldq xmm3,0x4; pxor xmm2,xmm3;
рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди / рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди
рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рдПрдХ рджреМрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, AESENC рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░рддрд╛ рд╣реИ:

AESENC xmm1, xmm2/m128 Tmp = xmm1 Round Key := xmm2/m128 Tmp = ShiftRows (Tmp) Tmp = SubBytes (Tmp) Tmp = MixColumns (Tmp) xmm1 = Tmp xor Round Key
рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХрд╛ рдЖрдЦрд┐рд░реА рджреМрд░ AESENCLAST рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
AESENC xmm1, xmm2/m128 Tmp = xmm1 Round Key := xmm2/m128 Tmp = ShiftRows (Tmp) Tmp = SubBytes (Tmp) xmm1 = Tmp xor Round Key
рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдФрд░ рдПрдИрдПрд╕рдПрдирд╕реА рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдВрддрд┐рдо рдЪрд░рдг рдореЗрдВ рдорд┐рдХреНрд╕рдХреЙрд▓рдореНрд╕ рдСрдкрд░реЗрд╢рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдЙрджрд╛рд╣рд░рдг aesenc xmm1, xmm2 ; aesenclast xmm1, xmm3;
рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди / рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди
рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдИрдПрд╕рдбреАрдИрд╕реА рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

AESDEC xmm1, xmm2/m128 Tmp = xmm1 Round Key = xmm2/m128 Tmp = InvShift Rows (Tmp) Tmp = InvSubBytes (Tmp) Tmp = InvMixColumns (Tmp) xmm1 = Tmp xor Round Key
InvKey рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреБрдВрдЬреА рдкрд░ InvMixClomuns рдСрдкрд░реЗрд╢рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдирд┐рд░реНрджреЗрд╢ AESIMC xmm1.xmm2 рд╣реИ
рдФрд░ рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рдЕрдВрддрд┐рдо рджреМрд░ рдХреЗ рд▓рд┐рдП, AESDECLAST рдЕрдиреБрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
AESDECLAST xmm1, xmm2/m128 State = xmm1 Round Key = xmm2/m128 Tmp = InvShift Rows (State) Tmp = InvSubBytes (Tmp) xmm1= Tmp xor RoundKey
рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рдЙрджрд╛рд╣рд░рдг aesmic xmm2,xmm2; aesdec xmm1, xmm2 ; aesdeclast xmm1, xmm3;
рддреЛ, рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╕рдорд░реНрдерди рд╣рдореЗрдВ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдЧрддрд┐ рдореЗрдВ рдПрдХ рд╕рднреНрдп рд╡реГрджреНрдзрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред рдкреЛрд╕реНрдЯ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ
рдПрдХ рд╕реА ++ рдХреНрд▓рд╛рд╕ рджреВрдВрдЧрд╛
рдЬреЛ рдИрд╕реАрдмреА рдореЛрдб рдореЗрдВ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдФрд░ рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рдСрдкрд░реЗрд╢рдВрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдПрдХ рдХреЛрд░ i5-3740 (3.2GHz) рдкрд░ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдЧрддрд┐
320MB / рд╕реЗрдХрдВрдб рдХреЗ рдмрд░рд╛рдмрд░ рд╣рд╛рд╕рд┐рд▓ рдХреА рдЧрдИ рдереА
рд╕рдВрджрд░реНрдн:
- рдЗрдВрдЯреЗрд▓ рдЙрдиреНрдирдд рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рд╕реНрдЯреИрдВрдбрд░реНрдб (рдПрдИрдПрд╕) рдирдП рдирд┐рд░реНрджреЗрд╢ рд╕реЗрдЯ
- рдПрдИрдПрд╕-рдПрдирдЖрдИ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рдорд░реНрдерди рд╕реВрдЪреА
- рдПрдИрдПрд╕-рдПрдирдЖрдИ рдХреЛрдбрд╛рдВрддрд░рдХ рдЖрд╡реЗрд╖рдг рдХреЗ рд╕рд╛рде рд╕реА ++ рд╡рд░реНрдЧ
- рдПрдирд┐рдорд╛рдХрд╛ рдХреИрд╕реЗ рдПрдИрдПрд╕ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
- рдПрдИрдПрд╕-рдПрдирдЖрдИ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рд▓реЗрдЦ рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ