1、3.编程实现实验内容1,请给出每个中间过程的关键数据及源代码。对称密码算法采用AES(密钥长度在128位、192位、256位中进行3选1即可), 公钥密码算法采用RSA 。六、实验要求1.明文为:0011 2233 4455 6677 8899 aabb ccdd eeff,AES算法的密钥为:0001 0203 0405 0607 0809 0a0b 0c0d 0e0f 1011 1213 1415 1617,RSA 算法的公私钥自定。2.完成实验内容1和实验内容2。3.对于实验内容3的实现部分,可以2人1小组,也可以1人1小组。2人小组需要实现AES和RSA两个加密算法,而1人小组只需实现
2、RSA加密算法即可,有余力者也可以实现两个算法。不论是2人小组还是1人小组,实现全部两个加密算法都可以获得适当的实验加分。AES算法要求实现效果范例:RSA算法要求实现效果范例:4.完成实验报告,要求有实验过程、代码实现和说明、效果截图和心得体会。5.保存并提交这次实验的代码,命名为aes.cpp和rsa.cpp,然后放在一个独立的文件夹下。七、实现提示和部分代码1.关于AES算法的实现1)如何存储明文和密钥/ 数组 temp 保存 key./ 数组 temp2 保存明文. unsigned char temp32 = 0x00 ,0x01 ,0x02 ,0x03 ,0x04 ,0x05 ,0
3、x06 ,0x07 ,0x08 ,0x09 ,0x0a ,0x0b ,0x0c ,0x0d ,0x0e ,0x0f, 0x10 ,0x11 ,0x12 ,0x13, 0x14 ,0x15 ,0x16 ,0x17; unsigned char temp232 = 0x00 ,0x11 ,0x22 ,0x33 ,0x44 ,0x55 ,0x66 ,0x77 ,0x88 ,0x99 ,0xaa ,0xbb ,0xcc ,0xdd ,0xee ,0xff;2)密钥扩展KeyExpansion/ Keyexpansion函数生成Nb(Nr+1)个轮密钥roundkey用来加密每轮的statevoid K
4、eyExpansion() int i,j; unsigned char temp4; for(i = 0;i Nk;i+) / 将密钥Key的初始值赋给轮密钥RoundKey RoundKey4*i = Key4*i; RoundKey4*i+1 = Key4*i+1; RoundKey4*i+2 = Key4*i+2; RoundKey4*i+3 = Key4*i+3; for(i = Nk; Nb*(Nr+1);i+) / 生成Nb(Nr+1)个轮密钥roundkey temp0 = RoundKey4*(i-1); temp1 = RoundKey4*(i-1)+1; temp2 =
5、RoundKey4*(i-1)+2; temp3 = RoundKey4*(i-1)+3; if(i % Nk = 0) / 循环左移RotWord char temp1 = temp0; temp0 = temp1; temp1 = temp2; temp2 = temp3; temp3 = temp1; / S-Box操作SubWord for(j = 0;j 4;j+) int num = (int)tempj; tempj = (char)getSBoxValue(num); / temp = temp Rcon temp0 = temp0 (char)Rconi/Nk; else i
6、f(Nk = 8&(i % Nk = 4) / 此处用于256位密钥长度时的操作 RoundKey4*i = RoundKey4*(i-Nk) temp0; RoundKey4*i+1 = RoundKey4*(i-Nk)+1 temp1; RoundKey4*i+2 = RoundKey4*(i-Nk)+2 temp2; RoundKey4*i+3 = RoundKey4*(i-Nk)+3 temp3; 3)S-Box操作、逆S-Box操作和轮常数数组Rcon/ S-box操作int getSBoxValue(int num) int sbox256 = /0 1 2 3 4 5 6 7 8
7、 9 A B C D E F 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, /0 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, /1 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x3
8、1, 0x15, /2 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, /3 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, /4 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58,
9、0xcf, /5 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, /6 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, /7 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x7
10、3, /8 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, /9 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, /A 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
11、/B 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, /C 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, /D 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, /E
12、0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 ; /F return sboxnum;/ 逆S-box操作int getSBoxInvert(int num) int rsbox256 = 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb , 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f,
13、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, 0x1
14、6, 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,
15、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, 0x6
16、2, 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,
17、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 ; return rsboxnum;/ 轮常数数组, Rconi int Rcon255 = 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10,
18、0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08,
19、0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04,
20、0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02,
21、0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01,
22、0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb ;4)列混合变
23、换和逆列混合变换/ xtime 是计算16进制乘以02的宏#define xtime(x) (x7) & 1) * 0x1b)/ Multiplty 是计算在域 GF(28)中的数字乘法的宏#define Multiply(x,y) (y & 1) * x) (y1 & 1) * xtime(x) (y2 & 1) * xtime(xtime(x) (y3 & 1) * xtime(xtime(xtime(x) (y4 & 1) * xtime(xtime(xtime(xtime(x)/ Matrix是列混合变换所需的矩阵unsigned char Matrix16 = 0x02 ,0x03
24、,0x01 ,0x01 ,0x01 ,0x02 ,0x03 ,0x01 ,0x01 ,0x01 ,0x02 ,0x03 ,0x03 ,0x01 ,0x01 ,0x02;/ InvMatrix是逆列混合变换所需的矩阵unsigned char InvMatrix16 = 0x0e ,0x0b ,0x0d ,0x09 ,0x09 ,0x0e ,0x0b ,0x0d ,0x0d ,0x09 ,0x0e ,0x0b ,0x0b ,0x0d ,0x09 ,0x0e;/ 列混合变换void MixColumns() char state144; Nb;i+) / 先将state复制给state1,stat
25、e是明文变换为密文过程中的中间结果 for(j = 0; state1ij = stateij;i+) / 将state1和矩阵Matrix的乘积赋给state,state是明文变换为密文过程中的中间结果 stateji = Multiply(state10i,Matrix4*j) Multiply(state11i,Matrix4*j+1) Multiply(state12i,Matrix4*j+2) Multiply(state13i,Matrix4*j+3); / 逆列混合变换void InvMixColumns() / 将state1和矩阵InvMatrix的乘积赋给state,sta
26、te是明文变换为密文过程中的中间结果 stateji = Multiply(state10i,InvMatrix4*j) Multiply(state11i,InvMatrix4*j+1) Multiply(state12i,InvMatrix4*j+2) Multiply(state13i,InvMatrix4*j+3);5)加密函数/ 加密函数.void Cipher() int i = 0; int j = 0; int k = 0; int round = 0; / 明文in赋值给state,state是明文变换为密文过程中的中间结果 stateji = ink; / state(i,j) - state(j,i) k+; AddRoundKey(round); / 前Nr-1轮加密 for(round = 1;round Nr;round+) SubBytes(); ShiftRows(); MixColumns(); AddRoundKey(round); / 最后一轮加密 SubBytes(); ShiftRows(); AddRoundKey(Nr); k = 0; / 密文state赋值给o
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1