http://blog.csdn.net/zhouyuqwert/article/details/7467296

昨天写过了RSA非对称加密解密的交互方式,

其实数字签名也是RSA非对称加密,只不过用私钥加密的,再加上个hash摘要

CryptoAPI与openssl RSA非对称加密解密(PKCS1 PADDING)交互已经提到关于证书和私钥的数据以及对象获取,这里就不再重复讨论

1.openssl的签名及验证

[cpp] view plaincopyprint?
  1. void opensslSigner::sign(EVP_PKEY* evpKey,BYTE** signValue,unsigned int &signLen,BYTE* text,int textLen)
  2. {
  3. EVP_MD_CTX mdctx;   //摘要算法上下文变量
  4. if(evpKey == NULL)
  5. {
  6. printf("EVP_PKEY_new err\n");
  7. return;
  8. }
  9. //以下是计算签名的代码
  10. EVP_MD_CTX_init(&mdctx);        //初始化摘要上下文
  11. if(!EVP_SignInit_ex(&mdctx,EVP_md5(),NULL)) //签名初始化,设置摘要算法
  12. {
  13. printf("err\n");
  14. EVP_PKEY_free(evpKey);
  15. return;
  16. }
  17. if(!EVP_SignUpdate(&mdctx,text,textLen)) //计算签名(摘要)Update
  18. {
  19. printf("err\n");
  20. EVP_PKEY_free(evpKey);
  21. return;
  22. }
  23. if(!EVP_SignFinal(&mdctx,*signValue,&signLen,evpKey))  //签名输出
  24. {
  25. printf("err\n");
  26. EVP_PKEY_free(evpKey);
  27. return;
  28. }
  29. printf("消息\"%s\"的签名值是:\n",text);
  30. printByte(*signValue,signLen);
  31. printf("\n");
  32. EVP_MD_CTX_cleanup(&mdctx);
  33. }
  34. void opensslSigner::verify(EVP_PKEY* evpKey,BYTE* text,unsigned int textLen,BYTE* signValue,unsigned int signLen)
  35. {
  36. ERR_load_EVP_strings();
  37. EVP_MD_CTX mdctx;   //摘要算法上下文变量
  38. EVP_MD_CTX_init(&mdctx);    //初始化摘要上下文
  39. if(!EVP_VerifyInit_ex(&mdctx, EVP_md5(), NULL)) //验证初始化,设置摘要算法,一定要和签名一致
  40. {
  41. printf("EVP_VerifyInit_ex err\n");
  42. EVP_PKEY_free(evpKey);
  43. return;
  44. }
  45. if(!EVP_VerifyUpdate(&mdctx, text, textLen)) //验证签名(摘要)Update
  46. {
  47. printf("err\n");
  48. EVP_PKEY_free(evpKey);
  49. return;
  50. }
  51. if(!EVP_VerifyFinal(&mdctx,signValue,signLen,evpKey))
  52. {
  53. printf("verify err\n");
  54. EVP_PKEY_free(evpKey);
  55. EVP_MD_CTX_cleanup(&mdctx);
  56. return;
  57. }
  58. else
  59. {
  60. printf("验证签名正确.\n");
  61. }
  62. //释放内存
  63. EVP_PKEY_free(evpKey);
  64. EVP_MD_CTX_cleanup(&mdctx);
  65. }
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加密的交互部分

[cpp] view plaincopyprint?
  1. void verify(HCRYPTPROV hProv,PCCERT_CONTEXT cert,BYTE* text,unsigned long len,BYTE* signValue,unsigned long signLen)
  2. {
  3. //反序与openssl一致
  4. for(int i = 0 ; i < signLen / 2;i++)
  5. {
  6. BYTE temp = signValue[i];
  7. signValue[i] = signValue[signLen - i - 1];
  8. signValue[signLen - i - 1] = temp;
  9. }
  10. // 创建离散对象
  11. HCRYPTHASH hHash = NULL;
  12. if(!CryptCreateHash(
  13. hProv,                        // 容器句柄
  14. CALG_MD5,                    // 算法标识
  15. NULL,                        // 算法使用的Key
  16. 0,                            // 算法标识
  17. &hHash))                    // 返回的HASH对象
  18. {
  19. printf("CryptCreateHash error:0X%x.\n",GetLastError());
  20. return;
  21. }
  22. // 计算数据摘要
  23. if(CryptHashData(hHash, text, len, 0) == 0)
  24. {
  25. printf("CryptHashData error:0X%x.\n",GetLastError());
  26. return;
  27. }
  28. if(cert == NULL)
  29. {
  30. printf("pCertContext == NULL:0X%x.\n",GetLastError());
  31. return;
  32. }
  33. //获取公钥句柄
  34. HCRYPTKEY hPubKey;
  35. if(!CryptImportPublicKeyInfo(hProv, cert->dwCertEncodingType, &cert->pCertInfo->SubjectPublicKeyInfo, &hPubKey))
  36. {
  37. printf("CryptImportPublicKeyInfo error:0X%x.\n",GetLastError());
  38. return;
  39. }
  40. //验证签名
  41. if(!CryptVerifySignature(hHash, signValue, signLen, hPubKey, NULL, 0))
  42. {
  43. printf("CryptVerifySignature error:0X%x.\n",GetLastError());
  44. return;
  45. }
  46. cout << "sign verify successfully" << endl;
  47. }

