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. Web API中的路由(一)——约定路由

    一.Web API中的路由概念 路由的作用用一句话说明:通过request的uri找到处理该请求的Controller,Action,以及给Action的参数赋值. 一些路由的基本概念: route: ...

  2. linux下使用sftp【转】

    . 本文完全引用自: http://www.cnblogs.com/kaituorensheng/p/5797753.html 何为sftp sftp是Secure File Transfer Pro ...

  3. Nginx 学习笔记(九)申请Let's Encrypt通配符HTTPS证书

    Let's Encrypt 宣布 ACME v2 正式支持通配符证书,并将继续清除 Web 上采用 HTTPS 的障碍,让每个网站轻松获取管理证书.消息一出,马上就有热心用户分享出了 Let's En ...

  4. Jsp的四大作用域与九大对象

    内置对象特点: 1. 由JSP规范提供,不用编写者实例化. 2. 通过Web容器实现和管理 3. 所有JSP页面均可使用 4. 只有在脚本元素的表达式或代码段中才可使用(<%=使用内置对象%&g ...

  5. ****** 四十二 ******、软设笔记【网络基础】-IPv6协议、常用的网络协议

    一.IPv6协议 IPv6协议,全称"互联网协议第6版",即下一代的网际协议. 相对于IPv4来说,IPv6协议主要改进: *扩展的地址.IPv6地址长度为128位. *IPv6使 ...

  6. redis整合Spring集群搭建及业务中的使用

    1.redis安装 Redis是c语言开发的. 安装redis需要c语言的编译环境.如果没有gcc需要在线安装.yum install gcc-c++ 安装步骤: 第一步:redis的源码包上传到li ...

  7. 10个免费的javascript富文本编辑器(jQuery and non-jQuery)

    祝愿园子里的朋友圣诞节快乐. 本文介绍了10个免费易用富文本编辑器(rich text editors,RTE),其中5个是Jquery插件,另外5个是非Jquery富文本编辑器 简介 Javascr ...

  8. firefox 播放h5爱奇艺视频

    先安装 violentmonkey 扩展(https://addons.mozilla.org/zh-CN/firefox/addon/violentmonkey/), 在安装这个脚本 https:/ ...

  9. Tomcat清理日志文件无法立即释放磁盘空间

    1 自己删除了Tomcat的日志文件,但是依然显示磁盘百分百占用 进入Tomcat目录显示日志已经删除 查询磁盘空间依旧百分百占用 2 自己杀死Tomcat进程然后重启,成功释放空间 3 原因,通过网 ...

  10. 页面跳转、底部tabs切换页面

    1.页面跳转 import { NavController } from 'ionic-angular'; constructor(public navCtrl: NavController) { } ...