ft3校验码计算方法c语言实现,AES加密的C语言实现

#include

#include

#ifndef uint8

#define uint8 unsigned char

#endif

#ifndef uint32

#define uint32 unsigned long int

#endif

typedef struct

{

uint32 erk[]; /* encryption round keys */

uint32 drk[]; /* decryption round keys */

int nr; /* number of rounds */

}

aes_context;

//#define TEST

/* uncomment the following line to use pre-computed tables */

/* otherwise the tables will be generated at the first run */

/* #define FIXED_TABLES */

#ifndef FIXED_TABLES

/* forward S-box & tables */

uint32 FSb[];

uint32 FT0[];

uint32 FT1[];

uint32 FT2[];

uint32 FT3[];

/* reverse S-box & tables */

uint32 RSb[];

uint32 RT0[];

uint32 RT1[];

uint32 RT2[];

uint32 RT3[];

/* round constants */

uint32 RCON[];

/* tables generation flag */

int do_init = ;

/* tables generation routine */

#define ROTR8(x) ( ( ( x << 24 ) & 0xFFFFFFFF ) | \

((x & 0xFFFFFFFF) >> ))

#define XTIME(x) ( ( x << 1 ) ^ ( ( x & 0x80 ) ? 0x1B : 0x00 ) )

#define MUL(x,y) ( ( x && y ) ? pow[(log[x] + log[y]) % 255] : 0 )

void aes_gen_tables(void)

{

int i;

uint8 x, y;

uint8 pow[];

uint8 log[];

/* compute pow and log tables over GF(2^8) */

for (i = , x = ; i < ; i++, x ^= XTIME(x))

{

pow[i] = x;

log[x] = i;

}

/* calculate the round constants */

for (i = , x = ; i < ; i++, x = XTIME(x))

{

RCON[i] = (uint32)x << ;

}

/* generate the forward and reverse S-boxes */

FSb[0x00] = 0x63;

RSb[0x63] = 0x00;

for (i = ; i < ; i++)

{

x = pow[ - log[i]];

y = x; y = (y << ) | (y >> );

x ^= y; y = (y << ) | (y >> );

x ^= y; y = (y << ) | (y >> );

x ^= y; y = (y << ) | (y >> );

x ^= y ^ 0x63;

FSb[i] = x;

RSb[x] = i;

}

/* generate the forward and reverse tables */

for (i = ; i < ; i++)

{

x = (unsigned char)FSb[i]; y = XTIME(x);

FT0[i] = (uint32)(x ^ y) ^

((uint32)x << ) ^

((uint32)x << ) ^

((uint32)y << );

FT0[i] &= 0xFFFFFFFF;

FT1[i] = ROTR8(FT0[i]);

FT2[i] = ROTR8(FT1[i]);

FT3[i] = ROTR8(FT2[i]);

y = (unsigned char)RSb[i];

RT0[i] = ((uint32)MUL(0x0B, y)) ^

((uint32)MUL(0x0D, y) << ) ^

((uint32)MUL(0x09, y) << ) ^

((uint32)MUL(0x0E, y) << );

RT0[i] &= 0xFFFFFFFF;

RT1[i] = ROTR8(RT0[i]);

RT2[i] = ROTR8(RT1[i]);

RT3[i] = ROTR8(RT2[i]);

}

}

#else

/* forward S-box */

static const uint32 FSb[] =

{

0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5,

0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,

0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,

0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,

0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,

0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,

0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A,

0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,

0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,

0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,

0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B,

0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,

0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85,

0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,

0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,

0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,

0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17,

0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,

0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,

0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,

0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,

0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,

0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9,

0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,

0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,

0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,

0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,

0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,

0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94,

0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,

0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68,

0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16

};

/* forward tables */

#define FT \

\

V(C6, , , A5), V(F8, 7C, 7C, ), V(EE, , , ), V(F6, 7B, 7B, 8D), \

V(FF, F2, F2, 0D), V(D6, 6B, 6B, BD), V(DE, 6F, 6F, B1), V(, C5, C5, ), \

V(, , , ), V(, , , ), V(CE, , , A9), V(, 2B, 2B, 7D), \

V(E7, FE, FE, ), V(B5, D7, D7, ), V(4D, AB, AB, E6), V(EC, , , 9A), \

