ECDSA的全名是Elliptic Curve DSA,即椭圆曲线DSA。它是Digital Signature Algorithm (DSA)应用了椭圆曲线加密算法的变种。椭圆曲线算法的原理很复杂,但是具有很好的公开密钥算法特性,通过公钥无法逆向获得私钥。
 
第一部分 : DSA的签名和验证过程
 
要了解ECDSA,首先要了解DSA签名的过程和验证过程。为了理解的方便,这里省去诸多DSA算法的细节,仅就重要的几个点进行讨论。
 
1. 签名过程
    假设要签名的消息是一个字符串:“Hello World!”。DSA签名的第一个步骤是对待签名的消息生成一个消息摘要。不同的签名算法使用不同的消息摘要算法。比如,DSS使用SHA1来生成160比特的摘要,而ECDSA256使用SHA256生成256比特的摘要。
    摘要生成结束后,应用签名算法对摘要进行签名:
 
  1. 产生一个随机数k
  2. 利用随机数k,计算出两个大数r和s。将r和s拼在一起就构成了对消息摘要的签名。

这里需要注意的是,因为随机数k的存在,对于同一条消息,使用同一个算法,产生的签名是不一样的。从函数的角度来理解,签名函数对同样的输入会产生不同的输出。因为函数内部会将随机值混入签名的过程。

 
2. 验证过程
    关于验证过程,这里不讨论它的算法细节。从宏观上看,消息的接收方从签名中分离出r和s,然后利用公开的密钥信息和s计算出r。如果计算出的r和接收到的r值相同,则表示验证成功。否则,表示验证失败。
 
第二部分 : 用Openssl来实现ECDSA签名
 
Openssl实现了ECDSA算法,并预定义好了各个椭圆曲线的参数。以下以RFC4745中定义的ECDSA256为例,详述用Openssl实现ECDSA签名的过程。关于ECDSA算法的各种数据结构的意义和接口的使用方法,可以参考Openssl的官方文档。
 
第一步 - 计算消息摘要
Openssl的上层接口EVP提供了计算消息摘要和签名各种借口,前提是必须有预定义好的EVP_MD。对于ECDSA算法,Openssl预定义好了一个EVP_ecdsa结构,其中定义的消息摘要算法是SHA1,并不是我们需要的SHA256。因此,不能直接使用EVP_DigestSignFinal()接口一步生成签名,需要分开计算摘要和签名。
 
代码如下:
 
 
第二步 - 计算对摘要的签名
ECDSA签名算法是一个确定的算法。不同的椭圆曲线只有参数上的不同。所以,算出正确签名的前提是设置正确的参数。ECDSA签名的输入参数有:待签名的数字摘要,数字摘要的长度,密钥EC_KEY。
 
密钥可以来自于私钥文件,也可以随机生成。如果随机生成,则代码如下:
 
 
这里,首先通过椭圆曲线的标识符NID_X9_62_prime256v1生成一个EC_KEY。通过这种方式生成的EC_KEY里已经包含了椭圆曲线的参数。否则,需要手动设置EC_GROUP。然后调用EC_KEY_generate_key来生成私钥和公钥。
 
ECDSA_do_sign的返回值是一个包含了r和s的数据结构。可以调用i2d_ECDSA_SIG函数将其编码成DER结构。但是IPSec的payload中传输的是(r,s)的联合,所以需要将这两个BIGNUM转换成二进制比特流。
 
前面提到,密钥可以来自于私钥文件。如果密钥来自于私钥文件,可以首先调用PEM的相关函数,生成EVP_PKEY,然后调用EVP_PKEY_get1_EC_KEY函数从EVP_PKEY中取得EC_KEY。需要注意的是,从EVP_PKEY中取得的EC_KEY可能没有设置椭圆曲线参数EC_GROUP。所以,或者手动设置EC_GROUP,或者创建一个新的EC_KEY,然后调用EC_KEY_set_private_key和EC_KEY_set_public_key函数将私钥和公钥设置进来。
 
第三部分 : 其他
 
如果只知道私钥和所使用椭圆曲线,可以通过EC_POINT_mul函数生成公钥。第一个参数是EC_GROUP,第二个参数保存生成的公钥,第三个参数是私钥,其他参数忽略。
 

更新(2017.02.08):
1. 有些朋友来信希望能看一下文中相关源码,由于作成此文时的代码早已丢失,之后几年很少再做Openssl相关的开发,于是也没有重写代码。最近在阅读Openssl最新源码时发现,其自带的测试文档就是最好的示例。请下载最新的Openssl源码并解压,test/ecdsatest.c就是最好的例子。本文中涉及的所有代码均可从ecdsatest.c中找到对照之处,大部分在函数x9_62_test_internal中。
2. 如有其他相关问题,可以邮件联系jiangwlee@163.com

 
转自:
http://blog.csdn.net/jiangwlee/article/details/11817579

