CNET中国旗舰网站

ZDNet China | CNET科技资讯网 | 政府采购 | 行业网站联盟




 
标题: [求助] 求DSA数字签名程序!C++的!!!急啊
dong860512
论坛游民




UID 325838
精华 0
积分 25
帖子 2
威望 12
ZD币 18 元
阅读权限 20
注册 2008-5-12
状态 离线
  楼主
发表于 2008-5-11 23:50  资料  个人空间  短消息  加为好友 
开发者在线

求DSA数字签名程序!C++的!!!急啊

求DSA数字签名程序!C++的!!!急啊
因为是小弟的毕业设计,所以很急   请大家帮忙!谢谢!!!!




顶部
热点频道推荐: C/S开发| 数据库| WEB开发| 嵌入式| 项目管理|
xiao_wei1
中级会员
Rank: 1



UID 280444
精华 0
积分 393
帖子 30
威望 124
ZD币 48 元
阅读权限 30
注册 2007-12-25
状态 离线
  沙发
发表于 2008-5-12 07:33  资料  个人空间  短消息  加为好友 
先来创建数字签名,假定其数据来自于一个文件。     
   
    //变量声明:     
    HCRYPTPROV   hProv;     
    //   CSP的句柄   
    HCRYPTHASH   hHash;   
    //   散列的句柄     
    const   int   BUFFER   =   4096;   
    //   缓冲区大小常数   
    BYTE   pBuffer[BUFFER];   
    //   存放读文件内容的缓冲区   
    BYTE   pSignature[256];   
    //   存放签名的缓冲区   
    DWORD   dSignatureLen   =   256;   
    //   签名的长度     
    TFileStream   *sourceFile;   
    //   一个文件流     
    if(!CryptAcquireContext(&hProv,   NULL,   NULL,   PROV—RSA—FULL,   0))     
    //   连接默认的CSP,接受它的句柄放入hProv   
    {   
      //   错误处理     
    }   
    if(!CryptCreateHash(hProv,   CALG—MD5,   0,   0,   &hHash))     
    //   创建一个散列对象,得到它的句柄放入hHash   
    {   
      //   错误处理   
    }     
    do   
    {   
       dReadLen   =   sourceFile->Read(pBuffer,   BUFFER);   
       if(!CryptHashData(hHash,   pBuffer,   dReadLen,   0))   
    //   根据文件的内容计算散列值     
       {   
      //   错误处理   
       }     
    }while(!(dReadLen<BUFFER));     
    if(!CryptSignHash(hHash,   AT—SIGNATURE,   NULL,   0,   pSignature,   &dSignatureLen))     
    //使用私人密钥对散列值进行数字签名   
    //签名数据放入pSignature,长度放入dSignatureLen     
      //   错误处理   
    }   
    对基于文件的数据签名进行检验。   
    //变量声明:     
    HCRYPTPROV   hProv;   
    //   CSP的句柄   
    HCRYPTHASH   hHash;     
    //   散列的句柄   
    HCRYPTKEY   hPublicKey;   
    //   公共密钥的句柄     
    const   int   BUFFER=4096;   
    //   缓冲区大小常数   
    BYTE   pBuffer[BUFFER];   
    //   存放读文件内容的缓冲区   
    TFileStream   *sourceFile;//   一个文件流   
    BYTE   pSignature[256];   
    //   上一段得到的签名的缓冲区     
    DWORD   dSignatureLen;   
    //   上一段得到的签名的长度     
    if(!CryptAcquireContext(&hProv,   NULL,   NULL,   PROV—RSA—FULL,   0))     
    //   连接默认的CSP,接受它的句柄放入hProv   
    {   
      //   错误处理   
    }     
    if(!CryptGetUserKey(hProv,   AT_SIGNATURE,   &hPublicKey);   //   得到公共密钥的句柄     
    {   
      //   错误处理   
    }     
    if(!CryptCreateHash(hProv,   CALG—MD5,   0,   0,   &hHash))   //   创建一个散列对象,得到它的句柄放入hHash   
    {   
      //   错误处理   
    }   
    do     
    {   
       dReadLen   =   sourceFile->Read(pBuffer,   BUFFER);   
       if(!CryptHashData(hHash,   pBuffer,   dReadLen,   0))   
    //   根据文件的内容计算散列值     
       {   
      //   错误处理   
       }     
    }while(!(dReadLen<BUFFER));     
    if(!CryptVerifySignature(hHash,   pSignature,   dSignatureLen,   hPublicKey,   NULL,   0))     
    {   
      if(GetLastError()==NTE—BAD—SIGNATURE)   ShowMessage(″文件已被修改″);   
    }   
    else   
    {   
       ShowMessage(″文件没被修改″);   
    }     
    以上是一个数字签名的简单实现,得到的签名数据可以单独保存,也可以分开保存。   
  引用结束   
   
          请大家相信我是按照上述代码及MSDN有关Crypt函数帮助做过的,前面创建CSP句柄、hash句柄及hash运算都实现了,可以用CryptGetParam()函数获得hash的值(当然是乱码)。问题就在进行数字签名时:   
   
          if(!CryptSignHash(hHash,   AT_SIGNATURE,   NULL,   0,   pSignature,   &dSignatureLen))     
    //使用私人密钥对散列值进行数字签名   
    //签名数据放入pSignature,长度放入dSignatureLen     
      //   错误处理   
    }




顶部
热点频道推荐: C/S开发| 数据库| WEB开发| 嵌入式| 项目管理|
 



当前时区 GMT+8, 现在时间是 2009-7-4 09:31

  Powered by Discuz! 5.5.0 © 2001-2007 Comsenz Inc.
Processed in 0.063315 second(s), 3/3 queries

清除 Cookies - 联系我们 - ZDNetChina中文社区 - 无图版