V(8F, CA, CA, ), V(1F, , , 9D), V(, C9, C9, ), V(FA, 7D, 7D, ), \

V(EF, FA, FA, ), V(B2, , , EB), V(8E, , , C9), V(FB, F0, F0, 0B), \

V(, AD, AD, EC), V(B3, D4, D4, ), V(5F, A2, A2, FD), V(, AF, AF, EA), \

V(, 9C, 9C, BF), V(, A4, A4, F7), V(E4, , , ), V(9B, C0, C0, 5B), \

V(, B7, B7, C2), V(E1, FD, FD, 1C), V(3D, , , AE), V(4C, , , 6A), \

V(6C, , , 5A), V(7E, 3F, 3F, ), V(F5, F7, F7, ), V(, CC, CC, 4F), \

V(, , , 5C), V(, A5, A5, F4), V(D1, E5, E5, ), V(F9, F1, F1, ), \

V(E2, , , ), V(AB, D8, D8, ), V(, , , ), V(2A, , , 3F), \

V(, , , 0C), V(, C7, C7, ), V(, , , ), V(9D, C3, C3, 5E), \

V(, , , ), V(, , , A1), V(0A, , , 0F), V(2F, 9A, 9A, B5), \

V(0E, , , ), V(, , , ), V(1B, , , 9B), V(DF, E2, E2, 3D), \

V(CD, EB, EB, ), V(4E, , , ), V(7F, B2, B2, CD), V(EA, , , 9F), \

V(, , , 1B), V(1D, , , 9E), V(, 2C, 2C, ), V(, 1A, 1A, 2E), \

V(, 1B, 1B, 2D), V(DC, 6E, 6E, B2), V(B4, 5A, 5A, EE), V(5B, A0, A0, FB), \

V(A4, , , F6), V(, 3B, 3B, 4D), V(B7, D6, D6, ), V(7D, B3, B3, CE), \

V(, , , 7B), V(DD, E3, E3, 3E), V(5E, 2F, 2F, ), V(, , , ), \

V(A6, , , F5), V(B9, D1, D1, ), V(, , , ), V(C1, ED, ED, 2C), \

V(, , , ), V(E3, FC, FC, 1F), V(, B1, B1, C8), V(B6, 5B, 5B, ED), \

V(D4, 6A, 6A, BE), V(8D, CB, CB, ), V(, BE, BE, D9), V(, , , 4B), \

V(, 4A, 4A, DE), V(, 4C, 4C, D4), V(B0, , , E8), V(, CF, CF, 4A), \

V(BB, D0, D0, 6B), V(C5, EF, EF, 2A), V(4F, AA, AA, E5), V(ED, FB, FB, ), \

V(, , , C5), V(9A, 4D, 4D, D7), V(, , , ), V(, , , ), \

V(8A, , , CF), V(E9, F9, F9, ), V(, , , ), V(FE, 7F, 7F, ), \

V(A0, , , F0), V(, 3C, 3C, ), V(, 9F, 9F, BA), V(4B, A8, A8, E3), \

V(A2, , , F3), V(5D, A3, A3, FE), V(, , , C0), V(, 8F, 8F, 8A), \

V(3F, , , AD), V(, 9D, 9D, BC), V(, , , ), V(F1, F5, F5, ), \

V(, BC, BC, DF), V(, B6, B6, C1), V(AF, DA, DA, ), V(, , , ), \

V(, , , ), V(E5, FF, FF, 1A), V(FD, F3, F3, 0E), V(BF, D2, D2, 6D), \

V(, CD, CD, 4C), V(, 0C, 0C, ), V(, , , ), V(C3, EC, EC, 2F), \

V(BE, 5F, 5F, E1), V(, , , A2), V(, , , CC), V(2E, , , ), \

V(, C4, C4, ), V(, A7, A7, F2), V(FC, 7E, 7E, ), V(7A, 3D, 3D, ), \

V(C8, , , AC), V(BA, 5D, 5D, E7), V(, , , 2B), V(E6, , , ), \

V(C0, , , A0), V(, , , ), V(9E, 4F, 4F, D1), V(A3, DC, DC, 7F), \

V(, , , ), V(, 2A, 2A, 7E), V(3B, , , AB), V(0B, , , ), \

