我写的MD5和RC4加密缓冲区函数
原创:星绽紫辉 转载请注明出处,3Q Very Much! http://www.cppblog.com/rawdata
我写的MD5和RC4加密缓冲区函数,其原始代码借鉴
www.microsoft.com 网站上的文章 。
这种加密函数是引用Windows内部维护的CSP数据库的,是机器相关的,换句话说,你只有在同一台机器上才能对它进行加密解密。加密前,你给一个私钥字符串,就可以加密和解密缓冲区了。也可以稍加修改用来加密解密文件。
其实,里面的步骤是死的,至于为什么这么做,这是这些API编写者对API应用者要求的必须遵循的调用规则,如果你想获得更为详尽的信息,可以在微软的网站上找到有关CSP和Encryt/Decrypt API的资料。
下面贴出完整的源代码:
(呵呵,顺便说一句,我是支持开源的。这对于加速软件技术研究是有帮助的,我期待着高智能机器人时代的快速来临,我希望有健全完整的共享知识库,我也希望发达健全的软件系统能有一个质的飞跃。)
http://www.cppblog.com/rawdata
1
2 #pragma once
3
4 #include < tchar.h >
5 #include < stdio.h >
6 #include < windows.h >
7 #include < wincrypt.h >
8
9 #pragma comment (lib, " advapi32 " )
10
11 #define KEYLENGTH 0x00800000
12 #define ENCRYPT_ALGORITHM CALG_RC4
13 #define ENCRYPT_BLOCK_SIZE 8
14
15
16 // ---------------------------------------------------------------------------------------
17
18 #pragma pack(push, 1 )
19 struct DEFKEY
20 {
21 HCRYPTPROV hCryptProv;
22 HCRYPTKEY hKey;
23 HCRYPTHASH hHash;
24 DEFKEY()
25 {
26 hCryptProv = NULL;
27 hKey = NULL;
28 hHash = NULL;
29 }
30} ;
31 #pragma pack(pop)
32
33 // --------------------------------------------------------------------------------------
34
35 // 初始化Key
36 void InitEncrypt(DEFKEY & initkey,BYTE * pbyPassword,DWORD dwPwdLen)
37 {
38 //请求CSP
39 if(!CryptAcquireContext( &initkey.hCryptProv, NULL,MS_ENHANCED_PROV,PROV_RSA_FULL,0))
40 return;
41
42 //创建散列
43 if(!CryptCreateHash(initkey.hCryptProv,CALG_MD5,0,0,&initkey.hHash))
44 return;
45
46 //生成密钥数据
47 if(!CryptHashData(initkey.hHash,pbyPassword,dwPwdLen,0))
48 return;
49
50 //生成密钥(密钥长度,密钥算法)
51 if(!CryptDeriveKey(initkey.hCryptProv,ENCRYPT_ALGORITHM,initkey.hHash,KEYLENGTH,&initkey.hKey))
52 return;
53
54}
55
56
57 // ------------------------------------------------------------------------------------------------
58 void InitDecrypt(DEFKEY & initkey,BYTE * pbyPassword,DWORD dwPwdLen)
59 {
60 //是否是加密尾部块
61 bool fReturn = false;
62
63 //请求CSP
64 if(!CryptAcquireContext(&initkey.hCryptProv,NULL,MS_ENHANCED_PROV,PROV_RSA_FULL,0))
65 return;
66
67 //创建散列表
68 if(!CryptCreateHash(initkey.hCryptProv,CALG_MD5,0,0,&initkey.hHash))
69 return;
70
71 //创建解密数据
72 if(!CryptHashData(initkey.hHash,(BYTE *)pbyPassword,dwPwdLen,0))
73 return;
74
75 //生成解密数据
76 if(!CryptDeriveKey(initkey.hCryptProv,ENCRYPT_ALGORITHM,
77 initkey.hHash,KEYLENGTH,&initkey.hKey))
78 return;
79}
80
81 // -----------------------------------------------------------------------------------
82 void ReleaseCrypt(DEFKEY & initkey)
83 {
84 if(initkey.hHash)
85 {
86 CryptDestroyHash(initkey.hHash);
87 initkey.hHash = NULL;
88 }
89
90 if(initkey.hKey)
91 CryptDestroyKey(initkey.hKey);
92
93 if(initkey.hCryptProv)
94 CryptReleaseContext(initkey.hCryptProv, 0);
95}
96
97 // -------------------------------------------------------------------------------------
98
99
100 bool EncryptBuffer(BYTE * pbyInputBuf, DWORD dwInputLen,
101 DWORD dwBufLen,HCRYPTKEY hKey,BOOL bEnd);
102
103
104 bool DecryptBuffer(BYTE * pbyInputBuf, DWORD dwInputLen,
105 DWORD dwBufLen,HCRYPTKEY hKey,BOOL bEnd);
106
107
108 // ---------------------------------------------------------------------------------------
109 bool EncryptBuffer(BYTE * pbyInputBuf, DWORD dwInputLen,
110 DWORD dwBufLen,HCRYPTKEY hKey,BOOL bEnd)
111 {
112 DWORD dwCount = dwInputLen;
113 CryptDecrypt(hKey,0,bEnd,0,pbyInputBuf,&dwCount);
114 return 1;
115}
116
117
118
119
120 bool DecryptBuffer(BYTE * pbyInputBuf, DWORD dwInputLen,
121 DWORD dwBufLen,HCRYPTKEY hKey,BOOL bEnd)
122 {
123 DWORD dwCount = dwInputLen;
124 CryptDecrypt(hKey,0,bEnd,0,pbyInputBuf,&dwCount);
125 return 1;
126}
2 #pragma once
3
4 #include < tchar.h >
5 #include < stdio.h >
6 #include < windows.h >
7 #include < wincrypt.h >
8
9 #pragma comment (lib, " advapi32 " )
10
11 #define KEYLENGTH 0x00800000
12 #define ENCRYPT_ALGORITHM CALG_RC4
13 #define ENCRYPT_BLOCK_SIZE 8
14
15
16 // ---------------------------------------------------------------------------------------
17
18 #pragma pack(push, 1 )
19 struct DEFKEY
20 {
21 HCRYPTPROV hCryptProv;
22 HCRYPTKEY hKey;
23 HCRYPTHASH hHash;
24 DEFKEY()
25 {
26 hCryptProv = NULL;
27 hKey = NULL;
28 hHash = NULL;
29 }
30} ;
31 #pragma pack(pop)
32
33 // --------------------------------------------------------------------------------------
34
35 // 初始化Key
36 void InitEncrypt(DEFKEY & initkey,BYTE * pbyPassword,DWORD dwPwdLen)
37 {
38 //请求CSP
39 if(!CryptAcquireContext( &initkey.hCryptProv, NULL,MS_ENHANCED_PROV,PROV_RSA_FULL,0))
40 return;
41
42 //创建散列
43 if(!CryptCreateHash(initkey.hCryptProv,CALG_MD5,0,0,&initkey.hHash))
44 return;
45
46 //生成密钥数据
47 if(!CryptHashData(initkey.hHash,pbyPassword,dwPwdLen,0))
48 return;
49
50 //生成密钥(密钥长度,密钥算法)
51 if(!CryptDeriveKey(initkey.hCryptProv,ENCRYPT_ALGORITHM,initkey.hHash,KEYLENGTH,&initkey.hKey))
52 return;
53
54}
55
56
57 // ------------------------------------------------------------------------------------------------
58 void InitDecrypt(DEFKEY & initkey,BYTE * pbyPassword,DWORD dwPwdLen)
59 {
60 //是否是加密尾部块
61 bool fReturn = false;
62
63 //请求CSP
64 if(!CryptAcquireContext(&initkey.hCryptProv,NULL,MS_ENHANCED_PROV,PROV_RSA_FULL,0))
65 return;
66
67 //创建散列表
68 if(!CryptCreateHash(initkey.hCryptProv,CALG_MD5,0,0,&initkey.hHash))
69 return;
70
71 //创建解密数据
72 if(!CryptHashData(initkey.hHash,(BYTE *)pbyPassword,dwPwdLen,0))
73 return;
74
75 //生成解密数据
76 if(!CryptDeriveKey(initkey.hCryptProv,ENCRYPT_ALGORITHM,
77 initkey.hHash,KEYLENGTH,&initkey.hKey))
78 return;
79}
80
81 // -----------------------------------------------------------------------------------
82 void ReleaseCrypt(DEFKEY & initkey)
83 {
84 if(initkey.hHash)
85 {
86 CryptDestroyHash(initkey.hHash);
87 initkey.hHash = NULL;
88 }
89
90 if(initkey.hKey)
91 CryptDestroyKey(initkey.hKey);
92
93 if(initkey.hCryptProv)
94 CryptReleaseContext(initkey.hCryptProv, 0);
95}
96
97 // -------------------------------------------------------------------------------------
98
99
100 bool EncryptBuffer(BYTE * pbyInputBuf, DWORD dwInputLen,
101 DWORD dwBufLen,HCRYPTKEY hKey,BOOL bEnd);
102
103
104 bool DecryptBuffer(BYTE * pbyInputBuf, DWORD dwInputLen,
105 DWORD dwBufLen,HCRYPTKEY hKey,BOOL bEnd);
106
107
108 // ---------------------------------------------------------------------------------------
109 bool EncryptBuffer(BYTE * pbyInputBuf, DWORD dwInputLen,
110 DWORD dwBufLen,HCRYPTKEY hKey,BOOL bEnd)
111 {
112 DWORD dwCount = dwInputLen;
113 CryptDecrypt(hKey,0,bEnd,0,pbyInputBuf,&dwCount);
114 return 1;
115}
116
117
118
119
120 bool DecryptBuffer(BYTE * pbyInputBuf, DWORD dwInputLen,
121 DWORD dwBufLen,HCRYPTKEY hKey,BOOL bEnd)
122 {
123 DWORD dwCount = dwInputLen;
124 CryptDecrypt(hKey,0,bEnd,0,pbyInputBuf,&dwCount);
125 return 1;
126}
http://www.cppblog.com/rawdata
如果代码有什么谬误或者有更好的解决方案,请留言或者EmailToMe: [email protected].
让我们一起努力, 让软件技术和电子机械技术的高能时代快快来临吧!!!
^_~ 2008-12-30 星绽紫辉