📄 aes.cpp
字号:
temp[0] = Te0[(byte)(w[0])] ^ Te1[(byte)(w[1] >> 8)] ^ Te2[(byte)(w[2] >> 16)] ^ Te3[(byte)(w[3] >> 24)]; temp[1] = Te0[(byte)(w[1])] ^ Te1[(byte)(w[2] >> 8)] ^ Te2[(byte)(w[3] >> 16)] ^ Te3[(byte)(w[0] >> 24)]; temp[2] = Te0[(byte)(w[2])] ^ Te1[(byte)(w[3] >> 8)] ^ Te2[(byte)(w[0] >> 16)] ^ Te3[(byte)(w[1] >> 24)]; temp[3] = Te0[(byte)(w[3])] ^ Te1[(byte)(w[0] >> 8)] ^ Te2[(byte)(w[1] >> 16)] ^ Te3[(byte)(w[2] >> 24)]; for (i = 0; i < 4; i++) w[i] = temp[i];}//逆向列混淆加上移位static void InvMixColumns_ShiftRows(word w[4]){ int i; word temp[4]; temp[0] = Td0[(byte)(w[0])] ^ Td1[(byte)(w[3] >> 8)] ^ Td2[(byte)(w[2] >> 16)] ^ Td3[(byte)(w[1] >> 24)]; temp[1] = Td0[(byte)(w[1])] ^ Td1[(byte)(w[0] >> 8)] ^ Td2[(byte)(w[3] >> 16)] ^ Td3[(byte)(w[2] >> 24)]; temp[2] = Td0[(byte)(w[2])] ^ Td1[(byte)(w[1] >> 8)] ^ Td2[(byte)(w[0] >> 16)] ^ Td3[(byte)(w[3] >> 24)]; temp[3] = Td0[(byte)(w[3])] ^ Td1[(byte)(w[2] >> 8)] ^ Td2[(byte)(w[1] >> 16)] ^ Td3[(byte)(w[0] >> 24)]; for (i = 0; i < 4; i++) w[i] = temp[i];}//逆向列混淆static void InvMixColumns(word w[4]){ int i; word temp[4]; temp[0] = Td0[(byte)(w[0])] ^ Td1[(byte)(w[0] >> 8)] ^ Td2[(byte)(w[0] >> 16)] ^ Td3[(byte)(w[0] >> 24)]; temp[1] = Td0[(byte)(w[1])] ^ Td1[(byte)(w[1] >> 8)] ^ Td2[(byte)(w[1] >> 16)] ^ Td3[(byte)(w[1] >> 24)]; temp[2] = Td0[(byte)(w[2])] ^ Td1[(byte)(w[2] >> 8)] ^ Td2[(byte)(w[2] >> 16)] ^ Td3[(byte)(w[2] >> 24)]; temp[3] = Td0[(byte)(w[3])] ^ Td1[(byte)(w[3] >> 8)] ^ Td2[(byte)(w[3] >> 16)] ^ Td3[(byte)(w[3] >> 24)]; for (i = 0; i < 4; i++) w[i] = temp[i];}//轮密钥加static void AddRoundKey(word w[4], const word key[4]){ w[0] ^= key[0]; w[1] ^= key[1]; w[2] ^= key[2]; w[3] ^= key[3];}//密钥扩展算法static void KeyExpansion(const byte key[16], word w[44]){ word temp; int i; for (i = 0; i < 4; i++) {/* printf("%d\n", key[i]); */ w[i] = Byte2Word((byte *)&key[4*i]);/* printf("%08X\n", w[i]); */ } for (i = 4; i < 44; i++) { temp = w[i-1]; if (i%4 == 0) temp = SubWord(ROTWORD(temp)) ^ Rcon[i/4]; w[i] = w[i-4] ^ temp; }}//AES加密函数void AES_encrypt(const byte in[16], byte out[16], const byte key[16]){ word state[4], temp[4], key_ex[44]; int i; for (i = 0; i < 4; i++) state[i] = Byte2Word(&in[i*4]); KeyExpansion(key, key_ex); AddRoundKey(state, &key_ex[0]); for (i = 1; i < 10; i++) { MixColumns_ShifRows(state); AddRoundKey(state, &key_ex[i*4]); } temp[0] = sbox[(byte)(state[0])] | sbox[(byte)(state[1] >> 8)] << 8 | sbox[(byte)(state[2] >> 16)] << 16 | sbox[(byte)(state[3] >> 24)] << 24; temp[1] = sbox[(byte)(state[1])] | sbox[(byte)(state[2] >> 8)] << 8 | sbox[(byte)(state[3] >> 16)] << 16 | sbox[(byte)(state[0] >> 24)] << 24; temp[2] = sbox[(byte)(state[2])] | sbox[(byte)(state[3] >> 8)] << 8 | sbox[(byte)(state[0] >> 16)] << 16 | sbox[(byte)(state[1] >> 24)] << 24; temp[3] = sbox[(byte)(state[3])] | sbox[(byte)(state[0] >> 8)] << 8 | sbox[(byte)(state[1] >> 16)] << 16 | sbox[(byte)(state[2] >> 24)] << 24; AddRoundKey(temp, &key_ex[i*4]); for (i = 0; i < 4; i++) Word2Byte(temp[i], &out[i*4]);}//AES解密函数void AES_decrypt(const byte in[16], byte out[16], const byte key[16]){ word state[4], temp[4], key_ex[44]; int i; for (i = 0; i < 4; i++) state[i] = Byte2Word(&in[i*4]); KeyExpansion(key, key_ex); for (i = 1; i < 10; i++) { InvMixColumns(&key_ex[i*4]); } AddRoundKey(state, &key_ex[10 * 4]); for (i = 9; i > 0; i--) { state[0] = InvSubWord(state[0]); state[1] = InvSubWord(state[1]); state[2] = InvSubWord(state[2]); state[3] = InvSubWord(state[3]); InvMixColumns_ShiftRows(state); AddRoundKey(state, &key_ex[i*4]); } temp[0] = invsbox[(byte)(state[0])] | invsbox[(byte)(state[3] >> 8)] << 8 | invsbox[(byte)(state[2] >> 16)] << 16 | invsbox[(byte)(state[1] >> 24)] << 24; temp[1] = invsbox[(byte)(state[1])] | invsbox[(byte)(state[0] >> 8)] << 8 | invsbox[(byte)(state[3] >> 16)] << 16 | invsbox[(byte)(state[2] >> 24)] << 24; temp[2] = invsbox[(byte)(state[2])] | invsbox[(byte)(state[1] >> 8)] << 8 | invsbox[(byte)(state[0] >> 16)] << 16 | invsbox[(byte)(state[3] >> 24)] << 24; temp[3] = invsbox[(byte)(state[3])] | invsbox[(byte)(state[2] >> 8)] << 8 | invsbox[(byte)(state[1] >> 16)] << 16 | invsbox[(byte)(state[0] >> 24)] << 24; AddRoundKey(temp, &key_ex[i*4]); for (i = 0; i < 4; i++) Word2Byte(temp[i], &out[i*4]);}/* int main() *//* { *//* byte a[16] = {0, 1, 2, 3, 4, 5, 6, 7, *//* 8, 9, 10, 11, 12, 13, 14, 15}; *//* word w[44]; *//* word b[4] = {0x3d7c6ebd, 0x9e77b5f2, 0x6e21610b, 0x89b6108b}; *//* byte key[16] = {0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, *//* 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }; *//* int i; *//* byte input[] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, *//* 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}; *//* byte ckey[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, *//* 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}; *//* byte output[16]; *//* clock_t start, finish; *//* double duration; *//* start = clock(); *//* for (i = 0; i < 1000000; i++) *//* AES_encrypt(input, output, ckey); *//* finish = clock(); *//* duration = (double)(finish - start) / CLOCKS_PER_SEC; *//* printf("%lf\n", duration); *//* for (i = 0; i < 16; i++) *//* printf("%02x", output[i]); *//* printf("\n"); */ /* return 0; *//* } */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -