-
Notifications
You must be signed in to change notification settings - Fork 0
/
AES_lookup.py
249 lines (225 loc) · 21.2 KB
/
AES_lookup.py
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
import numpy as np
import time
import AES as aes
import random
#导入非查表AES
#声明全局变量
Enc_time = 0 #加密时间
Dec_time = 0 #解密时间
#加密T表
T_table_enc = [[0, 0, 0, 0], [2, 1, 1, 3], [4, 2, 2, 6], [6, 3, 3, 5], [8, 4, 4, 12], [10, 5, 5, 15], [12, 6, 6, 10], [14, 7, 7, 9], [16, 8, 8, 24], [18, 9, 9, 27], [20, 10, 10, 30], [22, 11, 11, 29], [24, 12, 12, 20], [26, 13, 13, 23], [28, 14, 14, 18], [30, 15, 15, 17], [32, 16, 16, 48], [34, 17, 17, 51], [36, 18, 18, 54], [38, 19, 19, 53], [40, 20, 20, 60], [42, 21, 21, 63], [44, 22, 22, 58], [46, 23, 23, 57], [48, 24, 24, 40], [50, 25, 25, 43], [52, 26, 26, 46], [54, 27, 27, 45], [56, 28, 28, 36], [58,
29, 29, 39], [60, 30, 30, 34], [62, 31, 31, 33], [64, 32, 32, 96], [66, 33, 33, 99], [68, 34, 34, 102], [70, 35, 35, 101], [72, 36, 36, 108], [74, 37, 37, 111], [76,
38, 38, 106], [78, 39, 39, 105], [80, 40, 40, 120], [82, 41, 41, 123], [84, 42, 42, 126], [86, 43, 43, 125], [88, 44, 44, 116], [90, 45, 45, 119], [92, 46, 46, 114],
[94, 47, 47, 113], [96, 48, 48, 80], [98, 49, 49, 83], [100, 50, 50, 86], [102, 51, 51, 85], [104, 52, 52, 92], [106, 53, 53, 95], [108, 54, 54, 90], [110, 55, 55, 89], [112, 56, 56, 72], [114, 57, 57, 75], [116, 58, 58, 78], [118, 59, 59, 77], [120, 60, 60, 68], [122, 61, 61, 71], [124, 62, 62, 66], [126, 63, 63, 65], [128, 64, 64, 192], [130, 65, 65, 195], [132, 66, 66, 198], [134, 67, 67, 197], [136, 68, 68, 204], [138, 69, 69, 207], [140, 70, 70, 202], [142, 71, 71, 201], [144, 72, 72, 216], [146, 73, 73, 219], [148, 74, 74, 222], [150, 75, 75, 221], [152, 76, 76, 212], [154, 77, 77, 215], [156, 78, 78, 210], [158, 79, 79, 209], [160, 80, 80, 240], [162, 81, 81, 243], [164, 82, 82, 246], [166, 83, 83, 245], [168, 84, 84, 252], [170, 85, 85, 255], [172, 86, 86, 250], [174, 87, 87, 249], [176, 88, 88, 232], [178, 89, 89, 235], [180, 90, 90, 238], [182, 91, 91, 237], [184, 92, 92, 228], [186, 93, 93, 231], [188, 94, 94, 226], [190, 95, 95, 225], [192, 96, 96, 160], [194, 97, 97, 163], [196, 98, 98, 166], [198, 99, 99, 165], [200, 100, 100, 172], [202, 101, 101, 175], [204, 102, 102, 170], [206, 103, 103, 169], [208, 104, 104, 184], [210, 105,
105, 187], [212, 106, 106, 190], [214, 107, 107, 189], [216, 108, 108, 180], [218, 109, 109, 183], [220, 110, 110, 178], [222, 111, 111, 177], [224, 112, 112, 144], [226, 113, 113, 147], [228, 114, 114, 150], [230, 115, 115, 149], [232, 116, 116, 156], [234, 117, 117, 159], [236, 118, 118, 154], [238, 119, 119, 153], [240, 120, 120, 136], [242, 121, 121, 139], [244, 122, 122, 142], [246, 123, 123, 141], [248, 124, 124, 132], [250, 125, 125, 135], [252, 126, 126, 130], [254, 127, 127, 129], [27, 128, 128, 155], [25, 129, 129, 152], [31, 130, 130, 157], [29, 131, 131, 158], [19, 132, 132, 151], [17, 133, 133, 148], [23, 134, 134, 145], [21, 135, 135, 146], [11, 136, 136, 131], [9, 137, 137, 128], [15, 138, 138, 133], [13, 139, 139, 134], [3, 140, 140, 143], [1, 141, 141, 140], [7, 142, 142, 137], [5, 143, 143, 138], [59, 144, 144, 171], [57, 145, 145, 168], [63, 146, 146, 173], [61, 147, 147, 174], [51, 148, 148, 167], [49, 149, 149, 164], [55, 150, 150, 161], [53, 151, 151, 162], [43, 152, 152, 179], [41, 153, 153, 176], [47, 154, 154, 181], [45, 155, 155, 182], [35, 156, 156, 191], [33, 157, 157, 188], [39, 158, 158, 185], [37, 159, 159, 186],
[91, 160, 160, 251], [89, 161, 161, 248], [95, 162, 162, 253], [93, 163, 163, 254], [83, 164, 164, 247], [81, 165, 165, 244], [87, 166, 166, 241], [85, 167, 167, 242], [75, 168, 168, 227], [73, 169, 169, 224], [79, 170, 170, 229], [77, 171, 171, 230], [67, 172, 172, 239], [65, 173, 173, 236], [71, 174, 174, 233], [69, 175, 175, 234], [123, 176, 176, 203], [121, 177, 177, 200], [127, 178, 178, 205], [125, 179, 179, 206], [115, 180, 180, 199], [113, 181, 181, 196], [119, 182, 182, 193], [117, 183, 183, 194], [107, 184, 184, 211], [105, 185, 185, 208], [111, 186, 186, 213], [109, 187, 187, 214], [99, 188, 188, 223], [97, 189, 189, 220], [103, 190, 190, 217],
[101, 191, 191, 218], [155, 192, 192, 91], [153, 193, 193, 88], [159, 194, 194, 93], [157, 195, 195, 94], [147, 196, 196, 87], [145, 197, 197, 84], [151, 198, 198, 81], [149, 199, 199, 82], [139, 200, 200, 67], [137, 201, 201, 64], [143, 202, 202, 69], [141, 203, 203, 70], [131, 204, 204, 79], [129, 205, 205, 76], [135, 206, 206,
73], [133, 207, 207, 74], [187, 208, 208, 107], [185, 209, 209, 104], [191, 210, 210, 109], [189, 211, 211, 110], [179, 212, 212, 103], [177, 213, 213, 100], [183, 214, 214, 97], [181, 215, 215, 98], [171, 216, 216, 115], [169, 217, 217, 112], [175, 218, 218, 117], [173, 219, 219, 118], [163, 220, 220, 127], [161, 221, 221, 124],
[167, 222, 222, 121], [165, 223, 223, 122], [219, 224, 224, 59], [217, 225, 225, 56], [223, 226, 226, 61], [221, 227, 227, 62], [211, 228, 228, 55], [209, 229, 229, 52], [215, 230, 230, 49], [213, 231, 231, 50], [203, 232, 232, 35], [201, 233, 233, 32], [207, 234, 234, 37], [205, 235, 235, 38], [195, 236, 236, 47], [193, 237, 237, 44], [199, 238, 238, 41], [197, 239, 239, 42], [251, 240, 240, 11], [249, 241, 241, 8], [255, 242, 242, 13], [253, 243, 243, 14], [243, 244, 244, 7], [241, 245, 245, 4], [247, 246, 246, 1], [245, 247, 247, 2], [235, 248, 248, 19], [233, 249, 249, 16], [239, 250, 250, 21], [237, 251, 251, 22], [227, 252, 252, 31], [225, 253, 253,
28], [231, 254, 254, 25], [229, 255, 255, 26]]
#解密T表
T_table_dec = [[0, 0, 0, 0], [14, 9, 13, 11], [28, 18, 26, 22], [18, 27, 23, 29], [56, 36, 52, 44], [54, 45, 57, 39], [36, 54, 46, 58], [42, 63, 35, 49], [112, 72, 104, 88], [126,
65, 101, 83], [108, 90, 114, 78], [98, 83, 127, 69], [72, 108, 92, 116], [70, 101, 81, 127], [84, 126, 70, 98], [90, 119, 75, 105], [224, 144, 208, 176], [238, 153, 221, 187], [252, 130, 202, 166], [242, 139, 199, 173], [216, 180, 228, 156], [214, 189, 233, 151], [196, 166, 254, 138], [202, 175, 243, 129], [144, 216, 184, 232], [158, 209, 181, 227], [140, 202, 162, 254], [130, 195, 175, 245], [168, 252, 140, 196], [166, 245, 129, 207], [180, 238, 150, 210], [186, 231, 155, 217], [219, 59, 187, 123], [213, 50, 182, 112], [199, 41, 161, 109], [201, 32, 172, 102], [227, 31, 143, 87], [237, 22, 130, 92], [255, 13, 149, 65], [241, 4, 152, 74], [171, 115, 211, 35], [165, 122, 222, 40], [183, 97, 201, 53], [185, 104, 196, 62], [147, 87, 231, 15], [157, 94, 234, 4], [143, 69, 253, 25], [129, 76, 240, 18], [59, 171, 107, 203],
[53, 162, 102, 192], [39, 185, 113, 221], [41, 176, 124, 214], [3, 143, 95, 231], [13, 134, 82, 236], [31, 157, 69, 241], [17, 148, 72, 250], [75, 227, 3, 147], [69,
234, 14, 152], [87, 241, 25, 133], [89, 248, 20, 142], [115, 199, 55, 191], [125, 206, 58, 180], [111, 213, 45, 169], [97, 220, 32, 162], [173, 118, 109, 246], [163,
127, 96, 253], [177, 100, 119, 224], [191, 109, 122, 235], [149, 82, 89, 218], [155, 91, 84, 209], [137, 64, 67, 204], [135, 73, 78, 199], [221, 62, 5, 174], [211, 55, 8, 165], [193, 44, 31, 184], [207, 37, 18, 179], [229, 26, 49, 130], [235, 19, 60, 137], [249, 8, 43, 148], [247, 1, 38, 159], [77, 230, 189, 70], [67, 239, 176, 77], [81, 244, 167, 80], [95, 253, 170, 91], [117, 194, 137, 106], [123, 203, 132, 97], [105, 208, 147, 124], [103, 217, 158, 119], [61, 174, 213, 30], [51, 167, 216, 21], [33, 188, 207, 8], [47, 181, 194, 3], [5, 138, 225, 50], [11, 131, 236, 57], [25, 152, 251, 36], [23, 145, 246, 47], [118, 77, 214, 141], [120, 68, 219, 134], [106, 95, 204, 155], [100, 86, 193, 144], [78, 105, 226, 161], [64, 96, 239, 170], [82, 123, 248, 183], [92, 114, 245, 188], [6, 5, 190, 213], [8, 12, 179, 222], [26, 23, 164, 195], [20, 30, 169, 200], [62, 33, 138, 249], [48, 40, 135, 242], [34, 51, 144, 239], [44, 58, 157, 228], [150, 221, 6, 61], [152, 212, 11, 54], [138, 207, 28, 43], [132, 198, 17, 32], [174, 249, 50, 17], [160, 240, 63, 26], [178, 235, 40, 7], [188, 226, 37, 12], [230, 149, 110, 101], [232, 156, 99, 110], [250, 135, 116, 115], [244, 142, 121, 120], [222, 177, 90, 73], [208, 184, 87, 66], [194, 163, 64, 95], [204, 170, 77, 84], [65, 236, 218, 247], [79, 229, 215, 252], [93, 254, 192, 225], [83, 247, 205, 234], [121, 200, 238, 219], [119, 193, 227, 208], [101, 218, 244, 205], [107, 211, 249, 198], [49, 164, 178, 175], [63, 173, 191, 164], [45, 182, 168, 185], [35, 191, 165, 178], [9, 128, 134, 131], [7, 137, 139, 136], [21, 146, 156, 149], [27, 155, 145, 158], [161, 124, 10, 71], [175, 117, 7, 76], [189, 110, 16,
81], [179, 103, 29, 90], [153, 88, 62, 107], [151, 81, 51, 96], [133, 74, 36, 125], [139, 67, 41, 118], [209, 52, 98, 31], [223, 61, 111, 20], [205, 38, 120, 9], [195, 47, 117, 2], [233, 16, 86, 51], [231, 25, 91, 56], [245, 2, 76, 37], [251, 11, 65, 46], [154, 215, 97, 140], [148, 222, 108, 135], [134, 197, 123, 154], [136, 204,
118, 145], [162, 243, 85, 160], [172, 250, 88, 171], [190, 225, 79, 182], [176, 232, 66, 189], [234, 159, 9, 212], [228, 150, 4, 223], [246, 141, 19, 194], [248, 132, 30, 201], [210, 187, 61, 248], [220, 178, 48, 243], [206, 169, 39, 238], [192, 160, 42, 229], [122, 71, 177, 60], [116, 78, 188, 55], [102, 85, 171, 42], [104, 92, 166, 33], [66, 99, 133, 16], [76, 106, 136, 27], [94, 113, 159, 6], [80, 120, 146, 13], [10, 15, 217, 100], [4, 6, 212, 111], [22, 29, 195, 114], [24, 20, 206, 121], [50, 43, 237, 72], [60, 34, 224, 67], [46, 57, 247, 94], [32, 48, 250, 85], [236, 154, 183, 1], [226, 147, 186, 10], [240, 136, 173, 23], [254, 129, 160, 28], [212, 190, 131, 45], [218, 183, 142, 38], [200, 172, 153, 59], [198, 165, 148, 48], [156, 210, 223, 89], [146, 219, 210, 82], [128, 192, 197, 79], [142, 201, 200, 68], [164,
246, 235, 117], [170, 255, 230, 126], [184, 228, 241, 99], [182, 237, 252, 104], [12, 10, 103, 177], [2, 3, 106, 186], [16, 24, 125, 167], [30, 17, 112, 172], [52, 46, 83, 157], [58, 39, 94, 150], [40, 60, 73, 139], [38, 53, 68, 128], [124, 66, 15, 233], [114, 75, 2, 226], [96, 80, 21, 255], [110, 89, 24, 244], [68, 102, 59, 197], [74, 111, 54, 206], [88, 116, 33, 211], [86, 125, 44, 216], [55, 161, 12, 122], [57, 168, 1, 113], [43, 179, 22, 108], [37, 186, 27, 103], [15, 133, 56, 86], [1, 140, 53, 93], [19, 151, 34, 64], [29, 158, 47, 75], [71, 233, 100, 34], [73, 224, 105, 41], [91, 251, 126, 52], [85, 242, 115, 63], [127, 205, 80, 14], [113, 196, 93, 5], [99, 223, 74, 24], [109, 214, 71, 19], [215, 49, 220, 202], [217, 56, 209, 193], [203, 35, 198, 220], [197, 42, 203, 215], [239, 21, 232, 230], [225, 28, 229, 237], [243, 7, 242, 240], [253, 14, 255, 251], [167, 121, 180, 146], [169, 112, 185, 153], [187, 107, 174, 132], [181, 98, 163, 143], [159, 93, 128, 190], [145, 84, 141, 181], [131, 79, 154, 168], [141, 70, 151, 163]]
S_he_enc=np.array( #加密的S盒
[[0x63,0x7C,0x77,0x7B,0xF2,0x6B,0x6F,0xC5,0x30,0x01,0x67,0x2B,0xFE,0xD7,0xAB,0x76],
[0xCA,0x82,0xC9,0x7D,0xFA,0x59,0x47,0xF0,0xAD,0xD4,0xA2,0xAF,0x9C,0xA4,0x72,0xC0],
[0xB7,0xFD,0x93,0x26,0x36,0x3F,0xF7,0xCC,0x34,0xA5,0xE5,0xF1,0x71,0xD8,0x31,0x15],
[0x04,0xC7,0x23,0xC3,0x18,0x96,0x05,0x9A,0x07,0x12,0x80,0xE2,0xEB,0x27,0xB2,0x75],
[0x09,0x83,0x2C,0x1A,0x1B,0x6E,0x5A,0xA0,0x52,0x3B,0xD6,0xB3,0x29,0xE3,0x2F,0x84],
[0x53,0xD1,0x00,0xED,0x20,0xFC,0xB1,0x5B,0x6A,0xCB,0xBE,0x39,0x4A,0x4C,0x58,0xCF],
[0xD0,0xEF,0xAA,0xFB,0x43,0x4D,0x33,0x85,0x45,0xF9,0x02,0x7F,0x50,0x3C,0x9F,0xA8],
[0x51,0xA3,0x40,0x8F,0x92,0x9D,0x38,0xF5,0xBC,0xB6,0xDA,0x21,0x10,0xFF,0xF3,0xD2],
[0xCD,0x0C,0x13,0xEC,0x5F,0x97,0x44,0x17,0xC4,0xA7,0x7E,0x3D,0x64,0x5D,0x19,0x73],
[0x60,0x81,0x4F,0xDC,0x22,0x2A,0x90,0x88,0x46,0xEE,0xB8,0x14,0xDE,0x5E,0x0B,0xDB],
[0xE0,0x32,0x3A,0x0A,0x49,0x06,0x24,0x5C,0xC2,0xD3,0xAC,0x62,0x91,0x95,0xE4,0x79],
[0xE7,0xC8,0x37,0x6D,0x8D,0xD5,0x4E,0xA9,0x6C,0x56,0xF4,0xEA,0x65,0x7A,0xAE,0x08],
[0xBA,0x78,0x25,0x2E,0x1C,0xA6,0xB4,0xC6,0xE8,0xDD,0x74,0x1F,0x4B,0xBD,0x8B,0x8A],
[0x70,0x3E,0xB5,0x66,0x48,0x03,0xF6,0x0E,0x61,0x35,0x57,0xB9,0x86,0xC1,0x1D,0x9E],
[0xE1,0xF8,0x98,0x11,0x69,0xD9,0x8E,0x94,0x9B,0x1E,0x87,0xE9,0xCE,0x55,0x28,0xDF],
[0x8C,0xA1,0x89,0x0D,0xBF,0xE6,0x42,0x68,0x41,0x99,0x2D,0x0F,0xB0,0x54,0xBB,0x16]])
S_he_dec=np.array( #解密的S盒
[[0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB],
[0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB],
[0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E],
[0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25],
[0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92],
[0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84],
[0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06],
[0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B],
[0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73],
[0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E],
[0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B],
[0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4],
[0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F],
[0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF],
[0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61],
[0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D]]
)
# def Generate_Ttable(control):#生成T表,即列混合的查找表
# global T_table#使用global方便修改全局变量
# T_table = []
# if control == 0:#当control为0的时候,为加密过程
# text = [2,1,1,3]
# else:#当 control为1的时候,为解密过程
# text = [0x0e,0x09,0x0d,0x0b]
# #生成T表,存储每一个数与text乘法的结果
# for i in range(0,256):
# temp = []#存储数i的结果列表
# temp.append(aes.Mix_Multi(i,text[0]))
# temp.append(aes.Mix_Multi(i,text[1]))
# temp.append(aes.Mix_Multi(i,text[2]))
# temp.append(aes.Mix_Multi(i,text[3]))
# T_table.append(temp)
def KeyExpansion(plainText):
#该函数将生成的轮密钥按照列存放
#XorArr存储异或的列表
XorArr = [[0x01,0,0,0],[0x02,0,0,0],[0x04,0,0,0],[0x08,0,0,0],[0x10,0,0,0],[0x20,0,0,0],[0x40,0,0,0],[0x80,0,0,0],[0x1b,0,0,0],[0x36,0,0,0]]
list_key = [] #将密钥按列存储
for i in range(0,4):
sub_list_key = [plainText[0][i],plainText[1][i],plainText[2][i],plainText[3][i]] #一列
list_key.append(sub_list_key)
for i in range(4,44):
temp = list_key[i-1]#存储当前列的前一列信息
#如果当前列数是4的整数倍
#那么就先将当前列的前一列进行移位操作,然后再与异或列表进行异或操作,赋值给temp列
if i % 4 == 0:
#由于不希望前一列的移位将前一列信息打乱,即我们只需要移位后的列而原列保持不变,因此这里采用浅复制
temp = aes.Xor(Sub(aes.ShiftRows(temp.copy(),1,0),0),XorArr[i//4-1])
list_key.append(aes.Xor(list_key[i-4],temp))
#这里得到的密钥是按列存储的,而且是存储在一起的
#将轮密钥分割
roundKey = []#存储轮密钥
i = 0
while i <= 40:
temp = []
for j in range(0,4):
temp.append(list_key[i+j])
temp = [[row[i] for row in temp] for i in range(len(temp[0]))]#使用列表推导式将二维数组转置
roundKey.append(temp)
i = i + 4
return roundKey
def Sub(alist,control):#过S盒运算,传入的参数是一个列表,即按照一列一列进行查找替换
arrChanged = [] #存储过S盒之后的结果
#当control==0时,为加密;当control==1时,为解密
if control == 0:
S_he = S_he_enc
else:
S_he = S_he_dec
for i in range(0,4):
row=alist[i]//16
lie=alist[i] % 16
arrChanged.append(S_he[row][lie])
return arrChanged
def Search_T(num,k,control):#查表
#num参数是参与列混合的数
#k是num在所在列中的序号,用来进行移位操作
if control == 0:#当control为0时说明时加密
temp = T_table_enc[num].copy()#获取num与[2,1,1,3]的结果
result = []
for i in range(0,4):
result.append(temp[(i-k)%4])
#这里返回值的类型是numpy中的array,可以直接进行异或
return np.array(result)
else:
temp = T_table_dec[num].copy()#获取num与[e,b,d,9]的结果
result = []
for i in range(0,4):
result.append(temp[(i-k)%4])
#这里返回值的类型是numpy中的array,可以直接进行异或
return np.array(result)
def Mul_Columns(text,control):#查表的列混合
#获取text的每一列,即将text转置
text_T = np.array(text).T
result_T = []#列混合的结果的转置,即按列存放列混合的结果
for i in range(0,4):#分别对4列进行列混合
result_T.append((Search_T(text_T[i][0],0,control)^Search_T(text_T[i][1],1,control)^Search_T(text_T[i][2],2,control)^Search_T(text_T[i][3],3,control)).tolist())
#将四个元素查表的结果异或然后存入结果列表中
#由于Search_T函数的返回类型是array,因此要将结果用tolist转换为list
result = np.array(result_T).T
return result.tolist()#返回二维列表
def Enc_AES(plainText,key):#加密函数
global Enc_time #使用global声明Enc_time以修改全局变量
time_start = time.time()#记录开始时间
roundKey = KeyExpansion(key)#生成轮密钥
#异或主密钥
temp_Cipher = []#存储中间的加密结果
for i in range(0,4):
temp_Cipher.append(aes.Xor(plainText[i],key[i]))
#前九轮和第十轮的过程不同,第十轮加密不需要列混合
for i in range(0,10):
#过S盒
for j in range(0,4):
temp_Cipher[j] = Sub(temp_Cipher[j],0)
#左移位
for j in range(0,4):
temp_Cipher[j] = aes.ShiftRows(temp_Cipher[j],j,0)
#列混合,只有前九轮进行列混合
if i <= 8:
temp_Cipher = Mul_Columns(temp_Cipher,0)
#异或轮密钥
for j in range(0,4):
temp_Cipher[j] = aes.Xor(temp_Cipher[j],roundKey[i+1][j])
time_end = time.time()#记录一次加密结束时间
Enc_time += time_end - time_start #将一次加密的时间累加到总的加密时间中
return aes.Trans(temp_Cipher,3)
def Dec_AES(CipherText,key):
global Dec_time #使用global声明Dec_time以修改全局变量
time_start = time.time()#记录开始时间
roundKey = KeyExpansion(key)#生成轮密钥
temp_plain = []#存储中间的解密结果
#解密过程轮密钥逆用
#与轮密钥异或
for i in range(0,4):
temp_plain.append(aes.Xor(CipherText[i],roundKey[10][i]))
#前九轮和第十轮的过程不同,第十轮加密不需要列混合
for i in range(0,10):
#过S盒
for j in range(0,4):
temp_plain[j] = Sub(temp_plain[j],1)
#左移位
for j in range(0,4):
temp_plain[j] = aes.ShiftRows(temp_plain[j],j,1)
#异或轮密钥
for j in range(0,4):
temp_plain[j] = aes.Xor(temp_plain[j],roundKey[9-i][j])
#列混合,只有前九轮进行列混合
if i <= 8:
temp_plain = Mul_Columns(temp_plain,1)
time_end = time.time()#记录一次加密结束时间
Dec_time += time_end - time_start #将一次解密的时间累加到总的加密时间中
return aes.Trans(temp_plain,3)
def Generate_text():
text = ''#存储生成的十六进制数组成的字符串,长16个字节
#生成一个随机数,将其转换为十六进制之后存储到text中
for i in range(0,16):
num = random.randint(0,255)
text += hex(num)
return text
def test():#单次测试
plaintext = '0x680x650x6c0x6c0x6f0x200x770x6f0x720x6c0x640x200x730x640x750x71'
key = '1234567891234567'
ciphertext = '0x940x3a0x230x5c0xb60xcc0xa40x770x290x540x2b0x7d0x750x3f0xb40x4a'
cipher = Enc_AES(aes.Trans(plaintext,2),aes.Trans(key,1))
plain = Dec_AES(aes.Trans(ciphertext,2),aes.Trans(key,1))
print('既定明文:',plaintext)
print('加密后的密文:',cipher)
print('解密后的明文:',plain)
def timetest():#加解密时间测试
key = '1234567891234567'#确定密钥
for i in range(0,1000):
plaintext = Generate_text()#生成明文
ciphertext = Enc_AES(aes.Trans(plaintext,2),aes.Trans(key,1))#完成一次加密,并获取密文
Dec_AES(aes.Trans(ciphertext,2),aes.Trans(key,1))#完成一次解密
print('加密时间:',Enc_time)
print('解密时间:',Dec_time)
if __name__ == '__main__':
print("===============加解密算法正确性验证===============")
test()#加解密测试,测试加解密算法是否正确
print("===============1000次加解密所需时间===============")
timetest()#测试1000次加密和解密的时间