因工作需要,需要对字符串进行加密处理,在网上找了很长时间,终于找到了一个可以使用的aes加密算法。
其源代码采用c++编写而成,但其头文件引用windows.h,经过修改部分代码,将#include<windows.h>
去掉,这样可是使用与多个编译器。下面的代码中列出了测试用的代码(中文出现乱码现象):

点击(此处)折叠或打开


1. int main(int argc, char *argv[])
2. {
3. (argc, argv);
4. 
5. *aes  = new TAesClass;
6. [1024] = "cheng xiaopeng";
7. = strlen(mingwen);
8. [1024];
9. [1024];
10. [1024] = "xcy";
11. *p = key;
12. ->InitializePrivateKey(16, p); //进行初始化
13. ->OnAesEncrypt((LPVOID)mingwen, size, (LPVOID)miwen); //进行加密
14. ->OnAesUncrypt((LPVOID)miwen, (DWORD)sizeof(miwen),(LPVOID)jiemi); //进行解密
15. 
16. //打印信息
17. () <<  "mingwen:" << mingwen;
18. () <<  "miwen:" << miwen;
19. () <<  "jiemi:" <<jiemi;
20. 
21. (aes);
22. = 0;
23. .exec();
24. }

程序编译,运行的结果为:


mingwen: cheng xiaopeng 
miwen: D"Òæ7þ†³¡»qŠ2·EMÌT<ì(c@öaéGÜE®¿Ž2G 
jiemi: cheng xiaopeng

TAesClass.h的源代码


点击(此处)折叠或打开


1. #include <string.h>
2. #include <stdio.h>
3. #include <stdlib.h>
4. #include <ctype.h>
5. 
6. typedef unsigned long DWORD;
7. typedef unsigned char UCHAR,*PUCHAR;
8. typedef void *PVOID,*LPVOID;
9. typedef unsigned char byte;
10. typedef DWORD *PDWORD,*LPDWORD;
11. 
12. #ifndef VOID
13. #define VOID void
14. #endif
15. 
16. //#pragma once
17. 
18. //enum KeySize { Bits128, Bits192, Bits256 };  // key size, in bits,  for construtor
19. #define Bits128    16
20. #define Bits192    24
21. #define Bits256    32
22. 
23. static unsigned char AesSbox[16*16]=
24. {// populate the Sbox matrix
25. /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
26. /*0*/ 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
27. /*1*/ 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
28. /*2*/ 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
29. /*3*/ 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
30. /*4*/ 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
31. /*5*/ 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
32. /*6*/ 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
33. /*7*/ 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
34. /*8*/ 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
35. /*9*/ 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
36. /*a*/ 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
37. /*b*/ 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
38. /*c*/ 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
39. /*d*/ 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
40. /*e*/ 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
41. /*f*/ 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
42. };
43. 
44. static unsigned char AesiSbox[16*16]=
45. {
46. // populate the iSbox matrix
47. /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
48. /*0*/ 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb,
49. /*1*/ 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb,
50. /*2*/ 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
51. /*3*/ 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25,
52. /*4*/ 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92,
53. /*5*/ 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
54. /*6*/ 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06,
55. /*7*/ 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b,
56. /*8*/ 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
57. /*9*/ 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e,
58. /*a*/ 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b,
59. /*b*/ 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
60. /*c*/ 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f,
61. /*d*/ 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef,
62. /*e*/ 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
63. /*f*/ 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
64. };
65. static unsigned char AesRcon[11*4]=
66. {
67. , 0x00, 0x00, 0x00, 
68. , 0x00, 0x00, 0x00,
69. , 0x00, 0x00, 0x00,
70. , 0x00, 0x00, 0x00,
71. , 0x00, 0x00, 0x00,
72. , 0x00, 0x00, 0x00,
73. , 0x00, 0x00, 0x00,
74. , 0x00, 0x00, 0x00,
75. , 0x00, 0x00, 0x00,
76. , 0x00, 0x00, 0x00,
77. , 0x00, 0x00, 0x00
78. };
79. 
80. 
81. class Aes // Advanced Encryption Standard
82. {
83. public:
84. ~Aes();
85. ();
86. (int keySize, unsigned char* keyBytes);
87. [4][4];
88. (unsigned char* input, unsigned char* output); // encipher 16-bit input
89. (unsigned char* input, unsigned char* output); // decipher 16-bit input
90. private:
91. int Nb; // block size in 32-bit words. Always 4 for AES.  (128 bits).
92. int Nk; // key size in 32-bit words. 4, 6, 8. (128, 192, 256 bits).
93. int Nr; // number of rounds. 10, 12, 14.
94. 
95. [32];
96. [16*15];
97. 
98. (int keySize);
99. (int round); //轮密钥加
100. (); //S盒字节代换
101. (); //逆S盒字节代换
102. (); //行移位
103. ();
104. (); //列混淆
105. ();
106. (unsigned char b);
107. (unsigned char b);
108. (unsigned char b);
109. (unsigned char b);
110. (unsigned char b);
111. (unsigned char b);
112. (unsigned char b);
113. (); //密钥扩展
114. * SubWord(unsigned char* word); //密钥S盒字代换
115. * RotWord(unsigned char* word); //密钥移位
116.     
117. };
118. 
119. class TAesClass
120. {
121. public:
122. ();
123. ~TAesClass();
124. (DWORD KeySize,UCHAR *KeyBytes); //AES 密钥初始化
125. (LPVOID InBuffer,DWORD InLength,LPVOID OutBuffer);            //AES 加密数据
126. (LPVOID InBuffer,DWORD InLength,LPVOID OutBuffer);            //AES 解密数据
127. private:
128. * m_lpAes;
129. };