CryptoAPI与openssl数字签名与验证交互相关推荐

  1. CryptoAPI与openssl RSA非对称加密解密(PKCS1 PADDING)交互

    (以下代码中都只做测试用,有些地方没有释放内存...这个自己解决下) 1.RSA非对称的,首先提供一个供测试用的证书和私钥的数据 1)pem格式的证书和私钥(公私钥是对应的)的base64编码 [cp ...

  2. 数字签名(代码签名)流程和数字签名的验证

    数字签名(代码签名)流程 数字签名(代码签名)流程 Authenticode : 这里翻译为数字认证代码.  code sign : 字面的翻译为代码签名,但是通常的我们称为数字签名,以下的文中均称为 ...

  3. python基于rsa的数字签名实现_OpenSSL和Python实现RSA Key数字签名和验证

    OpenSSL和Python实现RSA Key数字签名和验证,基于非对称算法的RSA Key主要有两个用途,数字签名和验证(私钥签名,公钥验证),以及非对称加解密(公钥加密,私钥解密).本文提供一个基 ...

  4. python生成数字签名及验证签名

    公私钥生成方法,请见前文 实例:python生成数字签名及验证 import base64from Crypto.Hash import SHA256 from Crypto.PublicKey im ...

  5. OPENSSL X509证书验证

    openssl实现了标准的x509v3数字证书,其源码在crypto/x509和crypto/x509v3中.其中x509目录实现了数字证书以及证书申请相关的各种函数,包括了X509和X509_REQ ...

  6. java api接口签名验证失败_cryptapi结合java进行数字签名与验证签名的困惑

    最近的一个项目需要用到数字签名,参考以下网友文章后,http://hi.baidu.com/luckydogs888/blog/item/50103cf0b587a8aea40f52ee.html,客 ...

  7. PDF数字签名与验证

    工具:Acrobat Reader DC 前提:数字证书(包含私钥) 一.签名 1.在"工具栏"中选择"证书",将会展示"数字签名"菜单: ...

  8. 用python3实现MD5withRSA数字签名的验证

    在某次安全研究中.需要手工验证下某重要文件MD5withRSA的数字签名是否正确.于是写了个脚本.现记录下来,供大家学习讨论. 1. 数字签名基础知识 数字签名: 一旦选择足够安全的散列算法, 那么就 ...

  9. 【密码学五】数字签名、RSA实现数字签名和验证

    消息认证码&数字签名 消息认证码(message authentication code)是一种确认完整性并进行认证的技术,取三个单词的首字母,简称为MAC. 消息认证码的输入包括任意长度的消 ...

最新文章

  1. 使用 TensorFlow 的公司
  2. Lodop导出图片和打印机无关,测试是否有关
  3. ASP.NET jQuery 随笔 在TextBox里面阻止复制、剪切和粘贴事件
  4. Go:go语言的认识理解、安装应用、语法使用之详细攻略
  5. qt中的update()
  6. linux 系统如何防止攻击
  7. Python程序员的30个常见错误
  8. php中reset函数,PHP reset()函数
  9. 安装Cocoapods,以及其中出现的问题
  10. 大数据之-Hadoop3.x_Yarn_基础架构---大数据之hadoop3.x工作笔记0141
  11. Android中BitmapFactory.Options详解
  12. 给项目添加spring的测试单元
  13. C++ 类模板三(类模版中的static关键字)
  14. 机器视觉算法(系列一)--机器视觉简短入门
  15. wsdl2java validate_使用cxf wsdl2java进行客户端证书身份验证
  16. 《剑指offer》66道算法题合集(java实现)
  17. 全国软考中级软件设计师 学习笔记-数据流图部分
  18. Vuejs中字符串判空处理--如何判断字符串是否为空或不为空
  19. 《程序开发心理学——程序开发组》
  20. BMS模块相关的JTS-1108HL评测及BMS网络滤波器规格

热门文章

  1. 指数随机变量 泊松过程跳_《常见随机过程》(一)
  2. python discuz_python实现的登陆Discuz!论坛通用代码分享
  3. 蓝桥杯最短路(java过)spfa单源最短路算法
  4. Java 转换流 简介
  5. Java 多态的简单介绍.
  6. 数据结构 链表(二)
  7. 【技术】TCP 的固定窗口和滑动窗口
  8. 台式计算机m9870t,JBT9870_水力测功器最新标准规范(14页)-原创力文档
  9. 五分钟学会使用 go modules(含在家办公使用技巧)
  10. sql科学计数法转换为普通数字_一张图读懂Python3的Number(数字)类型