用C Builder创建数字签名

2008-02-23 05:30:55来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

假如您在网络上传递一份数据,但却存在着种种不安全的因素,使您对数据能否原封不动地到达目的地而心存疑惑,这时,您就能够给数据加上数字签名,从而使对方能够通过验证签名来检查您所传过去的数据是否已被他人修改。

  一、程式原理

  数字签名的工作原理还是比较简单的,他是根据您所提供的原始数据,经过复杂的算法,产生特定的数据签名,对方通过同样的过程也产生签名,假如数据已被修改,那么就不可能得到两份一模相同的签名,从而就可判断数据已被他人修改。编程人员利用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(!(dReadLenbr>
  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(!(dReadLenbr>
  if(!CryptVerifySignature(hHash,pSignature,dSignatureLen,hPublicKey,NULL,0))

  {

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

  }

  else

  {

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

  }

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




标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 用BCB研发多层数据库应用程式

下一篇: 用C Builder操纵Excel

热门词条
热门标签