V(8C, , , CA), V(C7, EE, EE, ), V(6B, B8, B8, D3), V(, , , 3C), \

V(A7, DE, DE, ), V(BC, 5E, 5E, E2), V(, 0B, 0B, 1D), V(AD, DB, DB, ), \

V(DB, E0, E0, 3B), V(, , , ), V(, 3A, 3A, 4E), V(, 0A, 0A, 1E), \

V(, , , DB), V(0C, , , 0A), V(, , , 6C), V(B8, 5C, 5C, E4), \

V(9F, C2, C2, 5D), V(BD, D3, D3, 6E), V(, AC, AC, EF), V(C4, , , A6), \

V(, , , A8), V(, , , A4), V(D3, E4, E4, ), V(F2, , , 8B), \

V(D5, E7, E7, ), V(8B, C8, C8, ), V(6E, , , ), V(DA, 6D, 6D, B7), \

V(, 8D, 8D, 8C), V(B1, D5, D5, ), V(9C, 4E, 4E, D2), V(, A9, A9, E0), \

V(D8, 6C, 6C, B4), V(AC, , , FA), V(F3, F4, F4, ), V(CF, EA, EA, ), \

V(CA, , , AF), V(F4, 7A, 7A, 8E), V(, AE, AE, E9), V(, , , ), \

V(6F, BA, BA, D5), V(F0, , , ), V(4A, , , 6F), V(5C, 2E, 2E, ), \

V(, 1C, 1C, ), V(, A6, A6, F1), V(, B4, B4, C7), V(, C6, C6, ), \

V(CB, E8, E8, ), V(A1, DD, DD, 7C), V(E8, , , 9C), V(3E, 1F, 1F, ), \

V(, 4B, 4B, DD), V(, BD, BD, DC), V(0D, 8B, 8B, ), V(0F, 8A, 8A, ), \

V(E0, , , ), V(7C, 3E, 3E, ), V(, B5, B5, C4), V(CC, , , AA), \

V(, , , D8), V(, , , ), V(F7, F6, F6, ), V(1C, 0E, 0E, ), \

V(C2, , , A3), V(6A, , , 5F), V(AE, , , F9), V(, B9, B9, D0), \

V(, , , ), V(, C1, C1, ), V(3A, 1D, 1D, ), V(, 9E, 9E, B9), \

V(D9, E1, E1, ), V(EB, F8, F8, ), V(2B, , , B3), V(, , , ), \

V(D2, , , BB), V(A9, D9, D9, ), V(, 8E, 8E, ), V(, , , A7), \

V(2D, 9B, 9B, B6), V(3C, 1E, 1E, ), V(, , , ), V(C9, E9, E9, ), \

V(, CE, CE, ), V(AA, , , FF), V(, , , ), V(A5, DF, DF, 7A), \

V(, 8C, 8C, 8F), V(, A1, A1, F8), V(, , , ), V(1A, 0D, 0D, ), \

V(, BF, BF, DA), V(D7, E6, E6, ), V(, , , C6), V(D0, , , B8), \

V(, , , C3), V(, , , B0), V(5A, 2D, 2D, ), V(1E, 0F, 0F, ), \

V(7B, B0, B0, CB), V(A8, , , FC), V(6D, BB, BB, D6), V(2C, , , 3A)

#define V(a,b,c,d) 0x##a##b##c##d

static const uint32 FT0[] = { FT };

#undef V

#define V(a,b,c,d) 0x##d##a##b##c

static const uint32 FT1[] = { FT };

#undef V

#define V(a,b,c,d) 0x##c##d##a##b

static const uint32 FT2[] = { FT };

#undef V

#define V(a,b,c,d) 0x##b##c##d##a

static const uint32 FT3[] = { FT };

#undef V

#undef FT

/* reverse S-box */

static const uint32 RSb[] =

{

0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38,

0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,

0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,

0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,

0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D,

0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,

0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2,

0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,

0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,

0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,

0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA,

0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,

0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A,

0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,

0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,

0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,

0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA,

0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,

0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,

0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,

0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,

0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,

0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20,

0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,

0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31,

0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,

0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,

0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,

0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0,

0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,

0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26,

0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D

};

/* reverse tables */

#define RT \

\

