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. springboot单元测试 注入失败 空指针

    今天写代码,在test的类中@Autowired注入要测试的@Component类,但发现一运行就会报空指针异常java.lang.NullPointException,但发现使用new的方法的时候可 ...

  2. python之所以强大很大一部分原因在于他众多的取之不尽的库

    GUI 的 自动任务用这个pyautogui库,web 页面的用 selenium + webdriver 同类型的还有 sikuli ,低配版 按键精灵 本教程译自大神Al Sweigart的PyA ...

  3. dubbo的具体使用

    dubbo的具体使用: dubbo简介: 1.1.    什么是dubbo 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,急需一个治理 ...

  4. centos6.8离线安装nginx

    rpm可从官网下载镜像解压获得,推荐从http://mirrors.aliyun.com/centos/7/os/x86_64/Packages/下载 安装gcc rpm -ivh mpfr-2.4. ...

  5. 常用SQL语句大全总结

    出处:http://www.cnblogs.com/0351jiazhuang/p/4530366.html SQL是(Structured Query Language)结构化查询语言的简称,下面赵 ...

  6. Spring 快速开始 配置Spring Framework

    [配置Spring Framework] 1.XML配置依赖关系 bean是由Springframework管理,我们自己编写bean,Spring也内建了bean,比如ApplicationCont ...

  7. tensorflow---alexnet training (tflearn)

    # 输入数据 import input_data mnist = input_data.read_data_sets("/tmp/data/", one_hot=True) imp ...

  8. python中时间的转换和使用datetime

    模块 一个完整大型的python程序是由模块和包的形式组织起来的,可见模块在python中的重要性.模块是一种组织型式,它许多有关联(关系)的代码组织放到单独的独立文件中.简单的说,可以把模块理解为一 ...

  9. 缓存设计(cache-design)

    分布式缓存设计 目前常见的缓存方案都是分层缓存,通常可以分为以下几层: 1.1NG本地缓存,命中的话直接返回 1.2 NG没有命中时则需要查询分布式缓存,如redis 1.3 如果分布式缓存没有命中则 ...

  10. 《Javascript高级程序设计》第六章笔记整理

    一.创建对象的方法(6种) 1.工厂模式 即用函数来封装以特定接口创建对象的细节. function createPerson(name,age,job){ var o = new Object(); ...