您的位置: 首页-> 电脑文摘-> 程序设计-> C++Builder-> 正文

用C++ Builder创建数字签名
作者佚名 来源InterNet 加入时间:2005-1-28
如果你在网络上传递一份数据,但却存在着种种不安全的因素,使你对数据能否原封不动地到达目的地而心存疑惑,这时,你就可以给数据加上数字签名,从而使对方可以通过验证签名来检查你所传过去的数据是否已被他人修改。

  一、程序原理

  数字签名的工作原理还是比较简单的,它是根据你所提供的原始数据,经过复杂的算法,产生特定的数据签名,对方通过同样的过程也产生签名,如果数据已被修改,那么就不可能得到两份一模一样的签名,从而就可判断数据已被他人修改。编程人员利用Windows的CAPI接口,就可以实现数据的加密、解密和数字签名。  

  二、程序清单

  下面用C++ Builder的语句来看一下它的具体实现过程。

  先来创建数字签名,假定其数据来自于一个文件。

  //变量声明:

  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
  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
  if(!CryptVerifySignature(hHash,pSignature,dSignatureLen,hPublicKey,NULL,0))

  {

    if(GetLastError()==NTE—BAD—SIGNATURE) ShowMessage(″文件已被修改″);

  }

  else

  {

   ShowMessage(″文件没被修改″);

  }

  以上是一个数字签名的简单实现,得到的签名数据可以单独保存,也可以分开保存。


[文章录入员:nancy]

相关文章
  • C++ Builder构建算二十四点小游戏
  • 用C++ Builder实现桌布自动更新
  • 用C++ Builder开发多层数据库应用程序
  • C++ Builder中消息处理过程及应用
  • C++ Builder下数据库报表Master/Detail关系功能的实现
  • 用C++ Builder实现网络连接检测程
  • 相关软件:
  • C++ Builder 3 核心编程技术
  • ::PCBOOKCN'ADS::


    ::C++Builder::
    C/C++/VC
    C++Builder
    Basic/VB类
    Delphi/Pascal
    Java编程
    FORTRAN
    其它
    ::阅读排行::
    ·模拟键盘按键 自动输入文字
    ·在C++Builer中多线程的实...
    ·C++ Builder构建算二十...
    ·用C++ Builder实现桌布...
    ·C++ Builder中消息处理...
    ·用C++ Builder实现网络...
    ·用C++ Builder开发多层...
    ·用C++Builder 建立数据...
    ·用BCB开发有身份认证功能的Em...
    ·个性凸现的动画 特技效果