V(, F4, A7, ), V(7E, , , ), V(1A, , A4, C3), V(3A, , 5E, ), \

V(3B, AB, 6B, CB), V(1F, 9D, , F1), V(AC, FA, , AB), V(4B, E3, , ), \

V(, , FA, ), V(AD, , 6D, F6), V(, CC, , ), V(F5, , 4C, ), \

V(4F, E5, D7, FC), V(C5, 2A, CB, D7), V(, , , ), V(B5, , A3, 8F), \

V(DE, B1, 5A, ), V(, BA, 1B, ), V(, EA, 0E, ), V(5D, FE, C0, E1), \

V(C3, 2F, , ), V(, 4C, F0, ), V(8D, , , A3), V(6B, D3, F9, C6), \

V(, 8F, 5F, E7), V(, , 9C, ), V(BF, 6D, 7A, EB), V(, , , DA), \

V(D4, BE, , 2D), V(, , , D3), V(, E0, , ), V(8E, C9, C8, ), \

V(, C2, , 6A), V(F4, 8E, , ), V(, , 3E, 6B), V(, B9, , DD), \

V(BE, E1, 4F, B6), V(F0, , AD, ), V(C9, , AC, ), V(7D, CE, 3A, B4), \

V(, DF, 4A, ), V(E5, 1A, , ), V(, , , ), V(, , 7F, ), \

V(B1, , , E0), V(BB, 6B, AE, ), V(FE, , A0, 1C), V(F9, , 2B, ), \

V(, , , ), V(8F, , FD, ), V(, DE, 6C, ), V(, 7B, F8, B7), \

V(AB, , D3, ), V(, 4B, , E2), V(E3, 1F, 8F, ), V(, , AB, 2A), \

V(B2, EB, , ), V(2F, B5, C2, ), V(, C5, 7B, 9A), V(D3, , , A5), \

V(, , , F2), V(, BF, A5, B2), V(, , 6A, BA), V(ED, , , 5C), \

V(8A, CF, 1C, 2B), V(A7, , B4, ), V(F3, , F2, F0), V(4E, , E2, A1), \

V(, DA, F4, CD), V(, , BE, D5), V(D1, , , 1F), V(C4, A6, FE, 8A), \

V(, 2E, , 9D), V(A2, F3, , A0), V(, 8A, E1, ), V(A4, F6, EB, ), \

V(0B, , EC, ), V(, , EF, AA), V(5E, , 9F, ), V(BD, 6E, , ), \

V(3E, , 8A, F9), V(, DD, , 3D), V(DD, 3E, , AE), V(4D, E6, BD, ), \

V(, , 8D, B5), V(, C4, 5D, ), V(, , D4, 6F), V(, , , FF), \

V(, , FB, ), V(D6, BD, E9, ), V(, , , CC), V(, D9, 9E, ), \

V(B0, E8, , BD), V(, , 8B, ), V(E7, , 5B, ), V(, C8, EE, DB), \

V(A1, 7C, 0A, ), V(7C, , 0F, E9), V(F8, , 1E, C9), V(, , , ), \

V(, , , ), V(, 2B, ED, ), V(1E, , , AC), V(6C, 5A, , 4E), \

V(FD, 0E, FF, FB), V(0F, , , ), V(3D, AE, D5, 1E), V(, 2D, , ), \

V(0A, 0F, D9, ), V(, 5C, A6, ), V(9B, 5B, , D1), V(, , 2E, 3A), \

V(0C, 0A, , B1), V(, , E7, 0F), V(B4, EE, , D2), V(1B, 9B, , 9E), \

V(, C0, C5, 4F), V(, DC, , A2), V(5A, , 4B, ), V(1C, , 1A, ), \

V(E2, , BA, 0A), V(C0, A0, 2A, E5), V(3C, , E0, ), V(, 1B, , 1D), \

V(0E, , 0D, 0B), V(F2, 8B, C7, AD), V(2D, B6, A8, B9), V(, 1E, A9, C8), \

V(, F1, , ), V(AF, , , 4C), V(EE, , DD, BB), V(A3, 7F, , FD), \

V(F7, , , 9F), V(5C, , F5, BC), V(, , 3B, C5), V(5B, FB, 7E, ), \

