原創(chuàng):星綻紫輝 轉(zhuǎn)載請注明出處,3Q Very Much! http://www.shnenglu.com/rawdata 我寫的MD5和RC4加密緩沖區(qū)函數(shù),其原始代碼借鑒 www.microsoft.com 網(wǎng)站上的文章。
這種加密函數(shù)是引用Windows內(nèi)部維護(hù)的CSP數(shù)據(jù)庫的,是機(jī)器相關(guān)的,換句話說,你只有在同一臺機(jī)器上才能對它進(jìn)行加密解密。加密前,你給一個私鑰字符串,就可以加密和解密緩沖區(qū)了。也可以稍加修改用來加密解密文件。
其實,里面的步驟是死的,至于為什么這么做,這是這些API編寫者對API應(yīng)用者要求的必須遵循的調(diào)用規(guī)則,如果你想獲得更為詳盡的信息,可以在微軟的網(wǎng)站上找到有關(guān)CSP和Encryt/Decrypt API的資料。
下面貼出完整的源代碼: (呵呵,順便說一句,我是支持開源的。這對于加速軟件技術(shù)研究是有幫助的,我期待著高智能機(jī)器人時代的快速來臨,我希望有健全完整的共享知識庫,我也希望發(fā)達(dá)健全的軟件系統(tǒng)能有一個質(zhì)的飛躍。)
http://www.shnenglu.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 //創(chuàng)建散列 43 if(!CryptCreateHash(initkey.hCryptProv,CALG_MD5,0,0,&initkey.hHash)) 44 return; 45 46 //生成密鑰數(shù)據(jù) 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 //創(chuàng)建散列表 68 if(!CryptCreateHash(initkey.hCryptProv,CALG_MD5,0,0,&initkey.hHash)) 69 return; 70 71 //創(chuàng)建解密數(shù)據(jù) 72 if(!CryptHashData(initkey.hHash,(BYTE *)pbyPassword,dwPwdLen,0)) 73 return; 74 75 //生成解密數(shù)據(jù) 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.shnenglu.com/rawdata 如果代碼有什么謬誤或者有更好的解決方案,請留言或者EmailToMe: xiaolu69soft@yahoo.com.cn. 讓我們一起努力, 讓軟件技術(shù)和電子機(jī)械技術(shù)的高能時代快快來臨吧!!! ^_~ 2008-12-30 星綻紫輝
|