TAesClass.cpp的源代码


点击(此处)折叠或打开


1. #include "TAesClass.h"
2. 
3. Aes::~Aes()
4. {
5. 
6. }
7. Aes::Aes()
8. {
9. 
10. }
11. ////////////////////////////////////////////////////////////////////////////////////////////////
12. //构造函数
13. Aes::Aes(int keysize,unsigned char* keyBytes)
14. {
15. (keysize); //设置密钥块数,轮数 
16. (key,keyBytes,keysize);                //字符串拷贝函数,把keyBytes的keysize个字符复制到key中
17. ();                                //密钥扩展,必须提前做的初始化
18. }
19. ////////////////////////////////////////////////////////////////////////////////////////////////
20. void Aes::SetNbNkNr(int keySize)
21. {
22. =4;
23. if(keySize==Bits128)
24. {
25. =4; //4*4字节,128位密钥,10轮加密
26. =10;
27. }
28. else if(keySize==Bits192)
29. {
30. =6; //6*4字节,192位密钥,12轮加密
31. =12;
32. }
33. else if(keySize==Bits256)
34. {
35. =8; //8*4字节,256位密钥,14轮加密
36. =14;
37. }
38. }
39. ////////////////////////////////////////////////////////////////////////////////////////////////
40. void Aes::KeyExpansion()
41. {
42. 
43. (w,0,16*15);
44. for(int row=0;row<Nk;row++) //拷贝seed 密钥
45. {
46. [4*row+0] = key[4*row];
47. [4*row+1] = key[4*row+1];
48. [4*row+2] = key[4*row+2];
49. [4*row+3] = key[4*row+3];
50. }
51. * temp  = new byte[4];
52. for(int row=Nk;row<4*(Nr+1);row++)
53. {
54. [0]=w[4*row-4]; //当前列的前一列 
55. [1]=w[4*row-3];
56. [2]=w[4*row-2];
57. [3]=w[4*row-1];
58. if(row%Nk==0) //逢nk时,对当前列的前一列作特殊处理
59. {
60. =SubWord(RotWord(temp)); //先移位,再代换,最后和轮常量异或
61. [0] = (byte)( (int)temp[0] ^ (int) AesRcon[4*(row/Nk)+0] ); 
62. [1] = (byte)( (int)temp[1] ^ (int) AesRcon[4*(row/Nk)+1] );
63. [2] = (byte)( (int)temp[2] ^ (int) AesRcon[4*(row/Nk)+2] );
64. [3] = (byte)( (int)temp[3] ^ (int) AesRcon[4*(row/Nk)+3] );
65. }
66. else if ( Nk > 6  && (row % Nk == 4) ) //这个还没有搞清楚
67. {
68. = SubWord(temp);
69. }
70. 
71. // w[row] = w[row-Nk] xor temp
72. [4*row+0] = (byte) ( (int) w[4*(row-Nk)+0] ^ (int)temp[0] );
73. [4*row+1] = (byte) ( (int) w[4*(row-Nk)+1] ^ (int)temp[1] );
74. [4*row+2] = (byte) ( (int) w[4*(row-Nk)+2] ^ (int)temp[2] );
75. [4*row+3] = (byte) ( (int) w[4*(row-Nk)+3] ^ (int)temp[3] );
76. } // for loop
77. 
78. }
79. ////////////////////////////////////////////////////////////////////////////////////////////////
80. //密钥移位函数
81. unsigned char* Aes::RotWord(unsigned char* word)
82. {
83. * temp  = new byte[4];
84. [0] = word[1];
85. [1] = word[2];
86. [2] = word[3];
87. [3] = word[0];
88. ;
89. }
90. ////////////////////////////////////////////////////////////////////////////////////////////////
91. //密钥字代换函数
92. unsigned char* Aes::SubWord(unsigned char* word)
93. {
94. * temp  = new byte[4];
95. for(int j=0;j<4;j++)
96. {
97. [j] = AesSbox[16*(word[j] >> 4)+(word[j] & 0x0f)]; //实际上也可以写成AesSbox[[j]];因为两者相等
98. }
99. ;
100. 
101. }
102. ////////////////////////////////////////////////////////////////////////////////////////////////
103. //Aes加密函数
104. void Aes::Cipher(unsigned char* input, unsigned char* output)
105. {
106. (&State[0][0],0,16);
107. for(int i=0;i<4*Nb;i++) //这里是先写列后写行的,即输入是一列一列的进来的
108. {
109. [i%4][i/4]=input[i];                    //换成先写行后写列也是可以的,只要在输出时也是这样就可以了
110. }
111. (0);                                    //轮密钥加
112. 
113. for (int round = 1; round <= (Nr - 1); round++) // main  round loop
114. {
115. ();                                    //字节代换
116. ();                                //行移位
117. ();                                //列混淆
118. (round);                            //轮密钥加
119. } // main round loop
120. 
121. ();                                        //字节代换
122. ();                                    //行移位
123. (Nr);                                //轮密钥加
124. 
125. // output = state
126. for (int i = 0; i  < (4 * Nb); i++)
127. {
128. [i] = State[i  % 4][ i / 4];
129. }
130. 
131. }
132. ////////////////////////////////////////////////////////////////////////////////////////////////
133. //Aes解密函数
134. void Aes::InvCipher(unsigned char* input,unsigned char* output)
135. {
136. (&State[0][0],0,16);
137. for (int i = 0; i  < (4 * Nb); i++)
138. {
139. [i  % 4][ i / 4]  = input[i];
140. }
141. 
142. (Nr);
143. 
144. for (int round = Nr-1; round >= 1; round--) // main  round loop
145. {
146. ();
147. ();
148. (round);
149. ();
150. } // end main round loop for InvCipher
151. 
152. ();
153. ();
154. (0);
155. 
156. // output = state
157. for (int i = 0; i  < (4 * Nb); i++)
158. {
159. [i] = State[i  % 4][ i / 4];
160. }
161. }
162. ////////////////////////////////////////////////////////////////////////////////////////////////
163. //轮密钥加
164. void Aes::AddRoundKey(int round)
165. {
166. int i,j; //i行 j列  //因为密钥w是一列一列排列的,即 k0 k4 k8 k12
167. for(j=0;j<4;j++)             //                             k1 k5 k9 k13
168. {                              //                             k2 k6 k10k14
169. for(i=0;i<4;i++)         //                             k3 k7 k11k15
170. {                          // 所以i行j列的下标是4*((round*4)+j)+i即16*round+4*j+i
171. [i][j]=(unsigned char)((int)State[i][j]^(int)w[4*((round*4)+j)+i]); 
172. }
173. }
174. }
175. ////////////////////////////////////////////////////////////////////////////////////////////////
176. //字节代换函数
177. void Aes::SubBytes() //Page 103
178. {
179. int i,j;
180. for(j=0;j<4;j++)
181. {
182. for(i=0;i<4;i++)
183. {
184. [i][j]=AesSbox[State[i][j]];
185. //因为 16*(State[i][j]>>4)+State[i][j]&0x0f=State[i][j]
186. 
187. 
188. }
189. }
190. }
191. 
192. void Aes::InvSubBytes()
193. {
194. int i,j;
195. for(j=0;j<4;j++)
196. {
197. for(i=0;i<4;i++)
198. {
199. [i][j]=AesiSbox[State[i][j]]; //因为 16*(State[i][j]>>4)+State[i][j]&0x0f=State[i][j]
200. }
201. }
202. 
203. }
204. ////////////////////////////////////////////////////////////////////////////////////////////////
205. void Aes::ShiftRows()
206. {
207. [4*4]; //Page105
208. int i,j;
209. for(j=0;j<4;j++)
210. {
211. for(i=0;i<4;i++)
212. {
213. [4*i+j]=State[i][j];
214. }
215. }
216. for(i=1;i<4;i++)
217. {
218. for(j=0;j<4;j++)
219. {
220. if(i==1)State[i][j]=temp[4*i+(j+1)%4];                    //第一行左移1位
221. else  if(i==2)State[i][j]=temp[4*i+(j+2)%4];                //第二行左移2位
222. else  if(i==3)State[i][j]=temp[4*i+(j+3)%4];                //第三行左移3位
223. }
224. }
225. 
226. }
227. void Aes::InvShiftRows()
228. {
229. [4*4];
230. int i,j;
231. for(j=0;j<4;j++)
232. {
233. for(i=0;i<4;i++)
234. {
235. [4*i+j]=State[i][j];
236. }
237. }
238. for(i=1;i<4;i++)
239. {
240. for(j=0;j<4;j++)
241. {
242. //if(i==1)State[i][j]=temp[4*i+(j-1)%4]; 在此犯了一个错误 -1%4=-1 而不是3,所以采用了下面再加一个4的做法
243. if(i==1)State[i][j]=temp[4*i+(j+3)%4];            //第一行右移1位 j-1+4=j+3
244. else  if(i==2)State[i][j]=temp[4*i+(j+2)%4];        //第二行右移2位 j-2+4=j+2
245. else  if(i==3)State[i][j]=temp[4*i+(j+1)%4];        //第三行右移3位 j-3+4=j+2
246. }
247. }
248. 
249. }
250. ////////////////////////////////////////////////////////////////////////////////////////////////
251. void Aes::MixColumns()
252. {
253. [4*4];
254. int i,j;
255. for(j=0;j<4;j++) //2 3 1 1 列混淆矩阵 Page107
256. {                                                    //1 2 3 1
257. for(i=0;i<4;i++)                                //1 1 2 3
258. {                                                //3 1 1 2
259. [4*i+j]=State[i][j];
260. }
261. }
262. for(j=0;j<4;j++)
263. {
264. [0][j] = (unsigned char) ( (int)gfmultby02(temp[0+j]) ^ (int)gfmultby03(temp[4*1+j]) ^
265. (int)gfmultby01(temp[4*2+j]) ^ (int)gfmultby01(temp[4*3+j]) );
266. [1][j] = (unsigned char) ( (int)gfmultby01(temp[0+j]) ^ (int)gfmultby02(temp[4*1+j]) ^
267. (int)gfmultby03(temp[4*2+j]) ^ (int)gfmultby01(temp[4*3+j]) );
268. [2][j] = (unsigned char) ( (int)gfmultby01(temp[0+j]) ^ (int)gfmultby01(temp[4*1+j]) ^
269. (int)gfmultby02(temp[4*2+j]) ^ (int)gfmultby03(temp[4*3+j]) );
270. [3][j] = (unsigned char) ( (int)gfmultby03(temp[0+j]) ^ (int)gfmultby01(temp[4*1+j]) ^
271. (int)gfmultby01(temp[4*2+j]) ^ (int)gfmultby02(temp[4*3+j]) );
272. }
273. 
274. }
275. void Aes::InvMixColumns()
276. {
277. [4*4];
278. int i,j;
279. for (i = 0; i  < 4; i++) // copy State into temp[]
280. {
281. for (j = 0; j  < 4; j++) //0e 0b 0d 09 逆变换矩阵 Page108
282. {                                                //09 0e 0b 0d
283. [4*i+j] = State[i][j];                    //0d 09 0e 0b
284. }                                                //0b 0d 09 0e
285. }
286. 
287. for (j = 0; j  < 4; j++)
288. {
289. [0][j] = (unsigned char) ( (int)gfmultby0e(temp[j]) ^ (int)gfmultby0b(temp[4+j]) ^
290. (int)gfmultby0d(temp[4*2+j]) ^ (int)gfmultby09(temp[4*3+j]) );
291. [1][j] = (unsigned char) ( (int)gfmultby09(temp[j]) ^ (int)gfmultby0e(temp[4+j]) ^
292. (int)gfmultby0b(temp[4*2+j]) ^ (int)gfmultby0d(temp[4*3+j]) );
293. [2][j] = (unsigned char) ( (int)gfmultby0d(temp[j]) ^ (int)gfmultby09(temp[4+j]) ^
294. (int)gfmultby0e(temp[4*2+j]) ^ (int)gfmultby0b(temp[4*3+j]) );
295. [3][j] = (unsigned char) ( (int)gfmultby0b(temp[j]) ^ (int)gfmultby0d(temp[4+j]) ^
296. (int)gfmultby09(temp[4*2+j]) ^ (int)gfmultby0e(temp[4*3+j]) );
297. }
298. }
299. ////////////////////////////////////////////////////////////////////////////////////////////////
300. unsigned char Aes::gfmultby01(unsigned char b)
301. {
302. ;
303. }
304. unsigned char Aes::gfmultby02(unsigned char b)
305. {
306. if (b < 0x80)
307. (unsigned char)(int)(b <<1);
308. else
309. (unsigned char)( (int)(b << 1) ^ (int)(0x1b) );
310. }
311. 
312. unsigned char Aes::gfmultby03(unsigned char b)
313. {
314. (unsigned char) ( (int)gfmultby02(b) ^ (int)b );
315. }
316. 
317. unsigned char Aes::gfmultby09(unsigned char b)
318. {
319. (unsigned char)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^ (int)b );
320. }
321. 
322. unsigned char Aes::gfmultby0b(unsigned char b)
323. {
324. (unsigned char)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^
325. (int)gfmultby02(b) ^ (int)b );
326. }
327. 
328. unsigned char Aes::gfmultby0d(unsigned char b)
329. {
330. (unsigned char)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^
331. (int)gfmultby02(gfmultby02(b)) ^ (int)(b) );
332. }
333. 
334. unsigned char Aes::gfmultby0e(unsigned char b)
335. {
336. (unsigned char)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^
337. (int)gfmultby02(gfmultby02(b)) ^(int)gfmultby02(b) );
338. }
339. 
340. TAesClass::TAesClass()
341. {
342. =NULL;
343. (16,(unsigned char*)"\x79\x76\x68\x6B\x77\x66\x6E\x68\x72\x65\x73\x63\x6C\x6B\x70\x6E");
344. }
345. 
346. TAesClass::~TAesClass()
347. {
348. if (m_lpAes!=NULL)
349. {
350. ;
351. }
352. }
353. //------------------------------------------------------------------------------------------------------------
354. // 编写人员:wfnhddd
355. //
356. // 函数名称:InitializeAes
357. //
358. // 函数描述:初始化AES 密钥,密钥用于加密解密
359. //
360. // 调用参数:详细说明参考 MSDN 中的相关描述或相关的开发文档
361. //
362. // 返回数值:无
363. //
364. // 最近修改:2009 年 08 月 07 日
365. //------------------------------------------------------------------------------------------------------------
366. 
367. 
368. VOID TAesClass::InitializePrivateKey(DWORD KeySize,UCHAR *KeyBytes)
369. {
370. if (m_lpAes)
371. {
372. ;
373. =NULL;
374. }
375. =new Aes(KeySize,KeyBytes);
376. 
377. }
378. 
379. //------------------------------------------------------------------------------------------------------------
380. // 编写人员:wfnhddd
381. //
382. // 函数名称:OnAesEncrypt
383. //
384. // 函数描述:用AES加密算法加密数据
385. //
386. // 调用参数:详细说明参考 MSDN 中的相关描述或相关的开发文档
387. //
388. // 返回数值:加密后的数据大小 ,错误返回值 0
389. //
390. // 最近修改:2009 年 08 月 07 日
391. //------------------------------------------------------------------------------------------------------------
392. 
393. DWORD TAesClass::OnAesEncrypt(LPVOID InBuffer,DWORD InLength,LPVOID OutBuffer)
394. {
395. =0;
396. if (m_lpAes==NULL||OutBuffer==NULL)
397. {
398. ;
399. }
400.     
401. *lpCurInBuff=(UCHAR *)InBuffer;
402. *lpCurOutBuff=(UCHAR *)OutBuffer;
403. =InLength/16;
404. =InLength%16;
405. for(long i=0;i<blocknum;i++)
406. {        
407. ->Cipher(lpCurInBuff,lpCurOutBuff);
408. +=16;
409. +=16;
410. +=16;        
411. }
412. if(leftnum) //多余出leftnum 字节 则加密时 多出16-leftnum 个字节
413. {
414. [16];
415. (inbuff,0,16);
416. (inbuff,lpCurInBuff,leftnum);
417. ->Cipher(inbuff,lpCurOutBuff);
418. +=16;
419. +=16;
420. }
421. //新增16个字节,用以确定增加的字节数
422. [16];
423. (extrabuff,0,16);
424. *((LPDWORD)extrabuff)=16+(16-leftnum)%16; //多出16+(16-leftnum)%16个字节
425. ->Cipher(extrabuff,lpCurOutBuff);
426. +=16;
427. ;
428. 
429. }
430. 
431. 
432. //------------------------------------------------------------------------------------------------------------
433. // 编写人员:wfnhddd
434. //
435. // 函数名称:OnAesUncrypt
436. //
437. // 函数描述:用AES加密算法解密数据
438. //
439. // 调用参数:详细说明参考 MSDN 中的相关描述或相关的开发文档
440. //
441. // 返回数值:解密后的数据大小 ,错误返回值 0
442. //
443. // 最近修改:2009 年 08 月 07 日
444. //------------------------------------------------------------------------------------------------------------
445. DWORD TAesClass::OnAesUncrypt(LPVOID InBuffer,DWORD InLength,LPVOID OutBuffer)
446. {
447. =0;
448. if (m_lpAes==NULL||OutBuffer==NULL)
449. {
450. ;
451. }
452. *lpCurInBuff=(UCHAR *)InBuffer;
453. *lpCurOutBuff=(UCHAR *)OutBuffer;
454. =InLength/16;
455. =InLength%16;
456. if(leftnum)
457. {
458. ;
459. }
460. for(long i=0;i<blocknum;i++)
461. {        
462. ->InvCipher(lpCurInBuff,lpCurOutBuff);
463. +=16;
464. +=16;
465. +=16;        
466. }
467. 
468. *lpExtraInBuff=lpCurOutBuff-16;
469. =*((LPDWORD)lpExtraInBuff);    
470. (OutLength-dwExtraBytes);
471. 
472. }
1. #include "TAesClass.h"
2. 
3. Aes::~Aes()
4. {
5. 
6. }
7. Aes::Aes()
8. {
9. 
10. }
11. ////////////////////////////////////////////////////////////////////////////////////////////////
12. //构造函数
13. Aes::Aes(int keysize,unsigned char* keyBytes)
14. {
15. (keysize); //设置密钥块数,轮数 
16. (key,keyBytes,keysize);                //字符串拷贝函数,把keyBytes的keysize个字符复制到key中
17. ();                                //密钥扩展,必须提前做的初始化
18. }
19. ////////////////////////////////////////////////////////////////////////////////////////////////
20. void Aes::SetNbNkNr(int keySize)
21. {
22. =4;
23. if(keySize==Bits128)
24. {
25. =4; //4*4字节,128位密钥,10轮加密
26. =10;
27. }
28. else if(keySize==Bits192)
29. {
30. =6; //6*4字节,192位密钥,12轮加密
31. =12;
32. }
33. else if(keySize==Bits256)
34. {
35. =8; //8*4字节,256位密钥,14轮加密
36. =14;
37. }
38. }
39. ////////////////////////////////////////////////////////////////////////////////////////////////
40. void Aes::KeyExpansion()
41. {
42. 
43. (w,0,16*15);
44. for(int row=0;row<Nk;row++) //拷贝seed 密钥
45. {
46. [4*row+0] = key[4*row];
47. [4*row+1] = key[4*row+1];
48. [4*row+2] = key[4*row+2];
49. [4*row+3] = key[4*row+3];
50. }
51. * temp  = new byte[4];
52. for(int row=Nk;row<4*(Nr+1);row++)
53. {
54. [0]=w[4*row-4]; //当前列的前一列 
55. [1]=w[4*row-3];
56. [2]=w[4*row-2];
57. [3]=w[4*row-1];
58. if(row%Nk==0) //逢nk时,对当前列的前一列作特殊处理
59. {
60. =SubWord(RotWord(temp)); //先移位,再代换,最后和轮常量异或
61. [0] = (byte)( (int)temp[0] ^ (int) AesRcon[4*(row/Nk)+0] ); 
62. [1] = (byte)( (int)temp[1] ^ (int) AesRcon[4*(row/Nk)+1] );
63. [2] = (byte)( (int)temp[2] ^ (int) AesRcon[4*(row/Nk)+2] );
64. [3] = (byte)( (int)temp[3] ^ (int) AesRcon[4*(row/Nk)+3] );
65. }
66. else if ( Nk > 6  && (row % Nk == 4) ) //这个还没有搞清楚
67. {
68. = SubWord(temp);
69. }
70. 
71. // w[row] = w[row-Nk] xor temp
72. [4*row+0] = (byte) ( (int) w[4*(row-Nk)+0] ^ (int)temp[0] );
73. [4*row+1] = (byte) ( (int) w[4*(row-Nk)+1] ^ (int)temp[1] );
74. [4*row+2] = (byte) ( (int) w[4*(row-Nk)+2] ^ (int)temp[2] );
75. [4*row+3] = (byte) ( (int) w[4*(row-Nk)+3] ^ (int)temp[3] );
76. } // for loop
77. 
78. }
79. ////////////////////////////////////////////////////////////////////////////////////////////////
80. //密钥移位函数
81. unsigned char* Aes::RotWord(unsigned char* word)
82. {
83. * temp  = new byte[4];
84. [0] = word[1];
85. [1] = word[2];
86. [2] = word[3];
87. [3] = word[0];
88. ;
89. }
90. ////////////////////////////////////////////////////////////////////////////////////////////////
91. //密钥字代换函数
92. unsigned char* Aes::SubWord(unsigned char* word)
93. {
94. * temp  = new byte[4];
95. for(int j=0;j<4;j++)
96. {
97. [j] = AesSbox[16*(word[j] >> 4)+(word[j] & 0x0f)]; //实际上也可以写成AesSbox[[j]];因为两者相等
98. }
99. ;
100. 
101. }
102. ////////////////////////////////////////////////////////////////////////////////////////////////
103. //Aes加密函数
104. void Aes::Cipher(unsigned char* input, unsigned char* output)
105. {
106. (&State[0][0],0,16);
107. for(int i=0;i<4*Nb;i++) //这里是先写列后写行的,即输入是一列一列的进来的
108. {
109. [i%4][i/4]=input[i];                    //换成先写行后写列也是可以的,只要在输出时也是这样就可以了
110. }
111. (0);                                    //轮密钥加
112. 
113. for (int round = 1; round <= (Nr - 1); round++) // main  round loop
114. {
115. ();                                    //字节代换
116. ();                                //行移位
117. ();                                //列混淆
118. (round);                            //轮密钥加
119. } // main round loop
120. 
121. ();                                        //字节代换
122. ();                                    //行移位
123. (Nr);                                //轮密钥加
124. 
125. // output = state
126. for (int i = 0; i  < (4 * Nb); i++)
127. {
128. [i] = State[i  % 4][ i / 4];
129. }
130. 
131. }
132. ////////////////////////////////////////////////////////////////////////////////////////////////
133. //Aes解密函数
134. void Aes::InvCipher(unsigned char* input,unsigned char* output)
135. {
136. (&State[0][0],0,16);
137. for (int i = 0; i  < (4 * Nb); i++)
138. {
139. [i  % 4][ i / 4]  = input[i];
140. }
141. 
142. (Nr);
143. 
144. for (int round = Nr-1; round >= 1; round--) // main  round loop
145. {
146. ();
147. ();
148. (round);
149. ();
150. } // end main round loop for InvCipher
151. 
152. ();
153. ();
154. (0);
155. 
156. // output = state
157. for (int i = 0; i  < (4 * Nb); i++)
158. {
159. [i] = State[i  % 4][ i / 4];
160. }
161. }
162. ////////////////////////////////////////////////////////////////////////////////////////////////
163. //轮密钥加
164. void Aes::AddRoundKey(int round)
165. {
166. int i,j; //i行 j列  //因为密钥w是一列一列排列的,即 k0 k4 k8 k12
167. for(j=0;j<4;j++)             //                             k1 k5 k9 k13
168. {                              //                             k2 k6 k10k14
169. for(i=0;i<4;i++)         //                             k3 k7 k11k15
170. {                          // 所以i行j列的下标是4*((round*4)+j)+i即16*round+4*j+i
171. [i][j]=(unsigned char)((int)State[i][j]^(int)w[4*((round*4)+j)+i]); 
172. }
173. }
174. }
175. ////////////////////////////////////////////////////////////////////////////////////////////////
176. //字节代换函数
177. void Aes::SubBytes() //Page 103
178. {
179. int i,j;
180. for(j=0;j<4;j++)
181. {
182. for(i=0;i<4;i++)
183. {
184. [i][j]=AesSbox[State[i][j]];
185. //因为 16*(State[i][j]>>4)+State[i][j]&0x0f=State[i][j]
186. 
187. 
188. }
189. }
190. }
191. 
192. void Aes::InvSubBytes()
193. {
194. int i,j;
195. for(j=0;j<4;j++)
196. {
197. for(i=0;i<4;i++)
198. {
199. [i][j]=AesiSbox[State[i][j]]; //因为 16*(State[i][j]>>4)+State[i][j]&0x0f=State[i][j]
200. }
201. }
202. 
203. }
204. ////////////////////////////////////////////////////////////////////////////////////////////////
205. void Aes::ShiftRows()
206. {
207. [4*4]; //Page105
208. int i,j;
209. for(j=0;j<4;j++)
210. {
211. for(i=0;i<4;i++)
212. {
213. [4*i+j]=State[i][j];
214. }
215. }
216. for(i=1;i<4;i++)
217. {
218. for(j=0;j<4;j++)
219. {
220. if(i==1)State[i][j]=temp[4*i+(j+1)%4];                    //第一行左移1位
221. else  if(i==2)State[i][j]=temp[4*i+(j+2)%4];                //第二行左移2位
222. else  if(i==3)State[i][j]=temp[4*i+(j+3)%4];                //第三行左移3位
223. }
224. }
225. 
226. }
227. void Aes::InvShiftRows()
228. {
229. [4*4];
230. int i,j;
231. for(j=0;j<4;j++)
232. {
233. for(i=0;i<4;i++)
234. {
235. [4*i+j]=State[i][j];
236. }
237. }
238. for(i=1;i<4;i++)
239. {
240. for(j=0;j<4;j++)
241. {
242. //if(i==1)State[i][j]=temp[4*i+(j-1)%4]; 在此犯了一个错误 -1%4=-1 而不是3,所以采用了下面再加一个4的做法
243. if(i==1)State[i][j]=temp[4*i+(j+3)%4];            //第一行右移1位 j-1+4=j+3
244. else  if(i==2)State[i][j]=temp[4*i+(j+2)%4];        //第二行右移2位 j-2+4=j+2
245. else  if(i==3)State[i][j]=temp[4*i+(j+1)%4];        //第三行右移3位 j-3+4=j+2
246. }
247. }
248. 
249. }
250. ////////////////////////////////////////////////////////////////////////////////////////////////
251. void Aes::MixColumns()
252. {
253. [4*4];
254. int i,j;
255. for(j=0;j<4;j++) //2 3 1 1 列混淆矩阵 Page107
256. {                                                    //1 2 3 1
257. for(i=0;i<4;i++)                                //1 1 2 3
258. {                                                //3 1 1 2
259. [4*i+j]=State[i][j];
260. }
261. }
262. for(j=0;j<4;j++)
263. {
264. [0][j] = (unsigned char) ( (int)gfmultby02(temp[0+j]) ^ (int)gfmultby03(temp[4*1+j]) ^
265. (int)gfmultby01(temp[4*2+j]) ^ (int)gfmultby01(temp[4*3+j]) );
266. [1][j] = (unsigned char) ( (int)gfmultby01(temp[0+j]) ^ (int)gfmultby02(temp[4*1+j]) ^
267. (int)gfmultby03(temp[4*2+j]) ^ (int)gfmultby01(temp[4*3+j]) );
268. [2][j] = (unsigned char) ( (int)gfmultby01(temp[0+j]) ^ (int)gfmultby01(temp[4*1+j]) ^
269. (int)gfmultby02(temp[4*2+j]) ^ (int)gfmultby03(temp[4*3+j]) );
270. [3][j] = (unsigned char) ( (int)gfmultby03(temp[0+j]) ^ (int)gfmultby01(temp[4*1+j]) ^
271. (int)gfmultby01(temp[4*2+j]) ^ (int)gfmultby02(temp[4*3+j]) );
272. }
273. 
274. }
275. void Aes::InvMixColumns()
276. {
277. [4*4];
278. int i,j;
279. for (i = 0; i  < 4; i++) // copy State into temp[]
280. {
281. for (j = 0; j  < 4; j++) //0e 0b 0d 09 逆变换矩阵 Page108
282. {                                                //09 0e 0b 0d
283. [4*i+j] = State[i][j];                    //0d 09 0e 0b
284. }                                                //0b 0d 09 0e
285. }
286. 
287. for (j = 0; j  < 4; j++)
288. {
289. [0][j] = (unsigned char) ( (int)gfmultby0e(temp[j]) ^ (int)gfmultby0b(temp[4+j]) ^
290. (int)gfmultby0d(temp[4*2+j]) ^ (int)gfmultby09(temp[4*3+j]) );
291. [1][j] = (unsigned char) ( (int)gfmultby09(temp[j]) ^ (int)gfmultby0e(temp[4+j]) ^
292. (int)gfmultby0b(temp[4*2+j]) ^ (int)gfmultby0d(temp[4*3+j]) );
293. [2][j] = (unsigned char) ( (int)gfmultby0d(temp[j]) ^ (int)gfmultby09(temp[4+j]) ^
294. (int)gfmultby0e(temp[4*2+j]) ^ (int)gfmultby0b(temp[4*3+j]) );
295. [3][j] = (unsigned char) ( (int)gfmultby0b(temp[j]) ^ (int)gfmultby0d(temp[4+j]) ^
296. (int)gfmultby09(temp[4*2+j]) ^ (int)gfmultby0e(temp[4*3+j]) );
297. }
298. }
299. ////////////////////////////////////////////////////////////////////////////////////////////////
300. unsigned char Aes::gfmultby01(unsigned char b)
301. {
302. ;
303. }
304. unsigned char Aes::gfmultby02(unsigned char b)
305. {
306. if (b < 0x80)
307. (unsigned char)(int)(b <<1);
308. else
309. (unsigned char)( (int)(b << 1) ^ (int)(0x1b) );
310. }
311. 
312. unsigned char Aes::gfmultby03(unsigned char b)
313. {
314. (unsigned char) ( (int)gfmultby02(b) ^ (int)b );
315. }
316. 
317. unsigned char Aes::gfmultby09(unsigned char b)
318. {
319. (unsigned char)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^ (int)b );
320. }
321. 
322. unsigned char Aes::gfmultby0b(unsigned char b)
323. {
324. (unsigned char)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^
325. (int)gfmultby02(b) ^ (int)b );
326. }
327. 
328. unsigned char Aes::gfmultby0d(unsigned char b)
329. {
330. (unsigned char)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^
331. (int)gfmultby02(gfmultby02(b)) ^ (int)(b) );
332. }
333. 
334. unsigned char Aes::gfmultby0e(unsigned char b)
335. {
336. (unsigned char)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^
337. (int)gfmultby02(gfmultby02(b)) ^(int)gfmultby02(b) );
338. }
339. 
340. TAesClass::TAesClass()
341. {
342. =NULL;
343. (16,(unsigned char*)"\x79\x76\x68\x6B\x77\x66\x6E\x68\x72\x65\x73\x63\x6C\x6B\x70\x6E");
344. }
345. 
346. TAesClass::~TAesClass()
347. {
348. if (m_lpAes!=NULL)
349. {
350. ;
351. }
352. }
353. //------------------------------------------------------------------------------------------------------------
354. // 编写人员:wfnhddd
355. //
356. // 函数名称:InitializeAes
357. //
358. // 函数描述:初始化AES 密钥,密钥用于加密解密
359. //
360. // 调用参数:详细说明参考 MSDN 中的相关描述或相关的开发文档
361. //
362. // 返回数值:无
363. //
364. // 最近修改:2009 年 08 月 07 日
365. //------------------------------------------------------------------------------------------------------------
366. 
367. 
368. VOID TAesClass::InitializePrivateKey(DWORD KeySize,UCHAR *KeyBytes)
369. {
370. if (m_lpAes)
371. {
372. ;
373. =NULL;
374. }
375. =new Aes(KeySize,KeyBytes);
376. 
377. }
378. 
379. //------------------------------------------------------------------------------------------------------------
380. // 编写人员:wfnhddd
381. //
382. // 函数名称:OnAesEncrypt
383. //
384. // 函数描述:用AES加密算法加密数据
385. //
386. // 调用参数:详细说明参考 MSDN 中的相关描述或相关的开发文档
387. //
388. // 返回数值:加密后的数据大小 ,错误返回值 0
389. //
390. // 最近修改:2009 年 08 月 07 日
391. //------------------------------------------------------------------------------------------------------------
392. 
393. DWORD TAesClass::OnAesEncrypt(LPVOID InBuffer,DWORD InLength,LPVOID OutBuffer)
394. {
395. =0;
396. if (m_lpAes==NULL||OutBuffer==NULL)
397. {
398. ;
399. }
400.     
401. *lpCurInBuff=(UCHAR *)InBuffer;
402. *lpCurOutBuff=(UCHAR *)OutBuffer;
403. =InLength/16;
404. =InLength%16;
405. for(long i=0;i<blocknum;i++)
406. {        
407. ->Cipher(lpCurInBuff,lpCurOutBuff);
408. +=16;
409. +=16;
410. +=16;        
411. }
412. if(leftnum) //多余出leftnum 字节 则加密时 多出16-leftnum 个字节
413. {
414. [16];
415. (inbuff,0,16);
416. (inbuff,lpCurInBuff,leftnum);
417. ->Cipher(inbuff,lpCurOutBuff);
418. +=16;
419. +=16;
420. }
421. //新增16个字节,用以确定增加的字节数
422. [16];
423. (extrabuff,0,16);
424. *((LPDWORD)extrabuff)=16+(16-leftnum)%16; //多出16+(16-leftnum)%16个字节
425. ->Cipher(extrabuff,lpCurOutBuff);
426. +=16;
427. ;
428. 
429. }
430. 
431. 
432. //------------------------------------------------------------------------------------------------------------
433. // 编写人员:wfnhddd
434. //
435. // 函数名称:OnAesUncrypt
436. //
437. // 函数描述:用AES加密算法解密数据
438. //
439. // 调用参数:详细说明参考 MSDN 中的相关描述或相关的开发文档
440. //
441. // 返回数值:解密后的数据大小 ,错误返回值 0
442. //
443. // 最近修改:2009 年 08 月 07 日
444. //------------------------------------------------------------------------------------------------------------
445. DWORD TAesClass::OnAesUncrypt(LPVOID InBuffer,DWORD InLength,LPVOID OutBuffer)
446. {
447. =0;
448. if (m_lpAes==NULL||OutBuffer==NULL)
449. {
450. ;
451. }
452. *lpCurInBuff=(UCHAR *)InBuffer;
453. *lpCurOutBuff=(UCHAR *)OutBuffer;
454. =InLength/16;
455. =InLength%16;
456. if(leftnum)
457. {
458. ;
459. }
460. for(long i=0;i<blocknum;i++)
461. {        
462. ->InvCipher(lpCurInBuff,lpCurOutBuff);
463. +=16;
464. +=16;
465. +=16;        
466. }
467. 
468. *lpExtraInBuff=lpCurOutBuff-16;
469. =*((LPDWORD)lpExtraInBuff);    
470. (OutLength-dwExtraBytes);
471. 
472. }