AesCipher
AES cipher implementation.
using System;
using System.Globalization;
namespace Renci.SshNet.Security.Cryptography.Ciphers
{
public sealed class AesCipher : BlockCipher
{
private const uint m1 = 2155905152;
private const uint m2 = 2139062143;
private const uint m3 = 27;
private int _rounds;
private uint[] _encryptionKey;
private uint[] _decryptionKey;
private uint C0;
private uint C1;
private uint C2;
private uint C3;
private static readonly byte[] S = new byte[256] {
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,
byte.MaxValue,
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
};
private static readonly byte[] Si = new byte[256] {
82,
9,
106,
213,
48,
54,
165,
56,
191,
64,
163,
158,
129,
243,
215,
251,
124,
227,
57,
130,
155,
47,
byte.MaxValue,
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
};
private static readonly byte[] rcon = new byte[30] {
1,
2,
4,
8,
16,
32,
64,
128,
27,
54,
108,
216,
171,
77,
154,
47,
94,
188,
99,
198,
151,
53,
106,
212,
179,
125,
250,
239,
197,
145
};
private static readonly uint[] T0 = new uint[256] {
2774754246,
2222750968,
2574743534,
2373680118,
234025727,
3177933782,
2976870366,
1422247313,
1345335392,
50397442,
2842126286,
2099981142,
436141799,
1658312629,
3870010189,
2591454956,
1170918031,
2642575903,
1086966153,
2273148410,
368769775,
3948501426,
3376891790,
200339707,
3970805057,
1742001331,
4255294047,
3937382213,
3214711843,
4154762323,
2524082916,
1539358875,
3266819957,
486407649,
2928907069,
1780885068,
1513502316,
1094664062,
49805301,
1338821763,
1546925160,
4104496465,
887481809,
150073849,
2473685474,
1943591083,
1395732834,
1058346282,
201589768,
1388824469,
1696801606,
1589887901,
672667696,
2711000631,
251987210,
3046808111,
151455502,
907153956,
2608889883,
1038279391,
652995533,
1764173646,
3451040383,
2675275242,
453576978,
2659418909,
1949051992,
773462580,
756751158,
2993581788,
3998898868,
4221608027,
4132590244,
1295727478,
1641469623,
3467883389,
2066295122,
1055122397,
1898917726,
2542044179,
4115878822,
1758581177,
0,
753790401,
1612718144,
536673507,
3367088505,
3982187446,
3194645204,
1187761037,
3653156455,
1262041458,
3729410708,
3561770136,
3898103984,
1255133061,
1808847035,
720367557,
3853167183,
385612781,
3309519750,
3612167578,
1429418854,
2491778321,
3477423498,
284817897,
100794884,
2172616702,
4031795360,
1144798328,
3131023141,
3819481163,
4082192802,
4272137053,
3225436288,
2324664069,
2912064063,
3164445985,
1211644016,
83228145,
3753688163,
3249976951,
1977277103,
1663115586,
806359072,
452984805,
250868733,
1842533055,
1288555905,
336333848,
890442534,
804056259,
3781124030,
2727843637,
3427026056,
957814574,
1472513171,
4071073621,
2189328124,
1195195770,
2892260552,
3881655738,
723065138,
2507371494,
2690670784,
2558624025,
3511635870,
2145180835,
1713513028,
2116692564,
2878378043,
2206763019,
3393603212,
703524551,
3552098411,
1007948840,
2044649127,
3797835452,
487262998,
1994120109,
1004593371,
1446130276,
1312438900,
503974420,
3679013266,
168166924,
1814307912,
3831258296,
1573044895,
1859376061,
4021070915,
2791465668,
2828112185,
2761266481,
937747667,
2339994098,
854058965,
1137232011,
1496790894,
3077402074,
2358086913,
1691735473,
3528347292,
3769215305,
3027004632,
4199962284,
133494003,
636152527,
2942657994,
2390391540,
3920539207,
403179536,
3585784431,
2289596656,
1864705354,
1915629148,
605822008,
4054230615,
3350508659,
1371981463,
602466507,
2094914977,
2624877800,
555687742,
3712699286,
3703422305,
2257292045,
2240449039,
2423288032,
1111375484,
3300242801,
2858837708,
3628615824,
84083462,
32962295,
302911004,
2741068226,
1597322602,
4183250862,
3501832553,
2441512471,
1489093017,
656219450,
3114180135,
954327513,
335083755,
3013122091,
856756514,
3144247762,
1893325225,
2307821063,
2811532339,
3063651117,
572399164,
2458355477,
552200649,
1238290055,
4283782570,
2015897680,
2061492133,
2408352771,
4171342169,
2156497161,
386731290,
3669999461,
837215959,
3326231172,
3093850320,
3275833730,
2962856233,
1999449434,
286199582,
3417354363,
4233385128,
3602627437,
974525996
};
private static readonly uint[] T1 = new uint[256] {
1667483301,
2088564868,
2004348569,
2071721613,
4076011277,
1802229437,
1869602481,
3318059348,
808476752,
16843267,
1734856361,
724260477,
4278118169,
3621238114,
2880130534,
1987505306,
3402272581,
2189565853,
3385428288,
2105408135,
4210749205,
1499050731,
1195871945,
4042324747,
2913812972,
3570709351,
2728550397,
2947499498,
2627478463,
2762232823,
1920132246,
3233848155,
3082253762,
4261273884,
2475900334,
640044138,
909536346,
1061125697,
4160222466,
3435955023,
875849820,
2779075060,
3857043764,
4059166984,
1903288979,
3638078323,
825320019,
353708607,
67373068,
3351745874,
589514341,
3284376926,
404238376,
2526427041,
84216335,
2593796021,
117902857,
303178806,
2155879323,
3806519101,
3958099238,
656887401,
2998042573,
1970662047,
151589403,
2206408094,
741103732,
437924910,
454768173,
1852759218,
1515893998,
2694863867,
1381147894,
993752653,
3604395873,
3014884814,
690573947,
3823361342,
791633521,
2223248279,
1397991157,
3520182632,
0,
3991781676,
538984544,
4244431647,
2981198280,
1532737261,
1785386174,
3419114822,
3200149465,
960066123,
1246401758,
1280088276,
1482207464,
3486483786,
3503340395,
4025468202,
2863288293,
4227591446,
1128498885,
1296931543,
859006549,
2240090516,
1162185423,
4193904912,
33686534,
2139094657,
1347461360,
1010595908,
2678007226,
2829601763,
1364304627,
2745392638,
1077969088,
2408514954,
2459058093,
2644320700,
943222856,
4126535940,
3166462943,
3065411521,
3671764853,
555827811,
269492272,
4294960410,
4092853518,
3537026925,
3452797260,
202119188,
320022069,
3974939439,
1600110305,
2543269282,
1145342156,
387395129,
3301217111,
2812761586,
2122251394,
1027439175,
1684326572,
1566423783,
421081643,
1936975509,
1616953504,
2172721560,
1330618065,
3705447295,
572671078,
707417214,
2425371563,
2290617219,
1179028682,
4008625961,
3099093971,
336865340,
3739133817,
1583267042,
185275933,
3688607094,
3772832571,
842163286,
976909390,
168432670,
1229558491,
101059594,
606357612,
1549580516,
3267534685,
3553869166,
2896970735,
1650640038,
2442213800,
2509582756,
3840201527,
2038035083,
3890730290,
3368586051,
926379609,
1835915959,
2374828428,
3587551588,
1313774802,
2846444000,
1819072692,
1448520954,
4109693703,
3941256997,
1701169839,
2054878350,
2930657257,
134746136,
3132780501,
2021191816,
623200879,
774790258,
471611428,
2795919345,
3031724999,
3334903633,
3907570467,
3722289532,
1953818780,
522141217,
1263245021,
3183305180,
2341145990,
2324303749,
1886445712,
1044282434,
3048567236,
1718013098,
1212715224,
50529797,
4143380225,
235805714,
1633796771,
892693087,
1465364217,
3115936208,
2256934801,
3250690392,
488454695,
2661164985,
3789674808,
4177062675,
2560109491,
286335539,
1768542907,
3654920560,
2391672713,
2492740519,
2610638262,
505297954,
2273777042,
3924412704,
3469641545,
1431677695,
673730680,
3755976058,
2357986191,
2711706104,
2307459456,
218962455,
3216991706,
3873888049,
1111655622,
1751699640,
1094812355,
2576951728,
757946999,
252648977,
2964356043,
1414834428,
3149622742,
370551866
};
private static readonly uint[] T2 = new uint[256] {
1673962851,
2096661628,
2012125559,
2079755643,
4076801522,
1809235307,
1876865391,
3314635973,
811618352,
16909057,
1741597031,
727088427,
4276558334,
3618988759,
2874009259,
1995217526,
3398387146,
2183110018,
3381215433,
2113570685,
4209972730,
1504897881,
1200539975,
4042984432,
2906778797,
3568527316,
2724199842,
2940594863,
2619588508,
2756966308,
1927583346,
3231407040,
3077948087,
4259388669,
2470293139,
642542118,
913070646,
1065238847,
4160029431,
3431157708,
879254580,
2773611685,
3855693029,
4059629809,
1910674289,
3635114968,
828527409,
355090197,
67636228,
3348452039,
591815971,
3281870531,
405809176,
2520228246,
84545285,
2586817946,
118360327,
304363026,
2149292928,
3806281186,
3956090603,
659450151,
2994720178,
1978310517,
152181513,
2199756419,
743994412,
439627290,
456535323,
1859957358,
1521806938,
2690382752,
1386542674,
997608763,
3602342358,
3011366579,
693271337,
3822927587,
794718511,
2215876484,
1403450707,
3518589137,
0,
3988860141,
541089824,
4242743292,
2977548465,
1538714971,
1792327274,
3415033547,
3194476990,
963791673,
1251270218,
1285084236,
1487988824,
3481619151,
3501943760,
4022676207,
2857362858,
4226619131,
1132905795,
1301993293,
862344499,
2232521861,
1166724933,
4192801017,
33818114,
2147385727,
1352724560,
1014514748,
2670049951,
2823545768,
1369633617,
2740846243,
1082179648,
2399505039,
2453646738,
2636233885,
946882616,
4126213365,
3160661948,
3061301686,
3668932058,
557998881,
270544912,
4293204735,
4093447923,
3535760850,
3447803085,
202904588,
321271059,
3972214764,
1606345055,
2536874647,
1149815876,
388905239,
3297990596,
2807427751,
2130477694,
1031423805,
1690872932,
1572530013,
422718233,
1944491379,
1623236704,
2165938305,
1335808335,
3701702620,
574907938,
710180394,
2419829648,
2282455944,
1183631942,
4006029806,
3094074296,
338181140,
3735517662,
1589437022,
185998603,
3685578459,
3772464096,
845436466,
980700730,
169090570,
1234361161,
101452294,
608726052,
1555620956,
3265224130,
3552407251,
2890133420,
1657054818,
2436475025,
2503058581,
3839047652,
2045938553,
3889509095,
3364570056,
929978679,
1843050349,
2365688973,
3585172693,
1318900302,
2840191145,
1826141292,
1454176854,
4109567988,
3939444202,
1707781989,
2062847610,
2923948462,
135272456,
3127891386,
2029029496,
625635109,
777810478,
473441308,
2790781350,
3027486644,
3331805638,
3905627112,
3718347997,
1961401460,
524165407,
1268178251,
3177307325,
2332919435,
2316273034,
1893765232,
1048330814,
3044132021,
1724688998,
1217452104,
50726147,
4143383030,
236720654,
1640145761,
896163637,
1471084887,
3110719673,
2249691526,
3248052417,
490350365,
2653403550,
3789109473,
4176155640,
2553000856,
287453969,
1775418217,
3651760345,
2382858638,
2486413204,
2603464347,
507257374,
2266337927,
3922272489,
3464972750,
1437269845,
676362280,
3752164063,
2349043596,
2707028129,
2299101321,
219813645,
3211123391,
3872862694,
1115997762,
1758509160,
1099088705,
2569646233,
760903469,
253628687,
2960903088,
1420360788,
3144537787,
371997206
};
private static readonly uint[] T3 = new uint[256] {
3332727651,
4169432188,
4003034999,
4136467323,
4279104242,
3602738027,
3736170351,
2438251973,
1615867952,
33751297,
3467208551,
1451043627,
3877240574,
3043153879,
1306962859,
3969545846,
2403715786,
530416258,
2302724553,
4203183485,
4011195130,
3001768281,
2395555655,
4211863792,
1106029997,
3009926356,
1610457762,
1173008303,
599760028,
1408738468,
3835064946,
2606481600,
1975695287,
3776773629,
1034851219,
1282024998,
1817851446,
2118205247,
4110612471,
2203045068,
1750873140,
1374987685,
3509904869,
4178113009,
3801313649,
2876496088,
1649619249,
708777237,
135005188,
2505230279,
1181033251,
2640233411,
807933976,
933336726,
168756485,
800430746,
235472647,
607523346,
463175808,
3745374946,
3441880043,
1315514151,
2144187058,
3936318837,
303761673,
496927619,
1484008492,
875436570,
908925723,
3702681198,
3035519578,
1543217312,
2767606354,
1984772923,
3076642518,
2110698419,
1383803177,
3711886307,
1584475951,
328696964,
2801095507,
3110654417,
0,
3240947181,
1080041504,
3810524412,
2043195825,
3069008731,
3569248874,
2370227147,
1742323390,
1917532473,
2497595978,
2564049996,
2968016984,
2236272591,
3144405200,
3307925487,
1340451498,
3977706491,
2261074755,
2597801293,
1716859699,
294946181,
2328839493,
3910203897,
67502594,
4269899647,
2700103760,
2017737788,
632987551,
1273211048,
2733855057,
1576969123,
2160083008,
92966799,
1068339858,
566009245,
1883781176,
4043634165,
1675607228,
2009183926,
2943736538,
1113792801,
540020752,
3843751935,
4245615603,
3211645650,
2169294285,
403966988,
641012499,
3274697964,
3202441055,
899848087,
2295088196,
775493399,
2472002756,
1441965991,
4236410494,
2051489085,
3366741092,
3135724893,
841685273,
3868554099,
3231735904,
429425025,
2664517455,
2743065820,
1147544098,
1417554474,
1001099408,
193169544,
2362066502,
3341414126,
1809037496,
675025940,
2809781982,
3168951902,
371002123,
2910247899,
3678134496,
1683370546,
1951283770,
337512970,
2463844681,
201983494,
1215046692,
3101973596,
2673722050,
3178157011,
1139780780,
3299238498,
967348625,
832869781,
3543655652,
4069226873,
3576883175,
2336475336,
1851340599,
3669454189,
25988493,
2976175573,
2631028302,
1239460265,
3635702892,
2902087254,
4077384948,
3475368682,
3400492389,
4102978170,
1206496942,
270010376,
1876277946,
4035475576,
1248797989,
1550986798,
941890588,
1475454630,
1942467764,
2538718918,
3408128232,
2709315037,
3902567540,
1042358047,
2531085131,
1641856445,
226921355,
260409994,
3767562352,
2084716094,
1908716981,
3433719398,
2430093384,
100991747,
4144101110,
470945294,
3265487201,
1784624437,
2935576407,
1775286713,
395413126,
2572730817,
975641885,
666476190,
3644383713,
3943954680,
733190296,
573772049,
3535497577,
2842745305,
126455438,
866620564,
766942107,
1008868894,
361924487,
3374377449,
2269761230,
2868860245,
1350051880,
2776293343,
59739276,
1509466529,
159418761,
437718285,
1708834751,
3610371814,
2227585602,
3501746280,
2193834305,
699439513,
1517759789,
504434447,
2076946608,
2835108948,
1842789307,
742004246
};
private static readonly uint[] Tinv0 = new uint[256] {
1353184337,
1399144830,
3282310938,
2522752826,
3412831035,
4047871263,
2874735276,
2466505547,
1442459680,
4134368941,
2440481928,
625738485,
4242007375,
3620416197,
2151953702,
2409849525,
1230680542,
1729870373,
2551114309,
3787521629,
41234371,
317738113,
2744600205,
3338261355,
3881799427,
2510066197,
3950669247,
3663286933,
763608788,
3542185048,
694804553,
1154009486,
1787413109,
2021232372,
1799248025,
3715217703,
3058688446,
397248752,
1722556617,
3023752829,
407560035,
2184256229,
1613975959,
1165972322,
3765920945,
2226023355,
480281086,
2485848313,
1483229296,
436028815,
2272059028,
3086515026,
601060267,
3791801202,
1468997603,
715871590,
120122290,
63092015,
2591802758,
2768779219,
4068943920,
2997206819,
3127509762,
1552029421,
723308426,
2461301159,
4042393587,
2715969870,
3455375973,
3586000134,
526529745,
2331944644,
2639474228,
2689987490,
853641733,
1978398372,
971801355,
2867814464,
111112542,
1360031421,
4186579262,
1023860118,
2919579357,
1186850381,
3045938321,
90031217,
1876166148,
4279586912,
620468249,
2548678102,
3426959497,
2006899047,
3175278768,
2290845959,
945494503,
3689859193,
1191869601,
3910091388,
3374220536,
0,
2206629897,
1223502642,
2893025566,
1316117100,
4227796733,
1446544655,
517320253,
658058550,
1691946762,
564550760,
3511966619,
976107044,
2976320012,
266819475,
3533106868,
2660342555,
1338359936,
2720062561,
1766553434,
370807324,
179999714,
3844776128,
1138762300,
488053522,
185403662,
2915535858,
3114841645,
3366526484,
2233069911,
1275557295,
3151862254,
4250959779,
2670068215,
3170202204,
3309004356,
880737115,
1982415755,
3703972811,
1761406390,
1676797112,
3403428311,
277177154,
1076008723,
538035844,
2099530373,
4164795346,
288553390,
1839278535,
1261411869,
4080055004,
3964831245,
3504587127,
1813426987,
2579067049,
4199060497,
577038663,
3297574056,
440397984,
3626794326,
4019204898,
3343796615,
3251714265,
4272081548,
906744984,
3481400742,
685669029,
646887386,
2764025151,
3835509292,
227702864,
2613862250,
1648787028,
3256061430,
3904428176,
1593260334,
4121936770,
3196083615,
2090061929,
2838353263,
3004310991,
999926984,
2809993232,
1852021992,
2075868123,
158869197,
4095236462,
28809964,
2828685187,
1701746150,
2129067946,
147831841,
3873969647,
3650873274,
3459673930,
3557400554,
3598495785,
2947720241,
824393514,
815048134,
3227951669,
935087732,
2798289660,
2966458592,
366520115,
1251476721,
4158319681,
240176511,
804688151,
2379631990,
1303441219,
1414376140,
3741619940,
3820343710,
461924940,
3089050817,
2136040774,
82468509,
1563790337,
1937016826,
776014843,
1511876531,
1389550482,
861278441,
323475053,
2355222426,
2047648055,
2383738969,
2302415851,
3995576782,
902390199,
3991215329,
1018251130,
1507840668,
1064563285,
2043548696,
3208103795,
3939366739,
1537932639,
342834655,
2262516856,
2180231114,
1053059257,
741614648,
1598071746,
1925389590,
203809468,
2336832552,
1100287487,
1895934009,
3736275976,
2632234200,
2428589668,
1636092795,
1890988757,
1952214088,
1113045200
};
private static readonly uint[] Tinv1 = new uint[256] {
2817806672,
1698790995,
2752977603,
1579629206,
1806384075,
1167925233,
1492823211,
65227667,
4197458005,
1836494326,
1993115793,
1275262245,
3622129660,
3408578007,
1144333952,
2741155215,
1521606217,
465184103,
250234264,
3237895649,
1966064386,
4031545618,
2537983395,
4191382470,
1603208167,
2626819477,
2054012907,
1498584538,
2210321453,
561273043,
1776306473,
3368652356,
2311222634,
2039411832,
1045993835,
1907959773,
1340194486,
2911432727,
2887829862,
986611124,
1256153880,
823846274,
860985184,
2136171077,
2003087840,
2926295940,
2692873756,
722008468,
1749577816,
4249194265,
1826526343,
4168831671,
3547573027,
38499042,
2401231703,
2874500650,
686535175,
3266653955,
2076542618,
137876389,
2267558130,
2780767154,
1778582202,
2182540636,
483363371,
3027871634,
4060607472,
3798552225,
4107953613,
3188000469,
1647628575,
4272342154,
1395537053,
1442030240,
3783918898,
3958809717,
3968011065,
4016062634,
2675006982,
275692881,
2317434617,
115185213,
88006062,
3185986886,
2371129781,
1573155077,
3557164143,
357589247,
4221049124,
3921532567,
1128303052,
2665047927,
1122545853,
2341013384,
1528424248,
4006115803,
175939911,
256015593,
512030921,
0,
2256537987,
3979031112,
1880170156,
1918528590,
4279172603,
948244310,
3584965918,
959264295,
3641641572,
2791073825,
1415289809,
775300154,
1728711857,
3881276175,
2532226258,
2442861470,
3317727311,
551313826,
1266113129,
437394454,
3130253834,
715178213,
3760340035,
387650077,
218697227,
3347837613,
2830511545,
2837320904,
435246981,
125153100,
3717852859,
1618977789,
637663135,
4117912764,
996558021,
2130402100,
692292470,
3324234716,
4243437160,
4058298467,
3694254026,
2237874704,
580326208,
298222624,
608863613,
1035719416,
855223825,
2703869805,
798891339,
817028339,
1384517100,
3821107152,
380840812,
3111168409,
1217663482,
1693009698,
2365368516,
1072734234,
746411736,
2419270383,
1313441735,
3510163905,
2731183358,
198481974,
2180359887,
3732579624,
2394413606,
3215802276,
2637835492,
2457358349,
3428805275,
1182684258,
328070850,
3101200616,
4147719774,
2948825845,
2153619390,
2479909244,
768962473,
304467891,
2578237499,
2098729127,
1671227502,
3141262203,
2015808777,
408514292,
3080383489,
2588902312,
1855317605,
3875515006,
3485212936,
3893751782,
2615655129,
913263310,
161475284,
2091919830,
2997105071,
591342129,
2493892144,
1721906624,
3159258167,
3397581990,
3499155632,
3634836245,
2550460746,
3672916471,
1355644686,
4136703791,
3595400845,
2968470349,
1303039060,
76997855,
3050413795,
2288667675,
523026872,
1365591679,
3932069124,
898367837,
1955068531,
1091304238,
493335386,
3537605202,
1443948851,
1205234963,
1641519756,
211892090,
351820174,
1007938441,
665439982,
3378624309,
3843875309,
2974251580,
3755121753,
1945261375,
3457423481,
935818175,
3455538154,
2868731739,
1866325780,
3678697606,
4088384129,
3295197502,
874788908,
1084473951,
3273463410,
635616268,
1228679307,
2500722497,
27801969,
3003910366,
3837057180,
3243664528,
2227927905,
3056784752,
1550600308,
1471729730
};
private static readonly uint[] Tinv2 = new uint[256] {
4098969767,
1098797925,
387629988,
658151006,
2872822635,
2636116293,
4205620056,
3813380867,
807425530,
1991112301,
3431502198,
49620300,
3847224535,
717608907,
891715652,
1656065955,
2984135002,
3123013403,
3930429454,
4267565504,
801309301,
1283527408,
1183687575,
3547055865,
2399397727,
2450888092,
1841294202,
1385552473,
3201576323,
1951978273,
3762891113,
3381544136,
3262474889,
2398386297,
1486449470,
3106397553,
3787372111,
2297436077,
550069932,
3464344634,
3747813450,
451248689,
1368875059,
1398949247,
1689378935,
1807451310,
2180914336,
150574123,
1215322216,
1167006205,
3734275948,
2069018616,
1940595667,
1265820162,
534992783,
1432758955,
3954313000,
3039757250,
3313932923,
936617224,
674296455,
3206787749,
50510442,
384654466,
3481938716,
2041025204,
133427442,
1766760930,
3664104948,
84334014,
886120290,
2797898494,
775200083,
4087521365,
2315596513,
4137973227,
2198551020,
1614850799,
1901987487,
1857900816,
557775242,
3717610758,
1054715397,
3863824061,
1418835341,
3295741277,
100954068,
1348534037,
2551784699,
3184957417,
1082772547,
3647436702,
3903896898,
2298972299,
434583643,
3363429358,
2090944266,
1115482383,
2230896926,
0,
2148107142,
724715757,
287222896,
1517047410,
251526143,
2232374840,
2923241173,
758523705,
252339417,
1550328230,
1536938324,
908343854,
168604007,
1469255655,
4004827798,
2602278545,
3229634501,
3697386016,
2002413899,
303830554,
2481064634,
2696996138,
574374880,
454171927,
151915277,
2347937223,
3056449960,
504678569,
4049044761,
1974422535,
2582559709,
2141453664,
33005350,
1918680309,
1715782971,
4217058430,
1133213225,
600562886,
3988154620,
3837289457,
836225756,
1665273989,
2534621218,
3330547729,
1250262308,
3151165501,
4188934450,
700935585,
2652719919,
3000824624,
2249059410,
3245854947,
3005967382,
1890163129,
2484206152,
3913753188,
4238918796,
4037024319,
2102843436,
857927568,
1233635150,
953795025,
3398237858,
3566745099,
4121350017,
2057644254,
3084527246,
2906629311,
976020637,
2018512274,
1600822220,
2119459398,
2381758995,
3633375416,
959340279,
3280139695,
1570750080,
3496574099,
3580864813,
634368786,
2898803609,
403744637,
2632478307,
1004239803,
650971512,
1500443672,
2599158199,
1334028442,
2514904430,
4289363686,
3156281551,
368043752,
3887782299,
1867173430,
2682967049,
2955531900,
2754719666,
1059729699,
2781229204,
2721431654,
1316239292,
2197595850,
2430644432,
2805143000,
82922136,
3963746266,
3447656016,
2434215926,
1299615190,
4014165424,
2865517645,
2531581700,
3516851125,
1783372680,
750893087,
1699118929,
1587348714,
2348899637,
2281337716,
201010753,
1739807261,
3683799762,
283718486,
3597472583,
3617229921,
2704767500,
4166618644,
334203196,
2848910887,
1639396809,
484568549,
1199193265,
3533461983,
4065673075,
337148366,
3346251575,
4149471949,
4250885034,
1038029935,
1148749531,
2949284339,
1756970692,
607661108,
2747424576,
488010435,
3803974693,
1009290057,
234832277,
2822336769,
201907891,
3034094820,
1449431233,
3413860740,
852848822,
1816687708,
3100656215
};
private static readonly uint[] Tinv3 = new uint[256] {
1364240372,
2119394625,
449029143,
982933031,
1003187115,
535905693,
2896910586,
1267925987,
542505520,
2918608246,
2291234508,
4112862210,
1341970405,
3319253802,
645940277,
3046089570,
3729349297,
627514298,
1167593194,
1575076094,
3271718191,
2165502028,
2376308550,
1808202195,
65494927,
362126482,
3219880557,
2514114898,
3559752638,
1490231668,
1227450848,
2386872521,
1969916354,
4101536142,
2573942360,
668823993,
3199619041,
4028083592,
3378949152,
2108963534,
1662536415,
3850514714,
2539664209,
1648721747,
2984277860,
3146034795,
4263288961,
4187237128,
1884842056,
2400845125,
2491903198,
1387788411,
2871251827,
1927414347,
3814166303,
1714072405,
2986813675,
788775605,
2258271173,
3550808119,
821200680,
598910399,
45771267,
3982262806,
2318081231,
2811409529,
4092654087,
1319232105,
1707996378,
114671109,
3508494900,
3297443494,
882725678,
2728416755,
87220618,
2759191542,
188345475,
1084944224,
1577492337,
3176206446,
1056541217,
2520581853,
3719169342,
1296481766,
2444594516,
1896177092,
74437638,
1627329872,
421854104,
3600279997,
2311865152,
1735892697,
2965193448,
126389129,
3879230233,
2044456648,
2705787516,
2095648578,
4173930116,
0,
159614592,
843640107,
514617361,
1817080410,
4261150478,
257308805,
1025430958,
908540205,
174381327,
1747035740,
2614187099,
607792694,
212952842,
2467293015,
3033700078,
463376795,
2152711616,
1638015196,
1516850039,
471210514,
3792353939,
3236244128,
1011081250,
303896347,
235605257,
4071475083,
767142070,
348694814,
1468340721,
2940995445,
4005289369,
2751291519,
4154402305,
1555887474,
1153776486,
1530167035,
2339776835,
3420243491,
3060333805,
3093557732,
3620396081,
1108378979,
322970263,
2216694214,
2239571018,
3539484091,
2920362745,
3345850665,
491466654,
3706925234,
233591430,
2010178497,
728503987,
2845423984,
301615252,
1193436393,
2831453436,
2686074864,
1457007741,
586125363,
2277985865,
3653357880,
2365498058,
2553678804,
2798617077,
2770919034,
3659959991,
1067761581,
753179962,
1343066744,
1788595295,
1415726718,
4139914125,
2431170776,
777975609,
2197139395,
2680062045,
1769771984,
1873358293,
3484619301,
3359349164,
279411992,
3899548572,
3682319163,
3439949862,
1861490777,
3959535514,
2208864847,
3865407125,
2860443391,
554225596,
4024887317,
3134823399,
1255028335,
3939764639,
701922480,
833598116,
707863359,
3325072549,
901801634,
1949809742,
4238789250,
3769684112,
857069735,
4048197636,
1106762476,
2131644621,
389019281,
1989006925,
1129165039,
3428076970,
3839820950,
2665723345,
1276872810,
3250069292,
1182749029,
2634345054,
22885772,
4201870471,
4214112523,
3009027431,
2454901467,
3912455696,
1829980118,
2592891351,
930745505,
1502483704,
3951639571,
3471714217,
3073755489,
3790464284,
2050797895,
2623135698,
1430221810,
410635796,
1941911495,
1407897079,
1599843069,
3742658365,
2022103876,
3397514159,
3107898472,
942421028,
3261022371,
376619805,
3154912738,
680216892,
4282488077,
963707304,
148812556,
3634160820,
1687208278,
2069988555,
3580933682,
1215585388,
3494008760
};
public AesCipher(byte[] key, CipherMode mode, CipherPadding padding)
: base(key, 16, mode, padding)
{
int num = key.Length * 8;
if (num != 256 && num != 192 && num != 128)
throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, "KeySize '{0}' is not valid for this algorithm.", new object[1] {
num
}));
}
public override int EncryptBlock(byte[] inputBuffer, int inputOffset, int inputCount, byte[] outputBuffer, int outputOffset)
{
if (inputBuffer == null)
throw new ArgumentNullException("inputBuffer");
if (outputBuffer == null)
throw new ArgumentNullException("outputBuffer");
if (inputOffset + 16 > inputBuffer.Length)
throw new IndexOutOfRangeException("input buffer too short");
if (outputOffset + 16 > outputBuffer.Length)
throw new IndexOutOfRangeException("output buffer too short");
if (_encryptionKey == null)
_encryptionKey = GenerateWorkingKey(true, base.Key);
UnPackBlock(inputBuffer, inputOffset);
EncryptBlock(_encryptionKey);
PackBlock(outputBuffer, outputOffset);
return base.BlockSize;
}
public override int DecryptBlock(byte[] inputBuffer, int inputOffset, int inputCount, byte[] outputBuffer, int outputOffset)
{
if (inputBuffer == null)
throw new ArgumentNullException("inputBuffer");
if (outputBuffer == null)
throw new ArgumentNullException("outputBuffer");
if (inputOffset + 16 > inputBuffer.Length)
throw new IndexOutOfRangeException("input buffer too short");
if (outputOffset + 16 > outputBuffer.Length)
throw new IndexOutOfRangeException("output buffer too short");
if (_decryptionKey == null)
_decryptionKey = GenerateWorkingKey(false, base.Key);
UnPackBlock(inputBuffer, inputOffset);
DecryptBlock(_decryptionKey);
PackBlock(outputBuffer, outputOffset);
return base.BlockSize;
}
private uint[] GenerateWorkingKey(bool isEncryption, byte[] key)
{
int num = key.Length / 4;
if ((num != 4 && num != 6 && num != 8) || num * 4 != key.Length)
throw new ArgumentException("Key length not 128/192/256 bits.");
_rounds = num + 6;
uint[] array = new uint[(_rounds + 1) * 4];
int num2 = 0;
int num3 = 0;
while (num3 < key.Length) {
array[(num2 >> 2) * 4 + (num2 & 3)] = Cipher.LittleEndianToUInt32(key, num3);
num3 += 4;
num2++;
}
int num4 = _rounds + 1 << 2;
for (int i = num; i < num4; i++) {
uint num5 = array[(i - 1 >> 2) * 4 + ((i - 1) & 3)];
if (i % num == 0)
num5 = (SubWord(Shift(num5, 8)) ^ rcon[i / num - 1]);
else if (num > 6 && i % num == 4) {
num5 = SubWord(num5);
}
array[(i >> 2) * 4 + (i & 3)] = (array[(i - num >> 2) * 4 + ((i - num) & 3)] ^ num5);
}
if (!isEncryption) {
for (int j = 1; j < _rounds; j++) {
for (int k = 0; k < 4; k++) {
array[j * 4 + k] = InvMcol(array[j * 4 + k]);
}
}
}
return array;
}
private static uint Shift(uint r, int shift)
{
return (r >> shift) | (r << 32 - shift);
}
private static uint FFmulX(uint x)
{
return ((x & 2139062143) << 1) ^ (((uint)((int)x & -2139062144) >> 7) * 27);
}
private static uint InvMcol(uint x)
{
uint num = FFmulX(x);
uint num2 = FFmulX(num);
uint num3 = FFmulX(num2);
uint num4 = x ^ num3;
return num ^ num2 ^ num3 ^ Shift(num ^ num4, 8) ^ Shift(num2 ^ num4, 16) ^ Shift(num4, 24);
}
private static uint SubWord(uint x)
{
return (uint)(S[x & 255] | (S[(x >> 8) & 255] << 8) | (S[(x >> 16) & 255] << 16) | (S[(x >> 24) & 255] << 24));
}
private void UnPackBlock(byte[] bytes, int off)
{
C0 = Cipher.LittleEndianToUInt32(bytes, off);
C1 = Cipher.LittleEndianToUInt32(bytes, off + 4);
C2 = Cipher.LittleEndianToUInt32(bytes, off + 8);
C3 = Cipher.LittleEndianToUInt32(bytes, off + 12);
}
private void PackBlock(byte[] bytes, int off)
{
Cipher.UInt32ToLittleEndian(C0, bytes, off);
Cipher.UInt32ToLittleEndian(C1, bytes, off + 4);
Cipher.UInt32ToLittleEndian(C2, bytes, off + 8);
Cipher.UInt32ToLittleEndian(C3, bytes, off + 12);
}
private void EncryptBlock(uint[] KW)
{
C0 ^= KW[0];
C1 ^= KW[1];
C2 ^= KW[2];
C3 ^= KW[3];
int num = 1;
uint num2;
uint num3;
uint num4;
uint num6;
while (num < _rounds - 1) {
num2 = (T0[C0 & 255] ^ T1[(C1 >> 8) & 255] ^ T2[(C2 >> 16) & 255] ^ T3[C3 >> 24] ^ KW[num * 4]);
num3 = (T0[C1 & 255] ^ T1[(C2 >> 8) & 255] ^ T2[(C3 >> 16) & 255] ^ T3[C0 >> 24] ^ KW[num * 4 + 1]);
num4 = (T0[C2 & 255] ^ T1[(C3 >> 8) & 255] ^ T2[(C0 >> 16) & 255] ^ T3[C1 >> 24] ^ KW[num * 4 + 2]);
num6 = (T0[C3 & 255] ^ T1[(C0 >> 8) & 255] ^ T2[(C1 >> 16) & 255] ^ T3[C2 >> 24] ^ KW[num++ * 4 + 3]);
C0 = (T0[num2 & 255] ^ T1[(num3 >> 8) & 255] ^ T2[(num4 >> 16) & 255] ^ T3[num6 >> 24] ^ KW[num * 4]);
C1 = (T0[num3 & 255] ^ T1[(num4 >> 8) & 255] ^ T2[(num6 >> 16) & 255] ^ T3[num2 >> 24] ^ KW[num * 4 + 1]);
C2 = (T0[num4 & 255] ^ T1[(num6 >> 8) & 255] ^ T2[(num2 >> 16) & 255] ^ T3[num3 >> 24] ^ KW[num * 4 + 2]);
C3 = (T0[num6 & 255] ^ T1[(num2 >> 8) & 255] ^ T2[(num3 >> 16) & 255] ^ T3[num4 >> 24] ^ KW[num++ * 4 + 3]);
}
num2 = (T0[C0 & 255] ^ T1[(C1 >> 8) & 255] ^ T2[(C2 >> 16) & 255] ^ T3[C3 >> 24] ^ KW[num * 4]);
num3 = (T0[C1 & 255] ^ T1[(C2 >> 8) & 255] ^ T2[(C3 >> 16) & 255] ^ T3[C0 >> 24] ^ KW[num * 4 + 1]);
num4 = (T0[C2 & 255] ^ T1[(C3 >> 8) & 255] ^ T2[(C0 >> 16) & 255] ^ T3[C1 >> 24] ^ KW[num * 4 + 2]);
num6 = (T0[C3 & 255] ^ T1[(C0 >> 8) & 255] ^ T2[(C1 >> 16) & 255] ^ T3[C2 >> 24] ^ KW[num++ * 4 + 3]);
C0 = (uint)(S[num2 & 255] ^ (S[(num3 >> 8) & 255] << 8) ^ (S[(num4 >> 16) & 255] << 16) ^ (S[num6 >> 24] << 24) ^ (int)KW[num * 4]);
C1 = (uint)(S[num3 & 255] ^ (S[(num4 >> 8) & 255] << 8) ^ (S[(num6 >> 16) & 255] << 16) ^ (S[num2 >> 24] << 24) ^ (int)KW[num * 4 + 1]);
C2 = (uint)(S[num4 & 255] ^ (S[(num6 >> 8) & 255] << 8) ^ (S[(num2 >> 16) & 255] << 16) ^ (S[num3 >> 24] << 24) ^ (int)KW[num * 4 + 2]);
C3 = (uint)(S[num6 & 255] ^ (S[(num2 >> 8) & 255] << 8) ^ (S[(num3 >> 16) & 255] << 16) ^ (S[num4 >> 24] << 24) ^ (int)KW[num * 4 + 3]);
}
private void DecryptBlock(uint[] KW)
{
C0 ^= KW[_rounds * 4];
C1 ^= KW[_rounds * 4 + 1];
C2 ^= KW[_rounds * 4 + 2];
C3 ^= KW[_rounds * 4 + 3];
int num = _rounds - 1;
uint num2;
uint num3;
uint num4;
uint num6;
while (num > 1) {
num2 = (Tinv0[C0 & 255] ^ Tinv1[(C3 >> 8) & 255] ^ Tinv2[(C2 >> 16) & 255] ^ Tinv3[C1 >> 24] ^ KW[num * 4]);
num3 = (Tinv0[C1 & 255] ^ Tinv1[(C0 >> 8) & 255] ^ Tinv2[(C3 >> 16) & 255] ^ Tinv3[C2 >> 24] ^ KW[num * 4 + 1]);
num4 = (Tinv0[C2 & 255] ^ Tinv1[(C1 >> 8) & 255] ^ Tinv2[(C0 >> 16) & 255] ^ Tinv3[C3 >> 24] ^ KW[num * 4 + 2]);
num6 = (Tinv0[C3 & 255] ^ Tinv1[(C2 >> 8) & 255] ^ Tinv2[(C1 >> 16) & 255] ^ Tinv3[C0 >> 24] ^ KW[num-- * 4 + 3]);
C0 = (Tinv0[num2 & 255] ^ Tinv1[(num6 >> 8) & 255] ^ Tinv2[(num4 >> 16) & 255] ^ Tinv3[num3 >> 24] ^ KW[num * 4]);
C1 = (Tinv0[num3 & 255] ^ Tinv1[(num2 >> 8) & 255] ^ Tinv2[(num6 >> 16) & 255] ^ Tinv3[num4 >> 24] ^ KW[num * 4 + 1]);
C2 = (Tinv0[num4 & 255] ^ Tinv1[(num3 >> 8) & 255] ^ Tinv2[(num2 >> 16) & 255] ^ Tinv3[num6 >> 24] ^ KW[num * 4 + 2]);
C3 = (Tinv0[num6 & 255] ^ Tinv1[(num4 >> 8) & 255] ^ Tinv2[(num3 >> 16) & 255] ^ Tinv3[num2 >> 24] ^ KW[num-- * 4 + 3]);
}
num2 = (Tinv0[C0 & 255] ^ Tinv1[(C3 >> 8) & 255] ^ Tinv2[(C2 >> 16) & 255] ^ Tinv3[C1 >> 24] ^ KW[num * 4]);
num3 = (Tinv0[C1 & 255] ^ Tinv1[(C0 >> 8) & 255] ^ Tinv2[(C3 >> 16) & 255] ^ Tinv3[C2 >> 24] ^ KW[num * 4 + 1]);
num4 = (Tinv0[C2 & 255] ^ Tinv1[(C1 >> 8) & 255] ^ Tinv2[(C0 >> 16) & 255] ^ Tinv3[C3 >> 24] ^ KW[num * 4 + 2]);
num6 = (Tinv0[C3 & 255] ^ Tinv1[(C2 >> 8) & 255] ^ Tinv2[(C1 >> 16) & 255] ^ Tinv3[C0 >> 24] ^ KW[num * 4 + 3]);
C0 = (uint)(Si[num2 & 255] ^ (Si[(num6 >> 8) & 255] << 8) ^ (Si[(num4 >> 16) & 255] << 16) ^ (Si[num3 >> 24] << 24) ^ (int)KW[0]);
C1 = (uint)(Si[num3 & 255] ^ (Si[(num2 >> 8) & 255] << 8) ^ (Si[(num6 >> 16) & 255] << 16) ^ (Si[num4 >> 24] << 24) ^ (int)KW[1]);
C2 = (uint)(Si[num4 & 255] ^ (Si[(num3 >> 8) & 255] << 8) ^ (Si[(num2 >> 16) & 255] << 16) ^ (Si[num6 >> 24] << 24) ^ (int)KW[2]);
C3 = (uint)(Si[num6 & 255] ^ (Si[(num4 >> 8) & 255] << 8) ^ (Si[(num3 >> 16) & 255] << 16) ^ (Si[num2 >> 24] << 24) ^ (int)KW[3]);
}
}
}