CryptoAPI与openssl数字签名与验证交互
昨天写过了RSA非对称加密解密的交互方式,
其实数字签名也是RSA非对称加密,只不过用私钥加密的,再加上个hash摘要
CryptoAPI与openssl RSA非对称加密解密(PKCS1 PADDING)交互已经提到关于证书和私钥的数据以及对象获取,这里就不再重复讨论
1.openssl的签名及验证
- void opensslSigner::sign(EVP_PKEY* evpKey,BYTE** signValue,unsigned int &signLen,BYTE* text,int textLen)
- {
- EVP_MD_CTX mdctx; //摘要算法上下文变量
- if(evpKey == NULL)
- {
- printf("EVP_PKEY_new err\n");
- return;
- }
- //以下是计算签名的代码
- EVP_MD_CTX_init(&mdctx); //初始化摘要上下文
- if(!EVP_SignInit_ex(&mdctx,EVP_md5(),NULL)) //签名初始化,设置摘要算法
- {
- printf("err\n");
- EVP_PKEY_free(evpKey);
- return;
- }
- if(!EVP_SignUpdate(&mdctx,text,textLen)) //计算签名(摘要)Update
- {
- printf("err\n");
- EVP_PKEY_free(evpKey);
- return;
- }
- if(!EVP_SignFinal(&mdctx,*signValue,&signLen,evpKey)) //签名输出
- {
- printf("err\n");
- EVP_PKEY_free(evpKey);
- return;
- }
- printf("消息\"%s\"的签名值是:\n",text);
- printByte(*signValue,signLen);
- printf("\n");
- EVP_MD_CTX_cleanup(&mdctx);
- }
- void opensslSigner::verify(EVP_PKEY* evpKey,BYTE* text,unsigned int textLen,BYTE* signValue,unsigned int signLen)
- {
- ERR_load_EVP_strings();
- EVP_MD_CTX mdctx; //摘要算法上下文变量
- EVP_MD_CTX_init(&mdctx); //初始化摘要上下文
- if(!EVP_VerifyInit_ex(&mdctx, EVP_md5(), NULL)) //验证初始化,设置摘要算法,一定要和签名一致
- {
- printf("EVP_VerifyInit_ex err\n");
- EVP_PKEY_free(evpKey);
- return;
- }
- if(!EVP_VerifyUpdate(&mdctx, text, textLen)) //验证签名(摘要)Update
- {
- printf("err\n");
- EVP_PKEY_free(evpKey);
- return;
- }
- if(!EVP_VerifyFinal(&mdctx,signValue,signLen,evpKey))
- {
- printf("verify err\n");
- EVP_PKEY_free(evpKey);
- EVP_MD_CTX_cleanup(&mdctx);
- return;
- }
- else
- {
- printf("验证签名正确.\n");
- }
- //释放内存
- EVP_PKEY_free(evpKey);
- EVP_MD_CTX_cleanup(&mdctx);
- }
2.CryptoAPI的签名验证
依然是私钥的问题,没时间再去尝试导入私钥,暂且只写验证
因为也是RSA加密,所以同样要注意字节排列方式,具体看RSA加密的交互部分
- void verify(HCRYPTPROV hProv,PCCERT_CONTEXT cert,BYTE* text,unsigned long len,BYTE* signValue,unsigned long signLen)
- {
- //反序与openssl一致
- for(int i = 0 ; i < signLen / 2;i++)
- {
- BYTE temp = signValue[i];
- signValue[i] = signValue[signLen - i - 1];
- signValue[signLen - i - 1] = temp;
- }
- // 创建离散对象
- HCRYPTHASH hHash = NULL;
- if(!CryptCreateHash(
- hProv, // 容器句柄
- CALG_MD5, // 算法标识
- NULL, // 算法使用的Key
- 0, // 算法标识
- &hHash)) // 返回的HASH对象
- {
- printf("CryptCreateHash error:0X%x.\n",GetLastError());
- return;
- }
- // 计算数据摘要
- if(CryptHashData(hHash, text, len, 0) == 0)
- {
- printf("CryptHashData error:0X%x.\n",GetLastError());
- return;
- }
- if(cert == NULL)
- {
- printf("pCertContext == NULL:0X%x.\n",GetLastError());
- return;
- }
- //获取公钥句柄
- HCRYPTKEY hPubKey;
- if(!CryptImportPublicKeyInfo(hProv, cert->dwCertEncodingType, &cert->pCertInfo->SubjectPublicKeyInfo, &hPubKey))
- {
- printf("CryptImportPublicKeyInfo error:0X%x.\n",GetLastError());
- return;
- }
- //验证签名
- if(!CryptVerifySignature(hHash, signValue, signLen, hPubKey, NULL, 0))
- {
- printf("CryptVerifySignature error:0X%x.\n",GetLastError());
- return;
- }
- cout << "sign verify successfully" << endl;
CryptoAPI与openssl数字签名与验证交互的更多相关文章
- CryptoAPI与openssl RSA非对称加密解密(PKCS1 PADDING)交互
(以下代码中都只做测试用,有些地方没有释放内存...这个自己解决下) 1.RSA非对称的,首先提供一个供测试用的证书和私钥的数据 1)pem格式的证书和私钥(公私钥是对应的)的base64编码 voi ...
- JAR包数字签名与验证
经签名的Jar包内包含了以下内容: 原Jar包内的class文件和资源文件 签名文件 META-INF/*.SF:这是一个文本文件,包含原Jar包内的class文件和资源文件的Hash 签名block ...
- Java代码实现文件添加数字签名、验证数字签名
Linux下实现加签.验签 1.使用OpenSSL 生成公钥和密钥: #用 OpenSSL, Linux 上自带,常用命令如下: #生成 RSA 私钥(传统格式的) openssl genrsa -o ...
- PHP中使用OpenSSL下openssl_verify验证签名案例
使用OpenSSL那么需要先了解一下http://www.cnblogs.com/wt645631686/p/8390936.html <?php //demo $json = '{" ...
- 笔记本启动时提示错误:amd_xata.sys数字签名无法验证
开机失败,提示adm文件无法验证 文件:Windows\system32\drivers\amd_xata.sys 状态:0xc0000428 信息:Windows 无法验证此文件的数字签名 工具 ...
- go语言 RSA数字签名和验证签名
package main import ( "crypto" "crypto/rand" "crypto/rsa" "crypto ...
- openssl+vsftpd 加密验证方式
[root@localhost ~]# rpm -q opensslopenssl-1.0.1e-48.el6.x86_64[root@localhost ~]# ldd /usr/sbin/vsft ...
- 在 Linux redis 验证交互连接过程中遇到 redis Could not connect to Redis at 127.0.0.1:6379: Connection refused 的解决方法
Could not connect to Redis at 127.0.0.1:6379: Connection refused 1.找到redis.conf 并修改 daemonize no 为 d ...
- openssl与cryptoAPI交互AES加密解密
继上次只有CryptoAPI的加密后,这次要实现openssl的了 动机:利用CryptoAPI制作windows的IE,火狐和chrome加密控件后,这次得加上与android的加密信息交互 先前有 ...
随机推荐
- php <? ?> <?php ?>
/******************************************************************** * php <? ?> <?php ?&g ...
- PHP 转换snmp的时间格式
function convert_snmp_timeticks($timeticks) { if(!is_numeric($timeticks)) { return FALSE; } //如果是字符串 ...
- cocos2d-html5如何更改预加载时的默认的logo图片和删除loading小圈圈
找到框架目录(2.1.4)里的cocos2d目录里有个CCLoader.js文件,找到LoaderScene的构造方法ctor,可以看到有一行: this._logoTexture.src= &quo ...
- IE6 IE7下文字显示竖排的解决办法
IE下文字显示竖排的解决办法: white-space:nowrap;
- 运动历史图(MHI)——Motion History Image
MHI最初是由Bobick 和 Davis提出的,在此之前,Bobick 和 Davis 首先提出了二值的运动能量图(Motion Energy Image,MEI),通过描述物体如何移动和运动在空间 ...
- CSS控制文本自动换行
1.你定死表格的宽度,即给表格一个宽度值(是数值,不是百分比) 2.强制不换行 div{ //white-space:不换行;normal 默认;nowrap强制在同一行内显示所有文本,直到文本结束或 ...
- hadoop常用管理员命令
hadoop job -list 列出正在运行的job hadoop job -kill kill掉job hadoop fsck 检查HDFS坏快 hadoop dfsadmin -report检查 ...
- IOS中打开应用实现检查更新的功能
//检查更新页面 - (void)Renew{ NSDictionary *infoDic = [[NSBundle mainBundle]infoDictionary]; ...
- [AC自动机]题目合计
我只是想记一下最近写的题目而已喵~ 题解什么的才懒得写呢~ [poj 1625]Censored! 这题注意一个地方,就是输入数据中可能有 ASCII 大于 128 的情况,也就是说用 char 读入 ...
- java CS结构软件自动升级的实现
前段时间做了一个工具发布给公司的各部门使用后反馈了不少BUG,每次修改后均需要发邮件通知各用户替换最新版本,很不方便,因此后来就写了一个自动升级的功能,这样每次发布新的版本时只需要将其部署到自动升级服 ...