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 }