| 查看: 1048 | 回复: 6 | ||
[求助]
AES或DES加密
|
| 求一个用C或C++编程实现的DES或AES算法的加密。程序中要有较详细的注解。谢谢各位高手大拿! |
» 猜你喜欢
售一区SCI文章T0P,我:8O.551.O54,科目全,可十急
已经有6人回复
售一区SCI文章T0P,我:8O.551.O54,科目全,可十急
已经有6人回复
售SCI一区文章,我:8.O.551.O.5.4,科目全,可伽急
已经有7人回复
售SCI-T0P文章,我:8O.5.5.1.O.54,科目齐全,可+急
已经有11人回复
售SCI一区T0P文章,我:8.O.55.1.O54,科目全,可伽急
已经有11人回复
售SCI一区T0P文章,我:8O.55.1.O.5.4,科目齐全,可+急
已经有13人回复
售SCI一区T0P文章,我:8.O.55.1.O54,科目全,可伽急
已经有8人回复
售SCI一区T0P文章,我:8.O.55.1.O.5.4,科目全,可+急
已经有8人回复
售SCI一区T0P文章,我:8.O55.1.O.54,科目全,可十急
已经有14人回复
售SCI一区T0P文章,我:8O.55.1.O.5.4,科目齐全,可+急
已经有11人回复
» 本主题相关价值贴推荐,对您同样有帮助:
硬盘加密软件V7.1(含汉化包)【原创】
已经有38人回复

2楼2013-03-10 22:44:37

3楼2013-03-11 00:42:11
【答案】应助回帖
★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
感谢参与,应助指数 +1
zx521: 金币+20, ★有帮助, 嗯,努力找呢 2013-03-11 17:23:01
感谢参与,应助指数 +1
zx521: 金币+20, ★有帮助, 嗯,努力找呢 2013-03-11 17:23:01