V(8B, , , ), V(CB, , C6, DC), V(B6, ED, FC, ), V(B8, E4, F1, ), \

V(D7, , DC, CA), V(, , , ), V(, , , ), V(, C6, , ), \

V(, 4A, , 7D), V(D2, BB, 3D, F8), V(AE, F9, , ), V(C7, , A1, 6D), \

V(1D, 9E, 2F, 4B), V(DC, B2, , F3), V(0D, , , EC), V(, C1, E3, D0), \

V(2B, B3, , 6C), V(A9, , B9, ), V(, , , FA), V(, E9, , ), \

V(A8, FC, 8C, C4), V(A0, F0, 3F, 1A), V(, 7D, 2C, D8), V(, , , EF), \

V(, , 4E, C7), V(D9, , D1, C1), V(8C, CA, A2, FE), V(, D4, 0B, ), \

V(A6, F5, , CF), V(A5, 7A, DE, ), V(DA, B7, 8E, ), V(3F, AD, BF, A4), \

V(2C, 3A, 9D, E4), V(, , , 0D), V(6A, 5F, CC, 9B), V(, 7E, , ), \

V(F6, 8D, , C2), V(, D8, B8, E8), V(2E, , F7, 5E), V(, C3, AF, F5), \

V(9F, 5D, , BE), V(, D0, , 7C), V(6F, D5, 2D, A9), V(CF, , , B3), \

V(C8, AC, , 3B), V(, , 7D, A7), V(E8, 9C, , 6E), V(DB, 3B, BB, 7B), \

V(CD, , , ), V(6E, , , F4), V(EC, 9A, B7, ), V(, 4F, 9A, A8), \

V(E6, , 6E, ), V(AA, FF, E6, 7E), V(, BC, CF, ), V(EF, , E8, E6), \

V(BA, E7, 9B, D9), V(4A, 6F, , CE), V(EA, 9F, , D4), V(, B0, 7C, D6), \

V(, A4, B2, AF), V(2A, 3F, , ), V(C6, A5, , ), V(, A2, , C0), \

V(, 4E, BC, ), V(FC, , CA, A6), V(E0, , D0, B0), V(, A7, D8, ), \

V(F1, , , 4A), V(, EC, DA, F7), V(7F, CD, , 0E), V(, , F6, 2F), \

V(, 4D, D6, 8D), V(, EF, B0, 4D), V(CC, AA, 4D, ), V(E4, , , DF), \

V(9E, D1, B5, E3), V(4C, 6A, , 1B), V(C1, 2C, 1F, B8), V(, , , 7F), \

V(9D, 5E, EA, ), V(, 8C, , 5D), V(FA, , , ), V(FB, 0B, , 2E), \

V(B3, , 1D, 5A), V(, DB, D2, ), V(E9, , , ), V(6D, D6, , ), \

V(9A, D7, , 8C), V(, A1, 0C, 7A), V(, F8, , 8E), V(EB, , 3C, ), \

V(CE, A9, , EE), V(B7, , C9, ), V(E1, 1C, E5, ED), V(7A, , B1, 3C), \

V(9C, D2, DF, ), V(, F2, , 3F), V(, , CE, ), V(, C7, , BF), \

V(, F7, CD, EA), V(5F, FD, AA, 5B), V(DF, 3D, 6F, ), V(, , DB, ), \

V(CA, AF, F3, ), V(B9, , C4, 3E), V(, , , 2C), V(C2, A3, , 5F), \

V(, 1D, C3, ), V(BC, E2, , 0C), V(, 3C, , 8B), V(FF, 0D, , ), \

V(, A8, , ), V(, 0C, B3, DE), V(D8, B4, E4, 9C), V(, , C1, ), \

V(7B, CB, , ), V(D5, , B6, ), V(, 6C, 5C, ), V(D0, B8, , )

#define V(a,b,c,d) 0x##a##b##c##d

static const uint32 RT0[] = { RT };

#undef V

#define V(a,b,c,d) 0x##d##a##b##c

static const uint32 RT1[] = { RT };

#undef V

#define V(a,b,c,d) 0x##c##d##a##b

static const uint32 RT2[] = { RT };

#undef V

#define V(a,b,c,d) 0x##b##c##d##a

static const uint32 RT3[] = { RT };

#undef V

#undef RT

/* round constants */

static const uint32 RCON[] =

{

0x01000000, 0x02000000, 0x04000000, 0x08000000,

0x10000000, 0x20000000, 0x40000000, 0x80000000,

0x1B000000, 0x36000000

};

int do_init = ;

void aes_gen_tables(void)

{

}

#endif

/* platform-independant 32-bit integer manipulation macros */

#define GET_UINT32(n,b,i) \

{ \

(n) = ((uint32)(b)[(i)] << ) \

| ((uint32)(b)[(i)+] << ) \

| ((uint32)(b)[(i)+] << ) \

| ((uint32)(b)[(i)+]); \

}

#define PUT_UINT32(n,b,i) \

{ \

(b)[(i)] = (uint8)((n) >> ); \

(b)[(i)+] = (uint8)((n) >> ); \

(b)[(i)+] = (uint8)((n) >> ); \

(b)[(i)+] = (uint8)((n)); \

}

/* decryption key schedule tables */

int KT_init = ;

uint32 KT0[];

uint32 KT1[];

uint32 KT2[];

uint32 KT3[];

/* AES key scheduling routine */

int aes_set_key(aes_context *ctx, uint8 *key)

{

int i;

uint32 *RK, *SK;

if (do_init)

{

aes_gen_tables();

do_init = ;

}

ctx->nr = ;

/*switch( nbits )

{

case 128: ctx->nr = 10; break;

case 192: ctx->nr = 12; break;

case 256: ctx->nr = 14; break;

default : return( 1 );

}*/

RK = ctx->erk;

for (i = ; i < ; i++)

{

GET_UINT32(RK[i], key, i * );

}

for (i = ; i < ; i++, RK += )

{

RK[] = RK[] ^ RCON[i] ^

(FSb[(uint8)(RK[] >> )] << ) ^

(FSb[(uint8)(RK[] >> )] << ) ^

(FSb[(uint8)(RK[])] << ) ^

(FSb[(uint8)(RK[] >> )]);

RK[] = RK[] ^ RK[];

RK[] = RK[] ^ RK[];

RK[] = RK[] ^ RK[];

RK[] = RK[] ^

(FSb[(uint8)(RK[] >> )] << ) ^

(FSb[(uint8)(RK[] >> )] << ) ^

(FSb[(uint8)(RK[] >> )] << ) ^

(FSb[(uint8)(RK[])]);

RK[] = RK[] ^ RK[];

RK[] = RK[] ^ RK[];

RK[] = RK[] ^ RK[];

}

/* setup decryption round keys */

if (KT_init)

{

for (i = ; i < ; i++)

{

KT0[i] = RT0[FSb[i]];

KT1[i] = RT1[FSb[i]];

KT2[i] = RT2[FSb[i]];

KT3[i] = RT3[FSb[i]];

}

KT_init = ;

}

SK = ctx->drk;

*SK++ = *RK++;

*SK++ = *RK++;

*SK++ = *RK++;

*SK++ = *RK++;

for (i = ; i < ; i++)

{

RK -= ;

*SK++ = KT0[(uint8)(*RK >> )] ^

KT1[(uint8)(*RK >> )] ^

KT2[(uint8)(*RK >> )] ^

KT3[(uint8)(*RK)]; RK++;

*SK++ = KT0[(uint8)(*RK >> )] ^

KT1[(uint8)(*RK >> )] ^

KT2[(uint8)(*RK >> )] ^

KT3[(uint8)(*RK)]; RK++;

*SK++ = KT0[(uint8)(*RK >> )] ^

KT1[(uint8)(*RK >> )] ^

KT2[(uint8)(*RK >> )] ^

KT3[(uint8)(*RK)]; RK++;

*SK++ = KT0[(uint8)(*RK >> )] ^

KT1[(uint8)(*RK >> )] ^

KT2[(uint8)(*RK >> )] ^

KT3[(uint8)(*RK)]; RK++;

}

RK -= ;

*SK++ = *RK++;

*SK++ = *RK++;

*SK++ = *RK++;

*SK++ = *RK++;

return();

}

/* AES 256-bit block encryption routine */

void aes_encrypt(aes_context *ctx, uint8 input[], uint8 output[])

