在windows中,可以直接使用微软提供的crypto库实现PKCS7签名与签名验证。签名接口函数为CryptSignMessage,其接口定义为:

  1. BOOL WINAPI CryptSignMessage(
  2. __in          PCRYPT_SIGN_MESSAGE_PARA pSignPara,
  3. __in          BOOL fDetachedSignature,
  4. __in          DWORD cToBeSigned,
  5. __in          const BYTE* rgpbToBeSigned[],
  6. __in          DWORD rgcbToBeSigned[],
  7. __out         BYTE* pbSignedBlob,
  8. __in_out      DWORD* pcbSignedBlob
  9. );

其中,第一个参数为CRYPT_SIGN_MESSAGE_PARA类型,它包含签名过程中一些参数的配置,如签名者证书,证书撤销列表,以及一些授权属性与非授权属性。第二个参数fDetachedSignature用来标识是否发送明文,如果为真,则不发送明文,需在接收方配置明文信息;反之,则发送签名消息的同时发送明文,接收方可从中取出明文。第三、四、五个参数与待签名的明文相关,如果fDetachedSignature为真,则它们都为空;否则,不能为空,第三个参数标识待签名明文的个数,可以有多组明文,第四个参数标识明文串,它是一个指针数组,其中包含每组明文的地址,第五个参数标识每组明文的长度。第六和第七个参数为生成的编码签名串,它是由PKCS7格式转化得到。

验证签名的接口函数有两种,分别为CryptVerifyMessageSignature和CryptVerifyDetachedMessageSignature,前者用来验证包含明文的签名,后者用来验证不包含明文的签名。它们的接口定义分别为:

  1. BOOL WINAPI CryptVerifyMessageSignature(
  2. __in          PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara,
  3. __in          DWORD dwSignerIndex,
  4. __in          const BYTE* pbSignedBlob,
  5. __in          DWORD cbSignedBlob,
  6. __out         BYTE* pbDecoded,
  7. __in_out      DWORD* pcbDecoded,
  8. __out_opt     PCCERT_CONTEXT* ppSignerCert
  9. );

其中,第一个参数为CRYPT_VERIFY_MESSAGE_PARA类型,它定义了一个获取签名者证书的回调函数,可以设置回调函数为空,默认从签名消息证书库中获取签名者证书。第二个参数dwSignerIndex用来标识签名者索引,因为签名消息可以由多个签名者签名构成,第三和第四个参数为接收到的签名串,第五和第六个参数为解码后得到的明文,第七个参数可以获取签名者证书上下文。

  1. BOOL WINAPI CryptVerifyDetachedMessageSignature(
  2. __in          PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara,
  3. __in          DWORD dwSignerIndex,
  4. __in          const BYTE* pbDetachedSignBlob,
  5. __in          DWORD cbDetachedSignBlob,
  6. __in          DWORD cToBeSigned,
  7. __in          const BYTE* rgpbToBeSigned[],
  8. __in          DWORD rgcbToBeSigned[],
  9. __out_opt     PCCERT_CONTEXT* ppSignerCert
  10. );

其中,第一和第二个参数与上面一致,第三和第四个参数为接收到的签名串,第五、六、七个参数用来标识明文信息,因为在签名串中不包含明文,第八个参数可以获取签名者证书上下文。

