`
isiqi
  • 浏览: 16825304 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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

阅读更多

用C++Builder创建数字签名

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

  一、程序原理
  数字签名的工作原理还是比较简单的,它是根据你所提供的原始数据,经过复杂的算法,产生特定的数据签名,对方通过同样的过程也产生签名,如果数据已被修改,那么就不可能得到两份一模一样的签名,从而就可判断数据已被他人修改。编程人员利用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++Builder 资料库

    10用C++Builder创建数字签名 11用Enter 键控制焦点切换的方法 12.拦 截 Windows 消 息 13.使用CommaText 14.程序开始时先显示信息框 15.怎样获取程序的命令行参数? 16.如何监视剪贴板 17.如何使用OnIdle事件...

    自己实现的Json和简单HTTP请求(C++ Builder 平台)

    在IT行业中,C++ Builder是一种流行的开发环境,它允许开发者使用C++语言构建跨平台的应用程序。本项目涉及的主题是“自己实现的Json和简单HTTP请求”,这在现代网络编程中是非常基础且重要的技能。JSON(JavaScript...

    C++builder的60个编程资料

    4. **数字签名**:C++Builder允许开发者创建和管理数字签名,这对于安全性和认证至关重要。 5. **焦点切换**:通过Enter键控制焦点在界面上的切换,涉及键盘事件处理和窗体控件的交互。 6. **消息拦截**:可以拦截...

    C++_Builder的60个编程资料

    C++ Builder签名 - **知识点**:了解如何为C++ Builder项目添加签名。 - **示例代码**:不适用 #### 7. 环境变量设置 - **知识点**:学习如何在C++ Builder中配置和使用环境变量。 - **示例代码**: ```cpp ...

    C++ Builder项目开发实践(光盘、源代码、源码)

    C++ Builder是一款强大的集成开发环境(IDE),专为C++编程语言设计,它结合了编译器、调试器、可视化组件库以及各种工具,旨在帮助开发者高效地创建桌面应用程序。本资源“C++ Builder项目开发实践(光盘、源代码、...

    C++ Builder函数查询器

    掌握如何有效地使用C++ Builder的函数查询器,能极大地提高开发效率,减少编程过程中的错误,并促进代码质量的提升。对于初学者和经验丰富的开发者来说,这是一个不可或缺的工具。在日常编程工作中,应充分利用其...

    Capicom.rar_C++builder

    标题中的"Capicom.rar_C++builder"表明这是一个与C++ Builder开发环境相关的资源,特别是关于Capicom库的使用。Capicom是Microsoft提供的一个组件,全称为"Capitalware Cryptographic API Component Object Model",...

    Borland C++ Builder 6 应用开发技术解析

    使用C++ Builder 6开发的程序具有出色的性能,这得益于编译器的优化和对底层硬件的充分利用。C++ Builder 6采用先进的编译技术,生成的程序运行速度快,占用资源少,非常适合需要高性能计算的应用程序开发。 在网络...

    MD5算法的C Builder实现

    你可以使用C++ Builder的VCL(Visual Component Library)框架,创建按钮、文本框等控件,并编写事件处理函数来执行MD5计算。 7. **文件处理**:如果需要计算文件的MD5值,你需要打开文件,读取其内容并逐块地传递...

    exe文件修改器_修改Delphi和C++ Builder编译的exereshack_zh

    对于Delphi和C++ Builder开发者来说,这个工具特别有用,因为它们创建的exe文件包含丰富的资源信息。 Delphi是一种面向对象的Pascal编程语言,它以其快速的编译器和易用的集成开发环境(IDE)而闻名。C++ Builder则...

    C++程序设计技巧

    用C++Builder创建数字签名 C++Builder4.0实现在线接收电子邮件 用BCB创建基于Internet的点对点Chat 用BCB在windows桌面创建快捷方式 程序中检测并调用缺省浏览器(VC) BIG5到GB的转换技术 在C++Builer中多...

    PDFium Component Suite v5.8 for Delphi & C++ Builder 5 - 10.4 S

    PDFium Component Suite v5.8 是一套专为 Delphi 和 C++ Builder 用户设计的PDF处理组件,支持从 Delphi 5 到 Delphi 10.4 的多个版本。这个工具包提供了强大的功能,使开发者能够轻松地在自己的应用程序中集成PDF...

    C++的OpenSSL支持库(含win32和x64),安装即可使用,无需编译!

    4. 使用OpenSSL提供的函数进行加密、解密、签名、验证等操作,如`SSL_CTX_new()`创建SSL上下文,`SSL_connect()`建立SSL连接等。 总的来说,这个压缩包提供了一个方便C++开发者使用的预编译OpenSSL库,覆盖了两种...

    c++builder资料

    ### C++Builder中创建与使用DLL #### 一、创建DLL 在C++Builder中创建DLL,首先要了解其基本结构和工作原理。 1. **创建DLL工程**:通过`File | New`创建一个新的DLL工程,并保存文件。这将生成一个基本的DLL程序...

    C++Builder6实现HmacSha1算法

    最近用到阿里云物联网平台,没有合适的SDK,需要自行开发接入,MQTT连接签名需要用到hmacsha1算法,找了一些资料,用C++ Builder6做了个demo实现了,给大家做个参考,加密出来签名和阿里云物联网平台官方示例一致。

    用API验证数字签名

    该库支持多种编程语言,例如Delphi和C++ Builder,为开发者提供了丰富的API接口,帮助他们更轻松地集成和使用系统级功能,比如数字签名验证。 在提供的文件列表中,我们可以看到以下文件: 1. `frmuMain.dfm` - 这...

    RSA.rar_c++ builder RSA_generation_rsa_rsa c++

    在实际应用中,RSA常用于数字签名、数据加密和密钥交换等场景。然而,由于其计算量较大,不适用于大量数据的加密,通常与对称加密算法(如AES)结合使用,即用RSA加密对称密钥,然后用对称密钥加密大量数据,以达到...

    BCB59个经典问题

    10用C++Builder创建数字签名 11用Enter 键控制焦点切换的方法 12.拦 截 Windows 消 息 13.使用CommaText 14.程序开始时先显示信息框 15.怎样获取程序的命令行参数? 16.如何监视剪贴板 17.如何使用OnIdle事件...

    C++实现RSA加密解密算法

    它是现代密码学的基础之一,广泛应用于数据加密、数字签名等领域。 **1. RSA的工作原理** RSA的核心在于大素数的乘积分解困难性。它包含两个密钥:公钥和私钥。公钥用于加密,而私钥用于解密。任何人都可以使用...

Global site tag (gtag.js) - Google Analytics