用Openssl计算ECDSA签名的更多相关文章

  1. 使用openssl实现ECDSA签名以及验证功能(附完整测试源码)

    突然找到数年前写的这段代码,当是因为对密码学几乎不怎么了解踩了一些坑,现在开源出来方便大家直接利用. ECDSA的全名是Elliptic Curve DSA,也就是椭圆曲线DSA,由于椭圆曲线的复杂性 ...

  2. java-信息安全(十一)-非对称加密算法ECC以及ECDSA签名

    概述 信息安全基本概念: ECC算法(Elliptic curve cryptography,椭圆曲线密码学) 一.ECC加密解密[暂时无意义] 椭圆加密算法(ECC)是一种公钥加密体制,最初由Kob ...

  3. 使用openssl创建自签名证书及部署到IIS教程

    概要 本文讲解三个部分:1. 创建自签名证书2. 创建自己的证书颁发机构3. 以及如何配置IIS 创建自签名证书 首先,创建一个私钥文件: openssl genrsa -out myselfsign ...

  4. openssl+前端jsrsa签名+后端nodejs验签

    内容如标题所示,总体分为三个部分: 一.win10下安装openssl,然后通过openssl工具生成RSA的公钥和私钥 (1)win10下安装openssl需要的工具有:VS2013,Perl,na ...

  5. openssl生成自签名证书

    1.生成x509格式的CA自签名证书 openssl req -new -x509 -keyout ca.key -out ca.crt 2.生成服务端的私钥(key文件)及申请证书文件csr文件 o ...

  6. 用OpenSSL生成自签名证书在IIS上搭建Https站点(用于iOS的https访问)

    前提: 先安装openssl,安装有两种方式,第一种直接下载安装包,装上就可运行:第二种可以自己下载源码,自己编译.这里推荐第一种. 安装包:http://slproweb.com/products/ ...

  7. openssl实现自签名证书

    前言 证书的作用 加密通信数据,验证对象身份,保证数据完整性 什么是自签名证书 公认的证书往往都需要收费,如果客户端与服务端都是由我们自己来操控,那便可以使用自签名证书(说白了就是只是自己认可的证书) ...

  8. OpenSSL使用1(用OpenSSL生成自签名证书在IIS上搭建Https站点)(用于iOS的https访问)

    前提: 先安装openssl,安装有两种方式,第一种直接下载安装包,装上就可运行:第二种可以自己下载源码,自己编译.这里推荐第一种. 安装包:http://slproweb.com/products/ ...

  9. (8) openssl rsautl(签名/验证签名/加解密文件)和openssl pkeyutl(文件的非对称加密)

    rsautl是rsa的工具,相当于rsa.dgst的部分功能集合,可用于生成数字签名.验证数字签名.加密和解密文件. pkeyutl是非对称加密的通用工具,大体上和rsautl的用法差不多,所以此处只 ...

随机推荐

  1. ARM寄存器介绍

    ARM处理器共有37个寄存器.其中包括:31个通用寄存器,包括程序计数器(PC)在内.这些寄存器都是32位寄存器.以及6个32位状态寄存器.但目前只使用了其中12位.ARM处理器共有7种不同的处理器模 ...

  2. mysql 常用的命令集合

    1.创建表 CREATE TABLE `cardPcitrue`( `id` INT AUTO_INCREMENT NOT NULL PRIMARY KEY COMMENT'编号', `cId` IN ...

  3. [Android] Android ViewPager 中加载 Fragment的两种方式 方式(二)

    接上文: https://www.cnblogs.com/wukong1688/p/10693338.html Android ViewPager 中加载 Fragmenet的两种方式 方式(一) 二 ...

  4. 细说REST API安全之认证授权

    认证授权包含2个方面:(1)访问某个资源时必须携带用户身份信息,如:用户登录时返回用户access_token,访问资源时携带该参数.(2)检查用户是否具备访问当前资源(url或数据)的权限:访问资源 ...

  5. C#中连接MySQL数据

    小结一下MySQL在C#中是如何连接的,并做一些简单的选择(SELECT).插入( INSERT).更新( UPDATE).删除(DELETE ) (一)连接 a) Firstly, you shou ...

  6. jquery 控制 video 视频播放和暂停

    $('video').trigger('play'); $('video').trigger('pause'); 参考:https://blog.csdn.net/arvin0/article/det ...

  7. SQL Server进阶 窗口函数

    概述  设计窗口函数目的? 在开窗函数出现之前存在着很多用 SQL 语句很难解决的问题,很多都要通过复杂的相关子查询或者存储过程来完成. 为了解决这些问题,在 2003 年 ISO SQL 标准加入了 ...

  8. Mark Text - 下一代所见即所得的Markdown编辑器

    Mark Text 所输及所见,摒弃了众多 markdown 编辑器左边写作右边预览的写作方式,巧妙的将编辑和预览融为一体.snabbdom 作为 Mark Text 的渲染引擎,保证了极速渲染编辑页 ...

  9. 牛客 被3整除的子序列dp

    题意很清楚,直接dp即可,dp[i][j]表示到第i个字符的状态为j的方案数,这里状态指的是子序列最大下标到第i直接dp即可,dp[i][j]表示到第i个字符的状态为j的方案数,这里状态指的是子序列最 ...

  10. D - Stone Division HackerRank - stone-division (博弈+搜索)

    题目链接:https://cn.vjudge.net/problem/HackerRank-stone-division 题目大意:给你n,m,然后是m个数.每一次你可以选择一个a[i],如果能被n整 ...