{

uint32 *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;

RK = ctx->erk;

GET_UINT32(X0, input, ); X0 ^= RK[];

GET_UINT32(X1, input, ); X1 ^= RK[];

GET_UINT32(X2, input, ); X2 ^= RK[];

GET_UINT32(X3, input, ); X3 ^= RK[];

#define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \

{ \

RK += ; \

\

X0 = RK[] ^ FT0[(uint8)(Y0 >> )] ^ \

FT1[(uint8)(Y1 >> )] ^ \

FT2[(uint8)(Y2 >> )] ^ \

FT3[(uint8)(Y3)]; \

\

X1 = RK[] ^ FT0[(uint8)(Y1 >> )] ^ \

FT1[(uint8)(Y2 >> )] ^ \

FT2[(uint8)(Y3 >> )] ^ \

FT3[(uint8)(Y0)]; \

\

X2 = RK[] ^ FT0[(uint8)(Y2 >> )] ^ \

FT1[(uint8)(Y3 >> )] ^ \

FT2[(uint8)(Y0 >> )] ^ \

FT3[(uint8)(Y1)]; \

\

X3 = RK[] ^ FT0[(uint8)(Y3 >> )] ^ \

FT1[(uint8)(Y0 >> )] ^ \

FT2[(uint8)(Y1 >> )] ^ \

FT3[(uint8)(Y2)]; \

}

AES_FROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3); /* round 1 */

AES_FROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3); /* round 2 */

AES_FROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3); /* round 3 */

AES_FROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3); /* round 4 */

AES_FROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3); /* round 5 */

AES_FROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3); /* round 6 */

AES_FROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3); /* round 7 */

AES_FROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3); /* round 8 */

AES_FROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3); /* round 9 */

// if( ctx->nr > 10 )

//{

AES_FROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3); /* round 10 */

AES_FROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3); /* round 11 */

//}

AES_FROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3); /* round 12 */

AES_FROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3); /* round 13 */

/* last round */

RK += ;

X0 = RK[] ^ (FSb[(uint8)(Y0 >> )] << ) ^

(FSb[(uint8)(Y1 >> )] << ) ^

(FSb[(uint8)(Y2 >> )] << ) ^

(FSb[(uint8)(Y3)]);

X1 = RK[] ^ (FSb[(uint8)(Y1 >> )] << ) ^

(FSb[(uint8)(Y2 >> )] << ) ^

(FSb[(uint8)(Y3 >> )] << ) ^

(FSb[(uint8)(Y0)]);

X2 = RK[] ^ (FSb[(uint8)(Y2 >> )] << ) ^

(FSb[(uint8)(Y3 >> )] << ) ^

(FSb[(uint8)(Y0 >> )] << ) ^

(FSb[(uint8)(Y1)]);

X3 = RK[] ^ (FSb[(uint8)(Y3 >> )] << ) ^

(FSb[(uint8)(Y0 >> )] << ) ^

(FSb[(uint8)(Y1 >> )] << ) ^

(FSb[(uint8)(Y2)]);

PUT_UINT32(X0, output, );

PUT_UINT32(X1, output, );

PUT_UINT32(X2, output, );

PUT_UINT32(X3, output, );

}

/* AES 256-bit block decryption routine */

void aes_decrypt(aes_context *ctx, uint8 input[], uint8 output[])

{

uint32 *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;

RK = ctx->drk;

GET_UINT32(X0, input, ); X0 ^= RK[];

GET_UINT32(X1, input, ); X1 ^= RK[];

GET_UINT32(X2, input, ); X2 ^= RK[];

GET_UINT32(X3, input, ); X3 ^= RK[];

#define AES_RROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \

{ \

RK += ; \

\

X0 = RK[] ^ RT0[(uint8)(Y0 >> )] ^ \

RT1[(uint8)(Y3 >> )] ^ \

RT2[(uint8)(Y2 >> )] ^ \

RT3[(uint8)(Y1)]; \

\

X1 = RK[] ^ RT0[(uint8)(Y1 >> )] ^ \

RT1[(uint8)(Y0 >> )] ^ \

RT2[(uint8)(Y3 >> )] ^ \

RT3[(uint8)(Y2)]; \

\

X2 = RK[] ^ RT0[(uint8)(Y2 >> )] ^ \

RT1[(uint8)(Y1 >> )] ^ \

RT2[(uint8)(Y0 >> )] ^ \

RT3[(uint8)(Y3)]; \

\

X3 = RK[] ^ RT0[(uint8)(Y3 >> )] ^ \

RT1[(uint8)(Y2 >> )] ^ \

RT2[(uint8)(Y1 >> )] ^ \

RT3[(uint8)(Y0)]; \

}

AES_RROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3); /* round 1 */

