-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAES(core).coffee
106 lines (90 loc) · 5.32 KB
/
AES(core).coffee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
Encrypt_AES = (blocktext, keyx) ->
block = ToHex(blocktext)
key = ToHex(keyx)
ExpandKey(key)
Encrypt(block, key)
return ToStr(block)
Decrypt_AES = (blocktext, keyx) ->
block = ToHex(blocktext)
key = ToHex(keyx)
ExpandKey(key)
Decrypt(block, key)
return ToStr(block)
ExpandKey = (key) ->
kl = 16
ks = 16 * (10 + 1)
Rcon = 1
for i in [kl...ks] by 4
temp = key.slice(i - 4, i)
if i % kl == 0
temp = [sBox[temp[1]] ^ Rcon, sBox[temp[2]], sBox[temp[3]], sBox[temp[0]]]
if (Rcon <<= 1) >= 256
Rcon ^= 0x11B
key[i + j] = key[i + j - kl] ^ temp[j] for j in [0...4]
Encrypt = (block, key) ->
l = key.length
AddRoundKey(block, key.slice(0, 16))
for i in [16...l-16] by 16
SubBytes(block, sBox)
ShiftRows(block, ShiftRowTab)
MixColumns(block)
AddRoundKey(block, key.slice(i, i + 16))
SubBytes(block, sBox)
ShiftRows(block, ShiftRowTab)
AddRoundKey(block, key.slice(i, l))
Decrypt = (block, key) ->
l = key.length
AddRoundKey(block, key.slice(l - 16, l))
ShiftRows(block, ShiftRowTabInv)
SubBytes(block, sBoxInv)
for i in [l-32...15] by -16
AddRoundKey(block, key.slice(i, i + 16))
MixColumnsInv(block)
ShiftRows(block, ShiftRowTabInv)
SubBytes(block, sBoxInv)
AddRoundKey(block, key.slice(0, 16))
SubBytes = (state, sbox) ->
state[i] = sbox[state[i]] for i in [0...16]
AddRoundKey = (state, rkey) ->
state[i] ^= rkey[i] for i in [0...16]
ShiftRows = (state, shifttab) ->
h = new Array().concat(state)
state[i] = h[shifttab[i]] for i in [0...16]
MixColumns = (state) ->
for i in [0...16] by 4
s0 = state[i + 0]
s1 = state[i + 1]
s2 = state[i + 2]
s3 = state[i + 3]
h = s0 ^ s1 ^ s2 ^ s3
state[i + 0] ^= h ^ xtime[s0 ^ s1]
state[i + 1] ^= h ^ xtime[s1 ^ s2]
state[i + 2] ^= h ^ xtime[s2 ^ s3]
state[i + 3] ^= h ^ xtime[s3 ^ s0]
MixColumnsInv = (state) ->
for i in [0...16] by 4
s0 = state[i + 0]
s1 = state[i + 1]
s2 = state[i + 2]
s3 = state[i + 3]
h = s0 ^ s1 ^ s2 ^ s3
xh = xtime[h]
h1 = xtime[xtime[xh ^ s0 ^ s2]] ^ h
h2 = xtime[xtime[xh ^ s1 ^ s3]] ^ h
state[i + 0] ^= h1 ^ xtime[s0 ^ s1]
state[i + 1] ^= h2 ^ xtime[s1 ^ s2]
state[i + 2] ^= h1 ^ xtime[s2 ^ s3]
state[i + 3] ^= h2 ^ xtime[s3 ^ s0]
ToHex = (string) ->
block = new Array(16)
block[i] = parseInt(string[i].charCodeAt().toString(10), 10) for i in [0...string.length]
return block
ToStr = (block) ->
string = new String("")
string += String.fromCharCode(parseInt(block[i], 10)) for i in [0...block.length]
return string
ShiftRowTab = new Array(0,5,10,15,4,9,14,3,8,13,2,7,12,1,6,11)
ShiftRowTabInv = new Array(0,13,10,7,4,1,14,11,8,5,2,15,12,9,6,3)
sBox = new Array(99,124,119,123,242,107,111,197,48,1,103,43,254,215,171,118,202,130,201,125,250,89,71,240,173,212,162,175,156,164,114,192,183,253,147,38,54,63,247,204,52,165,229,241,113,216,49,21,4,199,35,195,24,150,5,154,7,18,128,226,235,39,178,117,9,131,44,26,27,110,90,160,82,59,214,179,41,227,47,132,83,209,0,237,32,252,177,91,106,203,190,57,74,76,88,207,208,239,170,251,67,77,51,133,69,249,2,127,80,60,159,168,81,163,64,143,146,157,56,245,188,182,218,33,16,255,243,210,205,12,19,236,95,151,68,23,196,167,126,61,100,93,25,115,96,129,79,220,34,42,144,136,70,238,184,20,222,94,11,219,224,50,58,10,73,6,36,92,194,211,172,98,145,149,228,121,231,200,55,109,141,213,78,169,108,86,244,234,101,122,174,8,186,120,37,46,28,166,180,198,232,221,116,31,75,189,139,138,112,62,181,102,72,3,246,14,97,53,87,185,134,193,29,158,225,248,152,17,105,217,142,148,155,30,135,233,206,85,40,223,140,161,137,13,191,230,66,104,65,153,45,15,176,84,187,22)
sBoxInv = new Array(82,9,106,213,48,54,165,56,191,64,163,158,129,243,215,251,124,227,57,130,155,47,255,135,52,142,67,68,196,222,233,203,84,123,148,50,166,194,35,61,238,76,149,11,66,250,195,78,8,46,161,102,40,217,36,178,118,91,162,73,109,139,209,37,114,248,246,100,134,104,152,22,212,164,92,204,93,101,182,146,108,112,72,80,253,237,185,218,94,21,70,87,167,141,157,132,144,216,171,0,140,188,211,10,247,228,88,5,184,179,69,6,208,44,30,143,202,63,15,2,193,175,189,3,1,19,138,107,58,145,17,65,79,103,220,234,151,242,207,206,240,180,230,115,150,172,116,34,231,173,53,133,226,249,55,232,28,117,223,110,71,241,26,113,29,41,197,137,111,183,98,14,170,24,190,27,252,86,62,75,198,210,121,32,154,219,192,254,120,205,90,244,31,221,168,51,136,7,199,49,177,18,16,89,39,128,236,95,96,81,127,169,25,181,74,13,45,229,122,159,147,201,156,239,160,224,59,77,174,42,245,176,200,235,187,60,131,83,153,97,23,43,4,126,186,119,214,38,225,105,20,99,85,33,12,125)
xtime = new Array(0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,200,202,204,206,208,210,212,214,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,248,250,252,254,27,25,31,29,19,17,23,21,11,9,15,13,3,1,7,5,59,57,63,61,51,49,55,53,43,41,47,45,35,33,39,37,91,89,95,93,83,81,87,85,75,73,79,77,67,65,71,69,123,121,127,125,115,113,119,117,107,105,111,109,99,97,103,101,155,153,159,157,147,145,151,149,139,137,143,141,131,129,135,133,187,185,191,189,179,177,183,181,171,169,175,173,163,161,167,165,219,217,223,221,211,209,215,213,203,201,207,205,195,193,199,197,251,249,255,253,243,241,247,245,235,233,239,237,227,225,231,229)