zoukankan      html  css  js  c++  java
  • 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] == '
    ' && src[i + 1] == '
    ' )
    119         {
    120             continue;
    121         }
    122 
    123         if ( src[i] == '
    ' )
    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 == '
    ' || *src == '
    ' )
    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 }
  • 相关阅读:
    MAC 使用git时 不自动补全
    MAC 下 安装redis 并配置 php redis 扩展
    PHP日志 LOG4PHP 的配置与使用
    PHP数组 转 对象/对象 转 数组
    将数组打印到txt文件中
    Yii2控制器 返回 json 格式数据
    控制流输出26大小写英文字母
    员工领导部门关系类
    重写父类
    递归(recursion)
  • 原文地址:https://www.cnblogs.com/javado/p/4506822.html
Copyright © 2011-2022 走看看