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

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

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

1.openssl的签名及验证

  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. }

2.CryptoAPI的签名验证

依然是私钥的问题,没时间再去尝试导入私钥,暂且只写验证

因为也是RSA加密,所以同样要注意字节排列方式,具体看RSA加密的交互部分

    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;

CryptoAPI与openssl数字签名与验证交互的更多相关文章

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

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

  2. JAR包数字签名与验证

    经签名的Jar包内包含了以下内容: 原Jar包内的class文件和资源文件 签名文件 META-INF/*.SF:这是一个文本文件,包含原Jar包内的class文件和资源文件的Hash 签名block ...

  3. Java代码实现文件添加数字签名、验证数字签名

    Linux下实现加签.验签 1.使用OpenSSL 生成公钥和密钥: #用 OpenSSL, Linux 上自带,常用命令如下: #生成 RSA 私钥(传统格式的) openssl genrsa -o ...

  4. PHP中使用OpenSSL下openssl_verify验证签名案例

    使用OpenSSL那么需要先了解一下http://www.cnblogs.com/wt645631686/p/8390936.html <?php //demo $json = '{" ...

  5. 笔记本启动时提示错误:amd_xata.sys数字签名无法验证

    开机失败,提示adm文件无法验证 文件:Windows\system32\drivers\amd_xata.sys 状态:0xc0000428 信息:Windows 无法验证此文件的数字签名   工具 ...

  6. go语言 RSA数字签名和验证签名

    package main import ( "crypto" "crypto/rand" "crypto/rsa" "crypto ...

  7. openssl+vsftpd 加密验证方式

    [root@localhost ~]# rpm -q opensslopenssl-1.0.1e-48.el6.x86_64[root@localhost ~]# ldd /usr/sbin/vsft ...

  8. 在 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 ...

  9. openssl与cryptoAPI交互AES加密解密

    继上次只有CryptoAPI的加密后,这次要实现openssl的了 动机:利用CryptoAPI制作windows的IE,火狐和chrome加密控件后,这次得加上与android的加密信息交互 先前有 ...

随机推荐

  1. Python编程感悟

    从今年起开始学习python,最开始是听得MIT的那门公开课,然后又看了一本入门的书籍.但是总是没有觉得python很好用.可能的原因现在想起来是:IDE始终找不到顺手的,另外R用得太舒服了- any ...

  2. Easy Problem-map和vector的使用

    给出一个包含n个整数的数组,你需要回答若干询问.每次询问包含两个整数k和v,输出从左到右第k个v的下标(数组下标,从左右到右编号1~n). [输入格式] 输入包含多组数据.每组数据第一行为两个整数n和 ...

  3. Canvas俄罗斯方块

    写在前面 潜水博客园多年,从未写过博客.最近才注册博客,遂将很久前写的俄罗斯方块分享出来.第一次写博客,不喜勿喷... 游戏说明 游戏操作:J向左,L向右,I旋转,K快速下降 游戏基于HTML can ...

  4. ZOJ 1068 P,MTHBGWB

    原题链接 题目大意:给定一个字符串,先用Morse Code编码,把编码倒序,再解码成字符串.现给定处理后的字符串,求原始信息. 解法:用C++String类的函数.每次读入一个字符,就在string ...

  5. ztong上机3

    二.实验名称:数字图像处理matlab上机 三.实验学时:2学时 四.实验目的:(详细填写) 掌握几何变换 掌握插值 理解配准的概念 五.实验内容 (1)首先自己写一个对图像进行旋转和缩放的复合变换程 ...

  6. OnItemSelectedListener事件与二级联动

    一.界面 1.新建province.xml件. 在“res/values”位置新建province.xml文件. (1)province.xml文件位置如下图所示: (2)province.xml内容 ...

  7. hihoCoder#1055 : 刷油漆 (树形DP+01背包)

    题目大意:给一棵带点权的树,现在要从根节点开始选出m个连通的节点,使总权值最大. 题目分析:定义状态dp(u,m)表示在以u为根的子树从根节点开始选出m个点连通的最大总权值,则dp(u,m)=max( ...

  8. (转)TensorFlow 入门

        TensorFlow 入门 本文转自:http://www.jianshu.com/p/6766fbcd43b9 字数3303 阅读904 评论3 喜欢5 CS224d-Day 2: 在 Da ...

  9. 安装postgreSQL出现configure:error:readline library not found解决方法

    要安装 readline , readline-dev 开发包,要么使用 --without-readline 选项关闭 readline 功能. #yum install readline; #yu ...

  10. Phython 学习笔记之——类的初步认识

    类是面向对象编程的核心,他扮演相关数据及逻辑容器的角色.他们提供了创建实例对象的蓝图.因为python语言不要求必须以面向对象的方式编程(与JAVA不同),这里简单的举一个例子. 如何定义一个类 cl ...