C写的AES(ECB/PKCS5Padding)

摘自POLARSSL

 1 #pragma once
 2 
 3 #define AES_ENCRYPT     1
 4 #define AES_DECRYPT     0
 5 
 6 struct aes_context
 7 {
 8     int nr;                     /*!<  number of rounds  */
 9     unsigned int* rk;               /*!<  AES round keys    */
10     unsigned int buf[68];           /*!<  unaligned data    */
11 };
12 
13 
14 void aes_setkey_enc( aes_context* ctx, const unsigned char* key, int keysize );
15 void aes_setkey_dec( aes_context* ctx, const unsigned char* key, int keysize );
16 void aes_crypt_ecb_update( aes_context* ctx, int mode, const unsigned char input[16], unsigned char output[16] );
17 unsigned char* aes_crypt_ecb( aes_context* ctx, int mode, const unsigned char* input, int slen, int* dlen );

 

 

  1 #include "aes.h"
  2 
  3 
  4 
  5 /*
  6  * Forward S-box
  7  */
  8 static const unsigned char FSb[256] =
  9 {
 10     0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5,
 11     0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
 12     0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
 13     0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
 14     0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,
 15     0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
 16     0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A,
 17     0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
 18     0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
 19     0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
 20     0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B,
 21     0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
 22     0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85,
 23     0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
 24     0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
 25     0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
 26     0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17,
 27     0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
 28     0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,
 29     0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
 30     0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
 31     0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
 32     0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9,
 33     0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
 34     0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,
 35     0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
 36     0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
 37     0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
 38     0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94,
 39     0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
 40     0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68,
 41     0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
 42 };
 43 
 44 /*
 45  * Forward tables
 46  */
 47 #define FT \
 48     \
 49     V(A5,63,63,C6), V(84,7C,7C,F8), V(99,77,77,EE), V(8D,7B,7B,F6), \
 50     V(0D,F2,F2,FF), V(BD,6B,6B,D6), V(B1,6F,6F,DE), V(54,C5,C5,91), \
 51     V(50,30,30,60), V(03,01,01,02), V(A9,67,67,CE), V(7D,2B,2B,56), \
 52     V(19,FE,FE,E7), V(62,D7,D7,B5), V(E6,AB,AB,4D), V(9A,76,76,EC), \
 53     V(45,CA,CA,8F), V(9D,82,82,1F), V(40,C9,C9,89), V(87,7D,7D,FA), \
 54     V(15,FA,FA,EF), V(EB,59,59,B2), V(C9,47,47,8E), V(0B,F0,F0,FB), \
 55     V(EC,AD,AD,41), V(67,D4,D4,B3), V(FD,A2,A2,5F), V(EA,AF,AF,45), \
 56     V(BF,9C,9C,23), V(F7,A4,A4,53), V(96,72,72,E4), V(5B,C0,C0,9B), \
 57     V(C2,B7,B7,75), V(1C,FD,FD,E1), V(AE,93,93,3D), V(6A,26,26,4C), \
 58     V(5A,36,36,6C), V(41,3F,3F,7E), V(02,F7,F7,F5), V(4F,CC,CC,83), \
 59     V(5C,34,34,68), V(F4,A5,A5,51), V(34,E5,E5,D1), V(08,F1,F1,F9), \
 60     V(93,71,71,E2), V(73,D8,D8,AB), V(53,31,31,62), V(3F,15,15,2A), \
 61     V(0C,04,04,08), V(52,C7,C7,95), V(65,23,23,46), V(5E,C3,C3,9D), \
 62     V(28,18,18,30), V(A1,96,96,37), V(0F,05,05,0A), V(B5,9A,9A,2F), \
 63     V(09,07,07,0E), V(36,12,12,24), V(9B,80,80,1B), V(3D,E2,E2,DF), \
 64     V(26,EB,EB,CD), V(69,27,27,4E), V(CD,B2,B2,7F), V(9F,75,75,EA), \
 65     V(1B,09,09,12), V(9E,83,83,1D), V(74,2C,2C,58), V(2E,1A,1A,34), \
 66     V(2D,1B,1B,36), V(B2,6E,6E,DC), V(EE,5A,5A,B4), V(FB,A0,A0,5B), \
 67     V(F6,52,52,A4), V(4D,3B,3B,76), V(61,D6,D6,B7), V(CE,B3,B3,7D), \
 68     V(7B,29,29,52), V(3E,E3,E3,DD), V(71,2F,2F,5E), V(97,84,84,13), \
 69     V(F5,53,53,A6), V(68,D1,D1,B9), V(00,00,00,00), V(2C,ED,ED,C1), \
 70     V(60,20,20,40), V(1F,FC,FC,E3), V(C8,B1,B1,79), V(ED,5B,5B,B6), \
 71     V(BE,6A,6A,D4), V(46,CB,CB,8D), V(D9,BE,BE,67), V(4B,39,39,72), \
 72     V(DE,4A,4A,94), V(D4,4C,4C,98), V(E8,58,58,B0), V(4A,CF,CF,85), \
 73     V(6B,D0,D0,BB), V(2A,EF,EF,C5), V(E5,AA,AA,4F), V(16,FB,FB,ED), \
 74     V(C5,43,43,86), V(D7,4D,4D,9A), V(55,33,33,66), V(94,85,85,11), \
 75     V(CF,45,45,8A), V(10,F9,F9,E9), V(06,02,02,04), V(81,7F,7F,FE), \
 76     V(F0,50,50,A0), V(44,3C,3C,78), V(BA,9F,9F,25), V(E3,A8,A8,4B), \
 77     V(F3,51,51,A2), V(FE,A3,A3,5D), V(C0,40,40,80), V(8A,8F,8F,05), \
 78     V(AD,92,92,3F), V(BC,9D,9D,21), V(48,38,38,70), V(04,F5,F5,F1), \
 79     V(DF,BC,BC,63), V(C1,B6,B6,77), V(75,DA,DA,AF), V(63,21,21,42), \
 80     V(30,10,10,20), V(1A,FF,FF,E5), V(0E,F3,F3,FD), V(6D,D2,D2,BF), \
 81     V(4C,CD,CD,81), V(14,0C,0C,18), V(35,13,13,26), V(2F,EC,EC,C3), \
 82     V(E1,5F,5F,BE), V(A2,97,97,35), V(CC,44,44,88), V(39,17,17,2E), \
 83     V(57,C4,C4,93), V(F2,A7,A7,55), V(82,7E,7E,FC), V(47,3D,3D,7A), \
 84     V(AC,64,64,C8), V(E7,5D,5D,BA), V(2B,19,19,32), V(95,73,73,E6), \
 85     V(A0,60,60,C0), V(98,81,81,19), V(D1,4F,4F,9E), V(7F,DC,DC,A3), \
 86     V(66,22,22,44), V(7E,2A,2A,54), V(AB,90,90,3B), V(83,88,88,0B), \
 87     V(CA,46,46,8C), V(29,EE,EE,C7), V(D3,B8,B8,6B), V(3C,14,14,28), \
 88     V(79,DE,DE,A7), V(E2,5E,5E,BC), V(1D,0B,0B,16), V(76,DB,DB,AD), \
 89     V(3B,E0,E0,DB), V(56,32,32,64), V(4E,3A,3A,74), V(1E,0A,0A,14), \
 90     V(DB,49,49,92), V(0A,06,06,0C), V(6C,24,24,48), V(E4,5C,5C,B8), \
 91     V(5D,C2,C2,9F), V(6E,D3,D3,BD), V(EF,AC,AC,43), V(A6,62,62,C4), \
 92     V(A8,91,91,39), V(A4,95,95,31), V(37,E4,E4,D3), V(8B,79,79,F2), \
 93     V(32,E7,E7,D5), V(43,C8,C8,8B), V(59,37,37,6E), V(B7,6D,6D,DA), \
 94     V(8C,8D,8D,01), V(64,D5,D5,B1), V(D2,4E,4E,9C), V(E0,A9,A9,49), \
 95     V(B4,6C,6C,D8), V(FA,56,56,AC), V(07,F4,F4,F3), V(25,EA,EA,CF), \
 96     V(AF,65,65,CA), V(8E,7A,7A,F4), V(E9,AE,AE,47), V(18,08,08,10), \
 97     V(D5,BA,BA,6F), V(88,78,78,F0), V(6F,25,25,4A), V(72,2E,2E,5C), \
 98     V(24,1C,1C,38), V(F1,A6,A6,57), V(C7,B4,B4,73), V(51,C6,C6,97), \
 99     V(23,E8,E8,CB), V(7C,DD,DD,A1), V(9C,74,74,E8), V(21,1F,1F,3E), \
