用C++Builder创建数字签名

原创 2001年05月04日 22:18:00
  如果你在网络上传递一份数据,但却存在着种种不安全的因素,使你对数据能否原封不动地到达目的地而心存疑惑,这时,你就可以给数据加上数字签名,从而使对方可以通过验证签名来检查你所传过去的数据是否已被他人修改。

  一、程序原理

  数字签名的工作原理还是比较简单的,它是根据你所提供的原始数据,经过复杂的算法,产生特定的数据签名,对方通过同样的过程也产生签名,如果数据已被修改,那么就不可能得到两份一模一样的签名,从而就可判断数据已被他人修改。编程人员利用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<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(″文件没被修改″);
  }
 
  以上是一个数字签名的简单实现,得到的签名数据可以单独保存,也可以分开保存

[C++] 用C++ Builder创建数字签名

用C++Builder创建数字签名      如果你在网络上传递一份数据,但却存在着种种不安全的因素,使你对数据能否原封不动地到达目的地而心存疑惑,这时,你就可以给数据加上数字签名,从而使对方可以通过...
  • azuresn
  • azuresn
  • 2005年03月13日 21:12
  • 520

数字签名和数字加密

一,数字签名: 1,为什么要数字签名(数字签名的作用)? (1),因为自己的签名难以否认,从而确认了文件已签署这一事实; (2),因为签名不易仿冒,从而确定了文件是真的这一事实;   2,过程: (1...
  • hanxuemin12345
  • hanxuemin12345
  • 2013年10月17日 20:35
  • 1911

C++Builder在编译的时候报错

在编译一个小程序的时候,C++Builder总是报错,错误信息如下:[Linker Error] Unresolved external WinMain referenced from C:/Prog...
  • zjntche_cn
  • zjntche_cn
  • 2007年03月20日 16:07
  • 2338

C++ Builder 中 CreateFile的用法

CreateFile(1)函数原型HANDLE CreateFile(LPCTSTR lpfileName,DWORD deDesiredAccess,DWORD dwShareMode,LPSECU...
  • s4gg
  • s4gg
  • 2006年12月08日 14:54
  • 4821

Borland C++ Builder (BCB) 动态创建ACCESS的MDB数据表

Borland C++ Builder (BCB) 动态创建ACCESS的MDB数据表   当BCB使用Misoftsoft SQL数据库时,我们可以使用如下的SQL语句来创建数据表。        ...
  • JacksonLiang
  • JacksonLiang
  • 2009年01月23日 09:06
  • 2377

C++ Builder高手进阶 (三)用BCB设计DBTreeView组件(小结)

 用BCB设计DBTreeView组件小结续二的最后一个函数,你是不是感到很纳闷:这个函数到底是用来干什么的呢?下面听我慢慢道来:我使用这个函数主要是用来实现定制属性编辑器。细心的读者一定还记得,我设...
  • nxyc_twz
  • nxyc_twz
  • 2003年01月29日 13:57
  • 1343

创建PowerShell脚本数字签名认证

.
  • itanders
  • itanders
  • 2014年06月17日 18:18
  • 2459

CA证书数字签名

 数字签名是什么?
  • u013503014
  • u013503014
  • 2014年10月22日 21:16
  • 1985

C++Builder建立及调用DLL

C++Builder建立及调用DLL DLL简称动态链接库,是Windows中程序的重要组成部分。想象一下,一个程序需要多人共同完成开发,怎么个共同法?这时我们就要考虑把程 序分为好几个模块,团队...
  • qq_36096752
  • qq_36096752
  • 2016年11月28日 15:37
  • 1496

数字签名:有什么用,怎么用

1.win上的表现 换了Win7系统64位旗舰版的朋友是不是都发现了一点,以前32位Win7系统用的好好的小程序小应用,一下子就装不上了。这是由于Win7系统64位系统对于未有认证签名的驱动程序进...
  • hhz11
  • hhz11
  • 2015年10月26日 21:42
  • 402
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用C++Builder创建数字签名
举报原因:
原因补充:

(最多只允许输入30个字)