星绽紫辉(rawdata)的Blog

快乐地学习,快乐地工作!

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  16 Posts :: 0 Stories :: 37 Comments :: 0 Trackbacks

常用链接

留言簿(5)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

        

      原创:星绽紫辉 转载请注明出处,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)
 19struct 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
 36void 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//------------------------------------------------------------------------------------------------
 58void 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//-----------------------------------------------------------------------------------
 82void 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
100bool EncryptBuffer(BYTE* pbyInputBuf, DWORD dwInputLen,
101                   DWORD dwBufLen,HCRYPTKEY hKey,BOOL bEnd);
102
103
104bool DecryptBuffer(BYTE* pbyInputBuf, DWORD dwInputLen,
105                   DWORD dwBufLen,HCRYPTKEY hKey,BOOL bEnd);
106
107
108//---------------------------------------------------------------------------------------
109bool 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
120bool 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: xiaolu69soft@yahoo.com.cn.


     让我们一起努力, 让软件技术和电子机械技术的高能时代快快来临吧!!!


      ^_~         2008-12-30   星绽紫辉

      
posted on 2008-12-30 10:35 星绽紫辉 阅读(455) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理