Crypto库实现PKCS7签名与签名验证的更多相关文章

  1. OpenSSL库验证PKCS7签名

    使用Crypto库签名和验证签名请参考Crypto库实现PKCS7签名与签名验证,可以使用OpenSSL库验证Crypto签名,OpenSSL验证签名可使用简单的代码描述如下: //signature ...

  2. 使用Crypto++库的CBC模式实现加密(二)

    前面已经有一篇介绍使用Crypto++库实现的加密的文章了,但是代码中考虑的不完全,所以就重新发了个二 C++封装: #include "zyaes.h" #include < ...

  3. 使用Crypto++库编译出错 解决办法

    错误信息: >------ 已启动生成: 项目: testCrypto++, 配置: Debug Win32 ------ >正在编译... >main.cpp >正在链接.. ...

  4. Crypto++库安装、测试

    项目中需要使用到C++加密解密库,选择了Crypto++这个开源库,于是先安装并写一个小例子试试 一.下载 网址:http://www.cryptopp.com/#download 二.打开项目 下载 ...

  5. C#调用Crypto++库AES ECB CBC加解密

    本文章使用上一篇<C#调用C++类库例子>的项目代码作为Demo.本文中,C#将调用C++的Crypto++库,实现AES的ECB和CBC加解密. 一.下载Crypto 1.进入Crypt ...

  6. windows下python3.7安装gmpy2、Crypto 库及rsa

    基于python3.7在windows下安装gmpy2 先检查一下是否安装了wheel文件包,在cmd中输入wheel,查看一下,如果没有安装,则输入安装:pip install wheel 如果遇到 ...

  7. 下载python的Crypto库出现的问题的解决:ModuleNotFoundError: No module named 'Crypto'

    在网上找了很多下载Crypto的方法,感觉作用都不算很大,然后自己瞎搞瞎搞就搞好了

  8. 在 python3.x中安装 Crypto 库

    1.安装:直接找过来 whl 安装:链接: https://pan.baidu.com/s/1zXjzchnqc1GgSWT9TjHDaA 提取码: dzbn 复制这段内容后打开百度网盘手机App,操 ...

  9. Windows10 VS2017 C++使用crypto++库加密解密(AES)

    参考文章: https://blog.csdn.net/tangcaijun/article/details/42110319 首先下载库: https://www.cryptopp.com/#dow ...

随机推荐

  1. 101+ Manual and Automation Software Testing Interview Questions and Answers

    101+ Manual and Automation Software Testing Interview Questions and Answers http://www.softwaretesti ...

  2. 3des加解密算法

    编号:1003时间:2016年4月1日09:51:11功能:openssl_3des加解密算法http://blog.csdn.net/alonesword/article/details/17385 ...

  3. threeSum_0

    //找出数组中三个数相加为0,返回存在的组数 //输入指正*A,长度为size,返回*B和长度num int threeSum_0(int *A,int size,int *B,int &nu ...

  4. 【转】C++11中的std::function

    原文地址:http://www.jellythink.com/archives/771 看看这段代码 先来看看下面这两行代码: std::function<void(EventKeyboard: ...

  5. USB协议-检测设备连接与速度

    在USB设备连接时,USB系统能自动检测到这个连接,并识别出其采用的数据传输速率.USB采用在D+或D-线上增加上拉电阻的方法来识别低速和全速设备. USB支持3种类型的传输速率:1.5Mb/s的低速 ...

  6. (进阶篇)浅谈COOKIE和SESSION关系和区别

    COOKIE介绍 cookie 常用于识别用户.cookie 是服务器留在用户计算机中的小文件.每当相同的计算机通过浏览器请求页面时,它同时会发送 cookie.通过 PHP,您能够创建并取回 coo ...

  7. UVa 10747 - Maximum Subsequence

    题目大意:给出n个数,从中选取k个,使得乘积最大,并且尽量使和最大 分析:首先按照数的绝对值大小排序.然后就要分三大类情况讨论: (1)前k个中选到0:如果选到0的话,乘积一定是0,所以尽量选大的数, ...

  8. 安装Python+Pywin32(version 3.3)

    1.下载python3.3,默认设置,安装. 2.完成后,在开始-程序中运行python IDLE.我在运行时出现了应用程序运行异常,原因是与其他软件内存发生冲突,如.net framework等. ...

  9. SAP 物料移动tcode

    月底,财务月结,需要关账,关闭物料移动功能,支持财务对账: 其中一项任务是要锁定物料移动tcode,这应该是其中部分: CO27 PPIOM000 1000 拣配清单MB1A SAPMM07M 400 ...

  10. C专家编程学习 1

    1.C语言的基本数据类型直接与底层硬件相对应. 2#define 是可能出现问题 1 2 3 4 5 #define a(y) a_ex(y) a(x)被扩展为 a_ex(x)   #define a ...