100     V(DD,4B,4B,96), V(DC,BD,BD,61), V(86,8B,8B,0D), V(85,8A,8A,0F), \
101     V(90,70,70,E0), V(42,3E,3E,7C), V(C4,B5,B5,71), V(AA,66,66,CC), \
102     V(D8,48,48,90), V(05,03,03,06), V(01,F6,F6,F7), V(12,0E,0E,1C), \
103     V(A3,61,61,C2), V(5F,35,35,6A), V(F9,57,57,AE), V(D0,B9,B9,69), \
104     V(91,86,86,17), V(58,C1,C1,99), V(27,1D,1D,3A), V(B9,9E,9E,27), \
105     V(38,E1,E1,D9), V(13,F8,F8,EB), V(B3,98,98,2B), V(33,11,11,22), \
106     V(BB,69,69,D2), V(70,D9,D9,A9), V(89,8E,8E,07), V(A7,94,94,33), \
107     V(B6,9B,9B,2D), V(22,1E,1E,3C), V(92,87,87,15), V(20,E9,E9,C9), \
108     V(49,CE,CE,87), V(FF,55,55,AA), V(78,28,28,50), V(7A,DF,DF,A5), \
109     V(8F,8C,8C,03), V(F8,A1,A1,59), V(80,89,89,09), V(17,0D,0D,1A), \
110     V(DA,BF,BF,65), V(31,E6,E6,D7), V(C6,42,42,84), V(B8,68,68,D0), \
111     V(C3,41,41,82), V(B0,99,99,29), V(77,2D,2D,5A), V(11,0F,0F,1E), \
112     V(CB,B0,B0,7B), V(FC,54,54,A8), V(D6,BB,BB,6D), V(3A,16,16,2C)
113 
114 #define V(a,b,c,d) 0x##a##b##c##d
115 static const unsigned int FT0[256] = { FT };
116 #undef V
117 
118 #define V(a,b,c,d) 0x##b##c##d##a
119 static const unsigned int FT1[256] = { FT };
120 #undef V
121 
122 #define V(a,b,c,d) 0x##c##d##a##b
123 static const unsigned int FT2[256] = { FT };
124 #undef V
125 
126 #define V(a,b,c,d) 0x##d##a##b##c
127 static const unsigned int FT3[256] = { FT };
128 #undef V
129 
130 #undef FT
131 
132 /*
133  * Reverse S-box
134  */
135 static const unsigned char RSb[256] =
136 {
137     0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38,
138     0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
139     0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
140     0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
141     0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D,
142     0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
143     0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2,
144     0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
145     0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
146     0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
147     0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA,
148     0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
149     0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A,
150     0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
151     0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
152     0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
153     0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA,
154     0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
155     0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,
156     0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
157     0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
158     0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
159     0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20,
160     0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
161     0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31,
162     0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
163     0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
164     0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
165     0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0,
166     0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
167     0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26,
168     0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
169 };
170 
171 /*
172  * Reverse tables
173  */
174 #define RT \
175     \
176     V(50,A7,F4,51), V(53,65,41,7E), V(C3,A4,17,1A), V(96,5E,27,3A), \
177     V(CB,6B,AB,3B), V(F1,45,9D,1F), V(AB,58,FA,AC), V(93,03,E3,4B), \
178     V(55,FA,30,20), V(F6,6D,76,AD), V(91,76,CC,88), V(25,4C,02,F5), \
179     V(FC,D7,E5,4F), V(D7,CB,2A,C5), V(80,44,35,26), V(8F,A3,62,B5), \
180     V(49,5A,B1,DE), V(67,1B,BA,25), V(98,0E,EA,45), V(E1,C0,FE,5D), \
181     V(02,75,2F,C3), V(12,F0,4C,81), V(A3,97,46,8D), V(C6,F9,D3,6B), \
182     V(E7,5F,8F,03), V(95,9C,92,15), V(EB,7A,6D,BF), V(DA,59,52,95), \
183     V(2D,83,BE,D4), V(D3,21,74,58), V(29,69,E0,49), V(44,C8,C9,8E), \
184     V(6A,89,C2,75), V(78,79,8E,F4), V(6B,3E,58,99), V(DD,71,B9,27), \
185     V(B6,4F,E1,BE), V(17,AD,88,F0), V(66,AC,20,C9), V(B4,3A,CE,7D), \
186     V(18,4A,DF,63), V(82,31,1A,E5), V(60,33,51,97), V(45,7F,53,62), \
187     V(E0,77,64,B1), V(84,AE,6B,BB), V(1C,A0,81,FE), V(94,2B,08,F9), \
188     V(58,68,48,70), V(19,FD,45,8F), V(87,6C,DE,94), V(B7,F8,7B,52), \
189     V(23,D3,73,AB), V(E2,02,4B,72), V(57,8F,1F,E3), V(2A,AB,55,66), \
190     V(07,28,EB,B2), V(03,C2,B5,2F), V(9A,7B,C5,86), V(A5,08,37,D3), \
191     V(F2,87,28,30), V(B2,A5,BF,23), V(BA,6A,03,02), V(5C,82,16,ED), \
192     V(2B,1C,CF,8A), V(92,B4,79,A7), V(F0,F2,07,F3), V(A1,E2,69,4E), \
193     V(CD,F4,DA,65), V(D5,BE,05,06), V(1F,62,34,D1), V(8A,FE,A6,C4), \
194     V(9D,53,2E,34), V(A0,55,F3,A2), V(32,E1,8A,05), V(75,EB,F6,A4), \
195     V(39,EC,83,0B), V(AA,EF,60,40), V(06,9F,71,5E), V(51,10,6E,BD), \
196     V(F9,8A,21,3E), V(3D,06,DD,96), V(AE,05,3E,DD), V(46,BD,E6,4D), \
197     V(B5,8D,54,91), V(05,5D,C4,71), V(6F,D4,06,04), V(FF,15,50,60), \
198     V(24,FB,98,19), V(97,E9,BD,D6), V(CC,43,40,89), V(77,9E,D9,67), \
199     V(BD,42,E8,B0), V(88,8B,89,07), V(38,5B,19,E7), V(DB,EE,C8,79), \
200     V(47,0A,7C,A1), V(E9,0F,42,7C), V(C9,1E,84,F8), V(00,00,00,00), \
201     V(83,86,80,09), V(48,ED,2B,32), V(AC,70,11,1E), V(4E,72,5A,6C), \
202     V(FB,FF,0E,FD), V(56,38,85,0F), V(1E,D5,AE,3D), V(27,39,2D,36), \
203     V(64,D9,0F,0A), V(21,A6,5C,68), V(D1,54,5B,9B), V(3A,2E,36,24), \
204     V(B1,67,0A,0C), V(0F,E7,57,93), V(D2,96,EE,B4), V(9E,91,9B,1B), \
205     V(4F,C5,C0,80), V(A2,20,DC,61), V(69,4B,77,5A), V(16,1A,12,1C), \
206     V(0A,BA,93,E2), V(E5,2A,A0,C0), V(43,E0,22,3C), V(1D,17,1B,12), \
207     V(0B,0D,09,0E), V(AD,C7,8B,F2), V(B9,A8,B6,2D), V(C8,A9,1E,14), \
208     V(85,19,F1,57), V(4C,07,75,AF), V(BB,DD,99,EE), V(FD,60,7F,A3), \
209     V(9F,26,01,F7), V(BC,F5,72,5C), V(C5,3B,66,44), V(34,7E,FB,5B), \
210     V(76,29,43,8B), V(DC,C6,23,CB), V(68,FC,ED,B6), V(63,F1,E4,B8), \
211     V(CA,DC,31,D7), V(10,85,63,42), V(40,22,97,13), V(20,11,C6,84), \
212     V(7D,24,4A,85), V(F8,3D,BB,D2), V(11,32,F9,AE), V(6D,A1,29,C7), \
213     V(4B,2F,9E,1D), V(F3,30,B2,DC), V(EC,52,86,0D), V(D0,E3,C1,77), \
214     V(6C,16,B3,2B), V(99,B9,70,A9), V(FA,48,94,11), V(22,64,E9,47), \
215     V(C4,8C,FC,A8), V(1A,3F,F0,A0), V(D8,2C,7D,56), V(EF,90,33,22), \
216     V(C7,4E,49,87), V(C1,D1,38,D9), V(FE,A2,CA,8C), V(36,0B,D4,98), \
217     V(CF,81,F5,A6), V(28,DE,7A,A5), V(26,8E,B7,DA), V(A4,BF,AD,3F), \
218     V(E4,9D,3A,2C), V(0D,92,78,50), V(9B,CC,5F,6A), V(62,46,7E,54), \
219     V(C2,13,8D,F6), V(E8,B8,D8,90), V(5E,F7,39,2E), V(F5,AF,C3,82), \
220     V(BE,80,5D,9F), V(7C,93,D0,69), V(A9,2D,D5,6F), V(B3,12,25,CF), \
221     V(3B,99,AC,C8), V(A7,7D,18,10), V(6E,63,9C,E8), V(7B,BB,3B,DB), \
222     V(09,78,26,CD), V(F4,18,59,6E), V(01,B7,9A,EC), V(A8,9A,4F,83), \
223     V(65,6E,95,E6), V(7E,E6,FF,AA), V(08,CF,BC,21), V(E6,E8,15,EF), \
224     V(D9,9B,E7,BA), V(CE,36,6F,4A), V(D4,09,9F,EA), V(D6,7C,B0,29), \
225     V(AF,B2,A4,31), V(31,23,3F,2A), V(30,94,A5,C6), V(C0,66,A2,35), \
226     V(37,BC,4E,74), V(A6,CA,82,FC), V(B0,D0,90,E0), V(15,D8,A7,33), \
227     V(4A,98,04,F1), V(F7,DA,EC,41), V(0E,50,CD,7F), V(2F,F6,91,17), \
228     V(8D,D6,4D,76), V(4D,B0,EF,43), V(54,4D,AA,CC), V(DF,04,96,E4), \
229     V(E3,B5,D1,9E), V(1B,88,6A,4C), V(B8,1F,2C,C1), V(7F,51,65,46), \
230     V(04,EA,5E,9D), V(5D,35,8C,01), V(73,74,87,FA), V(2E,41,0B,FB), \
231     V(5A,1D,67,B3), V(52,D2,DB,92), V(33,56,10,E9), V(13,47,D6,6D), \
232     V(8C,61,D7,9A), V(7A,0C,A1,37), V(8E,14,F8,59), V(89,3C,13,EB), \
233     V(EE,27,A9,CE), V(35,C9,61,B7), V(ED,E5,1C,E1), V(3C,B1,47,7A), \
234     V(59,DF,D2,9C), V(3F,73,F2,55), V(79,CE,14,18), V(BF,37,C7,73), \
235     V(EA,CD,F7,53), V(5B,AA,FD,5F), V(14,6F,3D,DF), V(86,DB,44,78), \
236     V(81,F3,AF,CA), V(3E,C4,68,B9), V(2C,34,24,38), V(5F,40,A3,C2), \
237     V(72,C3,1D,16), V(0C,25,E2,BC), V(8B,49,3C,28), V(41,95,0D,FF), \
238     V(71,01,A8,39), V(DE,B3,0C,08), V(9C,E4,B4,D8), V(90,C1,56,64), \
239     V(61,84,CB,7B), V(70,B6,32,D5), V(74,5C,6C,48), V(42,57,B8,D0)
240 
241 #define V(a,b,c,d) 0x##a##b##c##d
242 static const unsigned int RT0[256] = { RT };
243 #undef V
244 
245 #define V(a,b,c,d) 0x##b##c##d##a
246 static const unsigned int RT1[256] = { RT };
247 #undef V
248 
249 #define V(a,b,c,d) 0x##c##d##a##b
250 static const unsigned int RT2[256] = { RT };
251 #undef V
252 
253 #define V(a,b,c,d) 0x##d##a##b##c
254 static const unsigned int RT3[256] = { RT };
255 #undef V
256 
257 #undef RT
258 
259 /*
260  * Round constants
261  */
262 static const unsigned int RCON[10] =
263 {
264     0x00000001, 0x00000002, 0x00000004, 0x00000008,
265     0x00000010, 0x00000020, 0x00000040, 0x00000080,
266     0x0000001B, 0x00000036
267 };
268 
269 #define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3)     \
270     {                                               \
271         X0 = *RK++ ^ FT0[ ( Y0       ) & 0xFF ] ^   \
272              FT1[ ( Y1 >>  8 ) & 0xFF ] ^   \
273              FT2[ ( Y2 >> 16 ) & 0xFF ] ^   \
274              FT3[ ( Y3 >> 24 ) & 0xFF ];    \
275         \
276         X1 = *RK++ ^ FT0[ ( Y1       ) & 0xFF ] ^   \
277              FT1[ ( Y2 >>  8 ) & 0xFF ] ^   \
278              FT2[ ( Y3 >> 16 ) & 0xFF ] ^   \
279              FT3[ ( Y0 >> 24 ) & 0xFF ];    \
280         \
281         X2 = *RK++ ^ FT0[ ( Y2       ) & 0xFF ] ^   \
282              FT1[ ( Y3 >>  8 ) & 0xFF ] ^   \
283              FT2[ ( Y0 >> 16 ) & 0xFF ] ^   \
284              FT3[ ( Y1 >> 24 ) & 0xFF ];    \
285         \
286         X3 = *RK++ ^ FT0[ ( Y3       ) & 0xFF ] ^   \
287              FT1[ ( Y0 >>  8 ) & 0xFF ] ^   \
288              FT2[ ( Y1 >> 16 ) & 0xFF ] ^   \
289              FT3[ ( Y2 >> 24 ) & 0xFF ];    \
290     }
291 
292 #define AES_RROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3)     \
293     {                                               \
294         X0 = *RK++ ^ RT0[ ( Y0       ) & 0xFF ] ^   \
295              RT1[ ( Y3 >>  8 ) & 0xFF ] ^   \
296              RT2[ ( Y2 >> 16 ) & 0xFF ] ^   \
297              RT3[ ( Y1 >> 24 ) & 0xFF ];    \
298         \
299         X1 = *RK++ ^ RT0[ ( Y1       ) & 0xFF ] ^   \
300              RT1[ ( Y0 >>  8 ) & 0xFF ] ^   \
301              RT2[ ( Y3 >> 16 ) & 0xFF ] ^   \
302              RT3[ ( Y2 >> 24 ) & 0xFF ];    \
303         \
304         X2 = *RK++ ^ RT0[ ( Y2       ) & 0xFF ] ^   \
305              RT1[ ( Y1 >>  8 ) & 0xFF ] ^   \
306              RT2[ ( Y0 >> 16 ) & 0xFF ] ^   \
307              RT3[ ( Y3 >> 24 ) & 0xFF ];    \
308         \
309         X3 = *RK++ ^ RT0[ ( Y3       ) & 0xFF ] ^   \
310              RT1[ ( Y2 >>  8 ) & 0xFF ] ^   \
311              RT2[ ( Y1 >> 16 ) & 0xFF ] ^   \
312              RT3[ ( Y0 >> 24 ) & 0xFF ];    \
313     }
314 
315 
316 void aes_setkey_enc( aes_context* ctx, const unsigned char* key, int keysize )
317 {
318     int i;
319     unsigned int* RK;
320 
321     switch ( keysize )
322     {
323         case 128:
324             ctx->nr = 10;
325             break;
326         case 192:
327             ctx->nr = 12;
328             break;
329         case 256:
330             ctx->nr = 14;
331             break;
332         default :
333             keysize = 128;
334             ctx->nr = 10;
335             break;
336     }
337 
338     ctx->rk = RK = ctx->buf;
339 
340     memcpy( RK, key, keysize >> 3 );
341 
342     switch ( ctx->nr )
343     {
344         case 10:
345             for ( i = 0; i < 10; i++, RK += 4 )
346             {
347                 RK[4]  = RK[0] ^ RCON[i] ^
348                          ( ( unsigned int ) FSb[ ( RK[3] >>  8 ) & 0xFF ]       ) ^
349                          ( ( unsigned int ) FSb[ ( RK[3] >> 16 ) & 0xFF ] <<  8 ) ^
350                          ( ( unsigned int ) FSb[ ( RK[3] >> 24 ) & 0xFF ] << 16 ) ^
351                          ( ( unsigned int ) FSb[ ( RK[3]       ) & 0xFF ] << 24 );
352 
353                 RK[5]  = RK[1] ^ RK[4];
354                 RK[6]  = RK[2] ^ RK[5];
355                 RK[7]  = RK[3] ^ RK[6];
356             }
357             break;
358         case 12:
359             for ( i = 0; i < 8; i++, RK += 6 )
360             {
361                 RK[6]  = RK[0] ^ RCON[i] ^
362                          ( ( unsigned int ) FSb[ ( RK[5] >>  8 ) & 0xFF ]       ) ^
363                          ( ( unsigned int ) FSb[ ( RK[5] >> 16 ) & 0xFF ] <<  8 ) ^
364                          ( ( unsigned int ) FSb[ ( RK[5] >> 24 ) & 0xFF ] << 16 ) ^
365                          ( ( unsigned int ) FSb[ ( RK[5]       ) & 0xFF ] << 24 );
366 
367                 RK[7]  = RK[1] ^ RK[6];
368                 RK[8]  = RK[2] ^ RK[7];
369                 RK[9]  = RK[3] ^ RK[8];
370                 RK[10] = RK[4] ^ RK[9];
371                 RK[11] = RK[5] ^ RK[10];
372             }
373             break;
374         case 14:
375             for ( i = 0; i < 7; i++, RK += 8 )
376             {
377                 RK[8]  = RK[0] ^ RCON[i] ^
378                          ( ( unsigned int ) FSb[ ( RK[7] >>  8 ) & 0xFF ]       ) ^
379                          ( ( unsigned int ) FSb[ ( RK[7] >> 16 ) & 0xFF ] <<  8 ) ^
380                          ( ( unsigned int ) FSb[ ( RK[7] >> 24 ) & 0xFF ] << 16 ) ^
381                          ( ( unsigned int ) FSb[ ( RK[7]       ) & 0xFF ] << 24 );
382 
383                 RK[9]  = RK[1] ^ RK[8];
384                 RK[10] = RK[2] ^ RK[9];
385                 RK[11] = RK[3] ^ RK[10];
386 
387                 RK[12] = RK[4] ^
388                          ( ( unsigned int ) FSb[ ( RK[11]       ) & 0xFF ]       ) ^
389                          ( ( unsigned int ) FSb[ ( RK[11] >>  8 ) & 0xFF ] <<  8 ) ^
390                          ( ( unsigned int ) FSb[ ( RK[11] >> 16 ) & 0xFF ] << 16 ) ^
391                          ( ( unsigned int ) FSb[ ( RK[11] >> 24 ) & 0xFF ] << 24 );
392 
393                 RK[13] = RK[5] ^ RK[12];
394                 RK[14] = RK[6] ^ RK[13];
395                 RK[15] = RK[7] ^ RK[14];
396             }
397             break;
398     }
399 }
400 
401 
402 void aes_setkey_dec( aes_context* ctx, const unsigned char* key, int keysize )
403 {
404     int i, j;
405     aes_context cty;
406     unsigned int* RK;
407     unsigned int* SK;
408 
409     ctx->rk = RK = ctx->buf;
410 
411     aes_setkey_enc( &cty, key, keysize );
412     ctx->nr = cty.nr;
413     SK = cty.rk + ( cty.nr << 2 );
414 
415     memcpy( RK, SK, sizeof( unsigned int ) << 2 );
416     RK += 4;
417     SK -= 4;
418 
419     for ( i = ctx->nr - 1; i > 0; i--, SK -= 8 )
420     {
421         for ( j = 0; j < 4; j++, SK++ )
422         {
423             *RK++ = RT0[ FSb[ ( *SK       ) & 0xFF ] ] ^
424                     RT1[ FSb[ ( *SK >>  8 ) & 0xFF ] ] ^
425                     RT2[ FSb[ ( *SK >> 16 ) & 0xFF ] ] ^
426                     RT3[ FSb[ ( *SK >> 24 ) & 0xFF ] ];
427         }
428     }
429 
430     memcpy( RK, SK, sizeof( unsigned int ) << 2 );
431 }
432 
433 
434 void aes_crypt_ecb_update( aes_context* ctx, int mode, const unsigned char input[16], unsigned char output[16] )
435 {
436     int i;
437     unsigned int* RK;
438     unsigned int X[4], Y[4];
439 
440     RK = ctx->rk;
441 
442     for ( i = 0; i < 4; i ++ )
443     {
444         X[i] = ( *( ( unsigned int* )input + i ) ) ^ ( *RK++ );
445     }
446 
447     if ( mode == AES_DECRYPT )
448     {
449         for ( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
450         {
451             AES_RROUND( Y[0], Y[1], Y[2], Y[3], X[0], X[1], X[2], X[3] );
452             AES_RROUND( X[0], X[1], X[2], X[3], Y[0], Y[1], Y[2], Y[3] );
453         }
454 
455         AES_RROUND( Y[0], Y[1], Y[2], Y[3], X[0], X[1], X[2], X[3] );
456 
457         X[0] = *RK++ ^ \
458                ( ( unsigned int ) RSb[ ( Y[0]       ) & 0xFF ]       ) ^
459                ( ( unsigned int ) RSb[ ( Y[3] >>  8 ) & 0xFF ] <<  8 ) ^
460                ( ( unsigned int ) RSb[ ( Y[2] >> 16 ) & 0xFF ] << 16 ) ^
461                ( ( unsigned int ) RSb[ ( Y[1] >> 24 ) & 0xFF ] << 24 );
462 
463         X[1] = *RK++ ^ \
464                ( ( unsigned int ) RSb[ ( Y[1]       ) & 0xFF ]       ) ^
465                ( ( unsigned int ) RSb[ ( Y[0] >>  8 ) & 0xFF ] <<  8 ) ^
466                ( ( unsigned int ) RSb[ ( Y[3] >> 16 ) & 0xFF ] << 16 ) ^
467                ( ( unsigned int ) RSb[ ( Y[2] >> 24 ) & 0xFF ] << 24 );
468 
469         X[2] = *RK++ ^ \
470                ( ( unsigned int ) RSb[ ( Y[2]       ) & 0xFF ]       ) ^
471                ( ( unsigned int ) RSb[ ( Y[1] >>  8 ) & 0xFF ] <<  8 ) ^
472                ( ( unsigned int ) RSb[ ( Y[0] >> 16 ) & 0xFF ] << 16 ) ^
473                ( ( unsigned int ) RSb[ ( Y[3] >> 24 ) & 0xFF ] << 24 );
474 
475         X[3] = *RK++ ^ \
476                ( ( unsigned int ) RSb[ ( Y[3]       ) & 0xFF ]       ) ^
477                ( ( unsigned int ) RSb[ ( Y[2] >>  8 ) & 0xFF ] <<  8 ) ^
478                ( ( unsigned int ) RSb[ ( Y[1] >> 16 ) & 0xFF ] << 16 ) ^
479                ( ( unsigned int ) RSb[ ( Y[0] >> 24 ) & 0xFF ] << 24 );
480     }
481     else /* AES_ENCRYPT */
482     {
483         for ( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
484         {
485             AES_FROUND( Y[0], Y[1], Y[2], Y[3], X[0], X[1], X[2], X[3] );
486             AES_FROUND( X[0], X[1], X[2], X[3], Y[0], Y[1], Y[2], Y[3] );
487         }
488 
489         AES_FROUND( Y[0], Y[1], Y[2], Y[3], X[0], X[1], X[2], X[3] );
490 
491         X[0] = *RK++ ^ \
492                ( ( unsigned int ) FSb[ ( Y[0]       ) & 0xFF ]       ) ^
493                ( ( unsigned int ) FSb[ ( Y[1] >>  8 ) & 0xFF ] <<  8 ) ^
494                ( ( unsigned int ) FSb[ ( Y[2] >> 16 ) & 0xFF ] << 16 ) ^
495                ( ( unsigned int ) FSb[ ( Y[3] >> 24 ) & 0xFF ] << 24 );
496 
497         X[1] = *RK++ ^ \
498                ( ( unsigned int ) FSb[ ( Y[1]       ) & 0xFF ]       ) ^
499                ( ( unsigned int ) FSb[ ( Y[2] >>  8 ) & 0xFF ] <<  8 ) ^
500                ( ( unsigned int ) FSb[ ( Y[3] >> 16 ) & 0xFF ] << 16 ) ^
501                ( ( unsigned int ) FSb[ ( Y[0] >> 24 ) & 0xFF ] << 24 );
502 
503         X[2] = *RK++ ^ \
504                ( ( unsigned int ) FSb[ ( Y[2]       ) & 0xFF ]       ) ^
505                ( ( unsigned int ) FSb[ ( Y[3] >>  8 ) & 0xFF ] <<  8 ) ^
506                ( ( unsigned int ) FSb[ ( Y[0] >> 16 ) & 0xFF ] << 16 ) ^
507                ( ( unsigned int ) FSb[ ( Y[1] >> 24 ) & 0xFF ] << 24 );
508 
509         X[3] = *RK++ ^ \
510                ( ( unsigned int ) FSb[ ( Y[3]       ) & 0xFF ]       ) ^
511                ( ( unsigned int ) FSb[ ( Y[0] >>  8 ) & 0xFF ] <<  8 ) ^
512                ( ( unsigned int ) FSb[ ( Y[1] >> 16 ) & 0xFF ] << 16 ) ^
513                ( ( unsigned int ) FSb[ ( Y[2] >> 24 ) & 0xFF ] << 24 );
514     }
515 
516     memcpy( output, X, 16 );
517 }
518 
519 // free later
520 unsigned char* aes_crypt_ecb( aes_context* ctx, int mode, const unsigned char* input, int slen, int* dlen )
521 {
522     register int i;
523     register int n;
524     unsigned char* output;
525     unsigned char buff[16];
526 
527     if ( mode == AES_ENCRYPT )
528     {
529         n = 16 - ( slen & 15 );
530         *dlen = slen + n;
531 
532         output = ( unsigned char* )malloc( *dlen );
533         if ( !output )
534         {
535             return NULL;
536         }
537 
538         memset( buff, n, sizeof( buff ) );
539         if ( slen & 15 )
540         {
541             memcpy( buff, input + ( slen & ~15 ), slen & 15 );
542         }
543 
544         n = ( slen >> 4 );
545         for ( i = 0; i < n; i ++ )
546         {
547             aes_crypt_ecb_update( ctx, AES_ENCRYPT, \
548                                   input + ( i << 4 ), output + ( i << 4 ) );
549         }
550         aes_crypt_ecb_update( ctx, AES_ENCRYPT, buff, output + ( i << 4 ) );
551     }
552     else
553     {
554         output = ( unsigned char* )malloc( slen );
555         if ( !output )
556         {
557             return NULL;
558         }
559 
560         n = ( slen >> 4 );
561         for ( i = 0; i < n; i ++ )
562         {
563             aes_crypt_ecb_update( ctx, AES_DECRYPT, \
564                                   input + ( i << 4 ), output + ( i << 4 ) );
565         }
566 
567         *dlen = slen - ( int )output[slen - 1];
568     }
569 
570     return output;
571 }

 

与BASE64经常一起用

  1 #include "base64.h"
  2 
  3 static const unsigned char base64_enc_map[64] =
  4 {
  5     'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
  6     'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
  7     'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',
  8     'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
  9     'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
 10     'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7',
 11     '8', '9', '+', '/'
 12 };
 13 
 14 static const unsigned char base64_dec_map[128] =
 15 {
 16     127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
 17     127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
 18     127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
 19     127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
 20     127, 127, 127,  62, 127, 127, 127,  63,  52,  53,
 21     54,  55,  56,  57,  58,  59,  60,  61, 127, 127,
 22     127,  64, 127, 127, 127,   0,   1,   2,   3,   4,
 23     5,   6,   7,   8,   9,  10,  11,  12,  13,  14,
 24     15,  16,  17,  18,  19,  20,  21,  22,  23,  24,
 25     25, 127, 127, 127, 127, 127, 127,  26,  27,  28,
 26     29,  30,  31,  32,  33,  34,  35,  36,  37,  38,
 27     39,  40,  41,  42,  43,  44,  45,  46,  47,  48,
 28     49,  50,  51, 127, 127, 127, 127, 127
 29 };
 30 
 31 
 32 int base64_encode( char* dst, int* dlen, const unsigned char* src, int slen )
 33 {
 34     int i, n;
 35     int C1, C2, C3;
 36     char* p;
 37 
 38     if ( slen == 0 )
 39     {
 40         return 0;
 41     }
 42 
 43     n = ( slen << 3 ) / 6;
 44 
 45     switch ( ( slen << 3 ) - ( n * 6 ) )
 46     {
 47         case  2:
 48             n += 3;
 49             break;
 50         case  4:
 51             n += 2;
 52             break;
 53         default:
 54             break;
 55     }
 56 
 57     if ( *dlen < n + 1 )
 58     {
 59         *dlen = n + 1;
 60         return -1;
 61     }
 62 
 63     n = ( slen / 3 ) * 3;
 64 
 65     for ( i = 0, p = dst; i < n; i += 3 )
 66     {
 67         C1 = *src++;
 68         C2 = *src++;
 69         C3 = *src++;
 70 
 71         *p++ = base64_enc_map[( C1 >> 2 ) & 0x3F];
 72         *p++ = base64_enc_map[( ( ( C1 &  3 ) << 4 ) + ( C2 >> 4 ) ) & 0x3F];
 73         *p++ = base64_enc_map[( ( ( C2 & 15 ) << 2 ) + ( C3 >> 6 ) ) & 0x3F];
 74         *p++ = base64_enc_map[C3 & 0x3F];
 75     }
 76 
 77     if ( i < slen )
 78     {
 79         C1 = *src++;
 80         C2 = ( ( i + 1 ) < slen ) ? *src++ : 0;
 81 
 82         *p++ = base64_enc_map[( C1 >> 2 ) & 0x3F];
 83         *p++ = base64_enc_map[( ( ( C1 & 3 ) << 4 ) + ( C2 >> 4 ) ) & 0x3F];
 84 
 85         if ( ( i + 1 ) < slen )
 86         {
 87             *p++ = base64_enc_map[( ( C2 & 15 ) << 2 ) & 0x3F];
 88         }
 89         else
 90         {
 91             *p++ = '=';
 92         }
 93 
 94         *p++ = '=';
 95     }
 96 
 97     *dlen = p - dst;
 98     *p = 0;
 99 
100     return 0;
101 }
102 
103 
104 int base64_decode( unsigned char* dst, int* dlen, const char* src, int slen )
105 {
106     int i, j, n;
107     unsigned int x;
108     unsigned char* p;
109 
110     if ( slen == 0 )
111     {
112         return 0;
113     }
114 
115     for ( i = j = n = 0; i < slen; i++ )
116     {
117         if ( ( slen - i ) >= 2 &&
118                 src[i] == '\r' && src[i + 1] == '\n' )
119         {
120             continue;
121         }
122 
123         if ( src[i] == '\n' )
124         {
125             continue;
126         }
127 
128         if ( src[i] == '=' && ++j > 2 )
129         {
130             return -1;
131         }
132 
133         if ( src[i] < 0 || base64_dec_map[( int )src[i]] == 127 )
134         {
135             return -1;
136         }
137 
138         if ( base64_dec_map[( int )src[i]] < 64 && j != 0 )
139         {
140             return -1;
141         }
142 
143         n++;
144     }
145 
146     if ( n == 0 )
147     {
148         return 0;
149     }
150 
151     n = ( ( n * 6 ) + 7 ) >> 3;
152 
153     if ( *dlen < n )
154     {
155         *dlen = n;
156         return -1;
157     }
158 
159     for ( j = 3, n = x = 0, p = dst; i > 0; i--, src++ )
160     {
161         if ( *src == '\r' || *src == '\n' )
162         {
163             continue;
164         }
165 
166         j -= ( base64_dec_map[( int ) * src] == 64 );
167         x  = ( x << 6 ) | ( base64_dec_map[( int ) * src] & 0x3F );
168 
169         if ( ++ n == 4 )
170         {
171             n = 0;
172 
173             if ( j > 0 ) *p++ = ( unsigned char )( x >> 16 );
174 
175             if ( j > 1 ) *p++ = ( unsigned char )( x >>  8 );
176 
177             if ( j > 2 ) *p++ = ( unsigned char )( x     );
178         }
179     }
180 
181     *dlen = p - dst;
182 
183     return 0;
184 }

 

posted on 2015-05-15 20:45  郁郁思扬  阅读(10914)  评论(0编辑  收藏  举报

导航