AES_RROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3); /* round 2 */

AES_RROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3); /* round 3 */

AES_RROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3); /* round 4 */

AES_RROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3); /* round 5 */

AES_RROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3); /* round 6 */

AES_RROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3); /* round 7 */

AES_RROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3); /* round 8 */

AES_RROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3); /* round 9 */

// if( ctx->nr > 10 )

//{

AES_RROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3); /* round 10 */

AES_RROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3); /* round 11 */

//}

AES_RROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3); /* round 12 */

AES_RROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3); /* round 13 */

/* last round */

RK += ;

X0 = RK[] ^ (RSb[(uint8)(Y0 >> )] << ) ^

(RSb[(uint8)(Y3 >> )] << ) ^

(RSb[(uint8)(Y2 >> )] << ) ^

(RSb[(uint8)(Y1)]);

X1 = RK[] ^ (RSb[(uint8)(Y1 >> )] << ) ^

(RSb[(uint8)(Y0 >> )] << ) ^

(RSb[(uint8)(Y3 >> )] << ) ^

(RSb[(uint8)(Y2)]);

X2 = RK[] ^ (RSb[(uint8)(Y2 >> )] << ) ^

(RSb[(uint8)(Y1 >> )] << ) ^

(RSb[(uint8)(Y0 >> )] << ) ^

(RSb[(uint8)(Y3)]);

X3 = RK[] ^ (RSb[(uint8)(Y3 >> )] << ) ^

(RSb[(uint8)(Y2 >> )] << ) ^

(RSb[(uint8)(Y1 >> )] << ) ^

(RSb[(uint8)(Y0)]);

PUT_UINT32(X0, output, );

PUT_UINT32(X1, output, );

PUT_UINT32(X2, output, );

PUT_UINT32(X3, output, );

}

/*

传进参数:密钥;加密字符串;密文存储文件

密钥会被自动填充或者截取为32字节

*/

void AES(unsigned char *key, unsigned char *buf, FILE *fp)

{

aes_context ctx;

char *keytemp;

//密钥拓展成32字节

for (int i=,j=; i

{

if (key[i] != )

{

keytemp[i] = key[i];

j++;

}

else{

keytemp[i] = key[i%j];

}

}

printf("拓展后的密钥:", keytemp);

aes_set_key(&ctx, keytemp);

for (int k = ; buf != '\0'; k++)

{

if (k%==)

aes_encrypt(&ctx, buf, buf);

}

}

int main(void)

{

//int m, n, i, j;

int i;

//char c;

aes_context ctx;

unsigned char buf[];

unsigned char key[] = { 'f', 'e', 'f', '', 'f', 'e', 'g', 'h', 'b', 'v', 'c', 'x', 'z', 'q', 'e', 'w', 'f', 'e', 'f', '', 'f', 'e', 'g', 'h', 'f', 'e', 'f', '', 'f', 'e', 'g', 'h' };

printf("输入32个字符作为秘钥\n");

scanf("%s",key);

printf(key);

printf("输入加密数据\n");

scanf("%s", buf);

aes_set_key(&ctx, key);

/* for (i = 0; i<16; i++)

{

buf[i] = 'd';

}*/

printf("the data to encrypt:\n");

for (i = ; i

{

printf("%02x ", buf[i]);

}

printf("\n");

getchar();

aes_encrypt(&ctx, buf, buf);

printf("The encrypted data is:\n");

for (i = ; i

{

printf("%02x ", buf[i]);

}

printf("\n");

printf("\n");

// aes_set_key( &ctx, key, 128 + n * 64 );

aes_decrypt(&ctx, buf, buf);

printf("The decrypted data is:\n");

for (i = ; i

{

printf("%02x ", buf[i]);

}

printf("\n");

getchar();

return ;

}

//#endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值