4楼2013-03-11 08:57:49
【答案】应助回帖
★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
感谢参与,应助指数 +1
zx521: 金币+40, ★★★很有帮助, 能不能带点注释,有点深- -还是谢谢了 2013-03-11 17:25:31
感谢参与,应助指数 +1
zx521: 金币+40, ★★★很有帮助, 能不能带点注释,有点深- -还是谢谢了 2013-03-11 17:25:31
|
// AES_3.cpp : Defines the entry point for the DLL application. // #include "stdafx.h" #include "AES_3.h" BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } unsigned char block1[16] = { 0x04,0x00,0x07,0x00, 0x08,0x00,0xde,0x03, 0x6e,0x00,0xdc,0x00, 0x03,0x07,0x04,0x1e }; unsigned char key1[16]= { 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00 }; static const unsigned char S_box[256] = { 99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, 118, 202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, 156, 164, 114, 192, 183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 113, 216, 49, 21, 4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226, 235, 39, 178, 117, 9, 131, 44, 26, 27, 110, 90, 160, 82, 59, 214, 179, 41, 227, 47, 132, 83, 209, 0, 237, 32, 252, 177, 91, 106, 203, 190, 57, 74, 76, 88, 207, 208, 239, 170, 251, 67, 77, 51, 133, 69, 249, 2, 127, 80, 60, 159, 168, 81, 163, 64, 143, 146, 157, 56, 245, 188, 182, 218, 33, 16, 255, 243, 210, 205, 12, 19, 236, 95, 151, 68, 23, 196, 167, 126, 61, 100, 93, 25, 115, 96, 129, 79, 220, 34, 42, 144, 136, 70, 238, 184, 20, 222, 94, 11, 219, 224, 50, 58, 10, 73, 6, 36, 92, 194, 211, 172, 98, 145, 149, 228, 121, 231, 200, 55, 109, 141, 213, 78, 169, 108, 86, 244, 234, 101, 122, 174, 8, 186, 120, 37, 46, 28, 166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138, 112, 62, 181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158, 225, 248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223, 140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84, 187, 22, }; static const unsigned char Si_box[256] = { 82, 9, 106, 213, 48, 54, 165, 56, 191, 64, 163, 158, 129, 243, 215, 251, 124, 227, 57, 130, 155, 47, 255, 135, 52, 142, 67, 68, 196, 222, 233, 203, 84, 123, 148, 50, 166, 194, 35, 61, 238, 76, 149, 11, 66, 250, 195, 78, 8, 46, 161, 102, 40, 217, 36, 178, 118, 91, 162, 73, 109, 139, 209, 37, 114, 248, 246, 100, 134, 104, 152, 22, 212, 164, 92, 204, 93, 101, 182, 146, 108, 112, 72, 80, 253, 237, 185, 218, 94, 21, 70, 87, 167, 141, 157, 132, 144, 216, 171, 0, 140, 188, 211, 10, 247, 228, 88, 5, 184, 179, 69, 6, 208, 44, 30, 143, 202, 63, 15, 2, 193, 175, 189, 3, 1, 19, 138, 107, 58, 145, 17, 65, 79, 103, 220, 234, 151, 242, 207, 206, 240, 180, 230, 115, 150, 172, 116, 34, 231, 173, 53, 133, 226, 249, 55, 232, 28, 117, 223, 110, 71, 241, 26, 113, 29, 41, 197, 137, 111, 183, 98, 14, 170, 24, 190, 27, 252, 86, 62, 75, 198, 210, 121, 32, 154, 219, 192, 254, 120, 205, 90, 244, 31, 221, 168, 51, 136, 7, 199, 49, 177, 18, 16, 89, 39, 128, 236, 95, 96, 81, 127, 169, 25, 181, 74, 13, 45, 229, 122, 159, 147, 201, 156, 239, 160, 224, 59, 77, 174, 42, 245, 176, 200, 235, 187, 60, 131, 83, 153, 97, 23, 43, 4, 126, 186, 119, 214, 38, 225, 105, 20, 99, 85, 33, 12, 125, }; void __stdcall encrypt(unsigned char *pt,unsigned char *secu_key,unsigned char *ept){ unsigned char rcon,i,j,aux,aux1,aux2,aux3,round_counter; unsigned char key[16],block[16]; for(i=0;i<16;i++) block = pt; for(i=0;i<16;i++) key = secu_key; rcon = 1 ; /*key_addition*/ for(i=0;i<16;i++) block ^= key; round_counter = 0xA; for(j=0;j /*substitution_S*/ for(i=0;i<16;i++) block = S_box[block]; /*enc_shift_row*/ aux = block[1]; block[1] = block[5]; block[5] = block[9]; block[9] = block[13]; block[13] = aux; aux = block[2]; aux1 = block[6]; block[2] = block[10]; block[6] = block[14]; block[10] = aux; block[14] = aux1; aux = block[15]; block[15] = block[11]; block[11] = block[7]; block[7] = block[3]; block[3] = aux; if(j == (round_counter-1)) goto last_round; /*mix_column*/ /*begins with the mix of column 0*/ aux1 = block[0] ^ block[1]; aux = block[0] ^ block[1] ^ block[2] ^ block[3]; aux2 = block[1] ^ block[2]; aux3 = block[2] ^ block[3]; /*calc_xtimes*/ if(aux1<0x80) aux1<<= 1; else aux1 = (aux1<<1) ^ 0x1b; if(aux2<0x80) aux2 <<= 1; else aux2 = (aux2<<1) ^ 0x1b; if(aux3<0x80) aux3 <<= 1; else aux3 = (aux3<<1) ^ 0x1b; block[0] ^= aux ^ aux1; block[1] ^= aux ^ aux2; block[2] ^= aux ^ aux3; block[3] = block[0] ^ block[1] ^ block[2] ^ aux; /*mix of column 1*/ aux1 = block[4] ^ block[5]; aux = block[4] ^ block[5] ^ block[6] ^ block[7]; aux2 = block[5] ^ block[6]; aux3 = block[6] ^ block[7]; /*calc_xtimes*/ if(aux1<0x80) aux1<<= 1; else aux1 = (aux1<<1) ^ 0x1b; if(aux2<0x80) aux2 <<= 1; else aux2 = (aux2<<1) ^ 0x1b; if(aux3<0x80) aux3 <<= 1; else aux3 = (aux3<<1) ^ 0x1b; block[4] ^= aux ^ aux1; block[5] ^= aux ^ aux2; block[6] ^= aux ^ aux3; block[7] = block[4] ^ block[5] ^ block[6] ^ aux; /*mix of column 2*/ aux1 = block[8] ^ block[9]; aux = block[8] ^ block[9] ^ block[10] ^ block[11]; aux2 = block[9] ^ block[10]; aux3 = block[10] ^ block[11]; /*calc_xtimes*/ if(aux1<0x80) aux1<<= 1; else aux1 = (aux1<<1) ^ 0x1b; if(aux2<0x80) aux2 <<= 1; else aux2 = (aux2<<1) ^ 0x1b; if(aux3<0x80) aux3 <<= 1; else aux3 = (aux3<<1) ^ 0x1b; block[8] ^= aux ^ aux1; block[9] ^= aux ^ aux2; block[10] ^= aux ^ aux3; block[11] = block[8] ^ block[9] ^ block[10] ^ aux; /*mix of column 3*/ aux1 = block[12] ^ block[13]; aux = block[12] ^ block[13] ^ block[14] ^ block[15]; aux2 = block[13] ^ block[14]; aux3 = block[14] ^ block[15]; /*calc_xtimes*/ if(aux1<0x80) aux1<<= 1; else aux1 = (aux1<<1) ^ 0x1b; if(aux2<0x80) aux2 <<= 1; else aux2 = (aux2<<1) ^ 0x1b; if(aux3<0x80) aux3 <<= 1; else aux3 = (aux3<<1) ^ 0x1b; block[12] ^= aux ^ aux1; block[13] ^= aux ^ aux2; block[14] ^= aux ^ aux3; block[15] = block[12] ^ block[13] ^ block[14] ^ aux; last_round: /*enc_key_schedule*/ /*calc_s_table_based_values*/ key[0x0] ^= S_box[key[0xD]]; key[0x1] ^= S_box[key[0xE]]; key[0x2] ^= S_box[key[0xF]]; key[0x3] ^= S_box[key[0xC]]; key[0] ^= rcon; if(rcon<0x80) rcon <<= 1; else rcon = (rcon<<1) ^ 0x1b; for(i=0;i<12;i++) key[i+4] ^= key; /*key_addition*/ for(i=0;i<16;i++) block ^= key; } /*end of encrypt*/ for(i=0;i<16;i++) ept = block; } void __stdcall decrypt(unsigned char *ept,unsigned char *secu_key,unsigned char *pt){ unsigned char key[16],block[16]; unsigned char rcon,i,j,aux,aux1,aux2,aux3,round_counter,d0,d1,d2; for(i=0;i<16;i++) block = ept; for(i=0;i<16;i++) key = secu_key; rcon = 1; round_counter = 10; for(j=0;j /*calc_s_table_based_values*/ key[0x0] ^= S_box[key[0xD]]; key[0x1] ^= S_box[key[0xE]]; key[0x2] ^= S_box[key[0xF]]; key[0x3] ^= S_box[key[0xC]]; key[0] ^= rcon; if(rcon<0x80) rcon <<= 1; else rcon = (rcon<<1) ^ 0x1b; for(i=0;i<12;i++) key[i+4] ^= key; } /*end of init_decryption_key*/ rcon = 0x36; /*key_addition*/ for(i=0;i<16;i++) block ^= key; round_counter = 10; /*substitution_Si*/ for(i=0;i<16;i++) block = Si_box[block]; /*dec_shift_row*/ aux = block[0xd]; /*Rotates right row 1 one position*/ block[0xd] = block[9]; block[9] = block[5]; block[5] = block[1]; block[1] = aux; aux = block[0xa]; /*Rotates right row 2 one position*/ aux1 = block[0xe]; block[0xa] = block[2]; block[0xe] = block[6]; block[2] = aux; block[6] = aux1; aux = block[3]; /*Rotates right row 3 one position*/ block[3] = block[7]; block[7] = block[0xb]; block[0xb] = block[0xf]; block[0xf] = aux; /*dec_key_schedule*/ /*first column3 ^= column2*/ key[0xc] ^= key[8]; key[0xd] ^= key[9]; key[0xe] ^= key[0xa]; key[0xf] ^= key[0xb]; /*column2 ^= column1*/ key[8] ^= key[4]; key[9] ^= key[5]; key[0xa] ^= key[6]; key[0xb] ^= key[7]; /*first column1 ^= column0*/ key[4] ^= key[0]; key[5] ^= key[1]; key[6] ^= key[2]; key[7] ^= key[3]; key[0] ^= rcon; if(rcon & 0x1) rcon = 0x80; else rcon >>= 1; /*calc_s_table_based_values*/ key[0x0] ^= S_box[key[0xD]]; key[0x1] ^= S_box[key[0xE]]; key[0x2] ^= S_box[key[0xF]]; key[0x3] ^= S_box[key[0xC]]; /*key_addition*/ for(i=0;i<16;i++) block ^= key; for(j=0;j<(round_counter-1);j++){ /*inv_mix_column*/ /*FIRST column*/ aux = block[0] ^ block[1] ^ block[2] ^ block[3]; aux1 = block[0] ^ block[2]; if(aux1<0x80) aux1 <<= 1; else aux1 = (aux1<<1) ^ 0x1b; aux2 = block[1] ^ block[3]; if(aux2<0x80) aux2 <<= 1; else aux2 = (aux2<<1) ^ 0x1b; aux3 = aux1 ^ aux2; if(aux3<0x80) aux3 <<= 1; else aux3 = (aux3<<1) ^ 0x1b; if(aux3<0x80) aux3 <<= 1; else aux3 = (aux3<<1) ^ 0x1b; aux3 ^= aux; d0 = block[0] ^ block[1] ^ aux1; if(d0<0x80) d0 <<= 1; else d0 = (d0<<1) ^ 0x1b; d1 = block[1] ^ block[2] ^ aux2; if(d1<0x80) d1 <<= 1; else d1 = (d1<<1) ^ 0x1b; d2 = block[2] ^ block[3] ^ aux1; if(d2<0x80) d2 <<= 1; else d2 = (d2<<1) ^ 0x1b; block[0] ^= d0 ^ aux3; block[1] ^= d1 ^ aux3; block[2] ^= d2 ^ aux3; block[3] = block[0] ^ block[1] ^ block[2] ^ aux; /*SECOND column*/ aux = block[4] ^ block[5] ^ block[6] ^ block[7]; aux1 = block[4] ^ block[6]; if(aux1<0x80) aux1 <<= 1; else aux1 = (aux1<<1) ^ 0x1b; aux2 = block[5] ^ block[7]; if(aux2<0x80) aux2 <<= 1; else aux2 = (aux2<<1) ^ 0x1b; aux3 = aux1 ^ aux2; if(aux3<0x80) aux3 <<= 1; else aux3 = (aux3<<1) ^ 0x1b; if(aux3<0x80) aux3 <<= 1; else aux3 = (aux3<<1) ^ 0x1b; aux3 ^= aux; d0 = block[4] ^ block[5] ^ aux1; if(d0<0x80) d0 <<= 1; else d0 = (d0<<1) ^ 0x1b; d1 = block[5] ^ block[6] ^ aux2; if(d1<0x80) d1 <<= 1; else d1 = (d1<<1) ^ 0x1b; d2 = block[6] ^ block[7] ^ aux1; if(d2<0x80) d2 <<= 1; else d2 = (d2<<1) ^ 0x1b; block[4] ^= d0 ^ aux3; block[5] ^= d1 ^ aux3; block[6] ^= d2 ^ aux3; block[7] = block[4] ^ block[5] ^ block[6] ^ aux; /*THIRD column*/ aux = block[8] ^ block[9] ^ block[10] ^ block[11]; aux1 = block[8] ^ block[10]; if(aux1<0x80) aux1 <<= 1; else aux1 = (aux1<<1) ^ 0x1b; aux2 = block[9] ^ block[11]; if(aux2<0x80) aux2 <<= 1; else aux2 = (aux2<<1) ^ 0x1b; aux3 = aux1 ^ aux2; if(aux3<0x80) aux3 <<= 1; else aux3 = (aux3<<1) ^ 0x1b; if(aux3<0x80) aux3 <<= 1; else aux3 = (aux3<<1) ^ 0x1b; aux3 ^= aux; d0 = block[8] ^ block[9] ^ aux1; if(d0<0x80) d0 <<= 1; else d0 = (d0<<1) ^ 0x1b; d1 = block[9] ^ block[10] ^ aux2; if(d1<0x80) d1 <<= 1; else d1 = (d1<<1) ^ 0x1b; d2 = block[10] ^ block[11] ^ aux1; if(d2<0x80) d2 <<= 1; else d2 = (d2<<1) ^ 0x1b; block[8] ^= d0 ^ aux3; block[9] ^= d1 ^ aux3; block[10] ^= d2 ^ aux3; block[11] = block[8] ^ block[9] ^ block[10] ^ aux; /*LAST column*/ aux = block[12] ^ block[13] ^ block[14] ^ block[15]; aux1 = block[12] ^ block[14]; if(aux1<0x80) aux1 <<= 1; else aux1 = (aux1<<1) ^ 0x1b; aux2 = block[13] ^ block[15]; if(aux2<0x80) aux2 <<= 1; else aux2 = (aux2<<1) ^ 0x1b; aux3 = aux1 ^ aux2; if(aux3<0x80) aux3 <<= 1; else aux3 = (aux3<<1) ^ 0x1b; if(aux3<0x80) aux3 <<= 1; else aux3 = (aux3<<1) ^ 0x1b; aux3 ^= aux; d0 = block[12] ^ block[13] ^ aux1; if(d0<0x80) d0 <<= 1; else d0 = (d0<<1) ^ 0x1b; d1 = block[13] ^ block[14] ^ aux2; if(d1<0x80) d1 <<= 1; else d1 = (d1<<1) ^ 0x1b; d2 = block[14] ^ block[15] ^ aux1; if(d2<0x80) d2 <<= 1; else d2 = (d2<<1) ^ 0x1b; block[12] ^= d0 ^ aux3; block[13] ^= d1 ^ aux3; block[14] ^= d2 ^ aux3; block[15] = block[12] ^ block[13] ^ block[14] ^ aux; dec_first_round: /*substitution_Si*/ for(i=0;i<16;i++) block = Si_box[block]; /*dec_shift_row*/ aux = block[0xd]; /*Rotates right row 1 one position*/ block[0xd] = block[9]; block[9] = block[5]; block[5] = block[1]; block[1] = aux; aux = block[0xa]; /*Rotates right row 2 one position*/ aux1 = block[0xe]; block[0xa] = block[2]; block[0xe] = block[6]; block[2] = aux; block[6] = aux1; aux = block[3]; /*Rotates right row 3 one position*/ block[3] = block[7]; block[7] = block[0xb]; block[0xb] = block[0xf]; block[0xf] = aux; /*dec_key_schedule*/ /*first column3 ^= column2*/ key[0xc] ^= key[8]; key[0xd] ^= key[9]; key[0xe] ^= key[0xa]; key[0xf] ^= key[0xb]; /*column2 ^= column1*/ key[8] ^= key[4]; key[9] ^= key[5]; key[0xa] ^= key[6]; key[0xb] ^= key[7]; /*first column1 ^= column0*/ key[4] ^= key[0]; key[5] ^= key[1]; key[6] ^= key[2]; key[7] ^= key[3]; key[0] ^= rcon; if(rcon & 0x1) rcon = 0x80; else rcon >>= 1; /*calc_s_table_based_values*/ key[0x0] ^= S_box[key[0xD]]; key[0x1] ^= S_box[key[0xE]]; key[0x2] ^= S_box[key[0xF]]; key[0x3] ^= S_box[key[0xC]]; /*key_addition*/ for(i=0;i<16;i++) block ^= key; } /*end of for loop*/ for(i=0;i<16;i++) pt = block; } /*end of decrypt*/ |

5楼2013-03-11 11:21:53

6楼2013-03-11 17:22:31
7楼2016-09-18 17:03:17










回复此楼
,暂时没找到注解版的- -