DSA签名算法笔记

注意:只是个人理解,可能有不正确的地方

DSA(Digital Signature Algorithm)签名算法是由美国国家标准与技术研究院(NIST, National Institute of Standards and Technology)提出的一个关于数字签名的美国联邦信息处理标准(FIPS, Federal Information Processing Standard)。该标准在1991年8月提出,1993以FIPS 186被采用,作为数字签名(DSS, Digital Signature Standard)的一部分。

DSA受5,231,668号美国专利(U.S. Patent 5,231,668)保护,该专利在1991年7月提交,发明人为David W. Kravitz,当时为美国国安局(NSA, National Security Agency)雇员。专利受让人为由美国商务部书记处(United States Secretary of Commerce is head of United States Department of Commerce)为其代表的美国政府。后来美国国家标准与技术研究院免除了该专利授权费,向全世界提供。

专利原文:https://www.google.com/patents/US5231668

DSA算法是ElGamal算法的一个变种。ElGamal算法参见:http://my.oschina.net/u/1382972/blog/330630

公钥、私钥生成:

分为两部分,首先约定算法的一些参数,然后为各个用户生成公私钥。

算法参数:

1、选定一个哈希函数H,最初为SHA-1,现在SHA-2也可以使用。函数输出有可能需要截短到密钥对的长度。

2、选定密钥的长度L、N。密钥长度决定了加密可靠度。最近的标准FIPS 186-3指定长度应该为:(1024,160), (2048,224), (2048,256), and (3072,256)

3、选取N位长度的一个质数q。N长度必须小于或等于哈希函数H输出长度。

4、选取L位长度的一个质数p,并满足(p-1)%q=0。

5、选取一个整数g,g是满足等式q^g%p=1的最小整数。g可以用公式g = h^((p–1)/q)%p得到,h为任意整数,只要1 < h < p?1,h通常选为2,但如果g的结果为1时,需要再选一个其它数。

(p, q, g)构成公用的算法参数。

公、私钥生成:

1、选取任意整数x, 0 < x < q

2、计算 y = g^x%p

3、公钥为(p, q, g, y),私钥为x

生成签名:

1、生成随机数k,0 < k < q

2、计算r = g^k%p%q,如果r=0,重新选取k

3、计算s=(H(m)-x*r)*(k^(-1))%q,H为哈希函数,m为待签名数据,如果s=0,重新选取k

4、(r, s)构成签名

验证签名:

1、验证:0<r<q,0<s<q

2、计算w = (s^(-1))%q

3、计算u1 = H(m)*w%q

4、计算u2 = r*w%q

5、计算v = (((g^u1)*(y^u2))%p)%q

6、如果v=r则签名有效。

随机数k的选取很重要,如果不够随机,或者即使其中几位为泄露,也足够使DSA被攻破。

2010年索尼公司为其游戏主机PS3签发软件使用的ECDSA签名的私钥被破解。原因就是没有为每个签名使用不同的随机数k。ECDSA是结合椭圆曲线(EC, Elliptic curve)特定和DSA算法的一种签名算法。

RFC 6979文件描述了一种使用私钥x和H(m)计算得出k的方法,来避免上述问题,使每个签名的k不相同,且无法被破解者估计出。

参考:

DSA算法: http://en.wikipedia.org/wiki/Digital_Signature_Algorithm

时间: 2024-10-18 18:12:49

DSA签名算法笔记的相关文章

ElGamal加密、签名算法笔记

ElGamal加密算法是一种非对称加密算法,基于Diffie-Hellman密钥交换算法,由Taher Elgamal在1985年提出. ElGamal加密算法可以应用在任意一个循环群(cyclic group)上.在群中有的运算求解很困难,这些运算通常与求解离散对数(Discrete logarithm)相关,求解的困难程度决定了算法的安全性. 群(Group)的定义: 群是数学中的概念. 一些元素组成的集合,如果元素满足以下条件,则把这些元素组成的集合叫做群: 在元素上可以定义一个2元运算,

DSA——链表笔记【删除(3个),添加(2个),查找】【循环链表-画个图就明确了】

几个容易忽视的点儿,这里记一下 删除结点中,删除特定元素值结点及删除尾结点 都需要通过循环找到!注意!没有循环体,找到即可!! 一.删掉info=el的结点[注意链表为空!和只有一个结点!!]   public void delete(int el) { LinkedNode prev=null,temp=null; if(isEmpty()) return;//第一步就是判断是不是空链表 if(head==tail&&head.info==el)//如果只有一个结点,且 结点元素等于el

DSA——二叉树笔记

几个总忘的点儿: 结点的深度:一个结点向上移动到其父节点--是一步,再移动到父结点的父结点--是两步,移动到了根结点--结点的深度 树的深度:所有叶子结点的最大深度 数组存储完全二叉树:某个Node在数组中的位置为[i],其父结点则是在[(i-1)/2],其两个孩子则是[2i+1],[2i+2] 树的遍历:前中后广 前序遍历-递归[根左右] protected void preOder(BinTreeNode root) { if(root!=null) visit();//① preOrder

Java 11 新特性介绍

Java 11 已于 2018 年 9 月 25 日正式发布,之前在Java 10 新特性介绍中介绍过,为了加快的版本迭代.跟进社区反馈,Java 的版本发布周期调整为每六个月一次——即每半年发布一个大版本,每个季度发布一个中间特性版本,并且做出不会跳票的承诺.通过这样的方式,Java 开发团队能够将一些重要特性尽早的合并到 Java Release 版本中,以便快速得到开发者的反馈,避免出现类似 Java 9 发布时的两次延期的情况. 按照官方介绍,新的版本发布周期将会严格按照时间节点,于每年

数字签名算法--2.DSA

package Imooc; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.PublicKey; import java.security.

android之cmd手工反编译笔记

Android反编译教程 --西北狼 前端时间有人让帮忙修改apk包名,然后我就翻出以前的翻编译工具来,可以的是,一个小小的APK,居然反编译失败~~~ 然后找了些文章看了下,最后自己重新装工具用cmd命令行手工反编译成功,修改部分东西后重新打包成功,签名成功,安装成功~~~~ 先把经验总结一下: 手工反编译比 网上的集成好的工具成功率要高很多(android 逆向助手 v2.0 这个工具的成功率也比较高,里面有很多功能,有兴趣可以试试),so更加推荐使用酱紫的方式~~自己也好了解了解相关知识~

加密算法笔记

加密算法:MD5.SHA,DES,AES,IDEA,RSA.BlowFish 一:单向散列算法 单向散列算法:1.也就是Hash算法,将任意长度的消息队列压缩成某一固定长度的函数, 2.过程不可逆,只是单向过程, 3.包括MD5,SHA,N-Hash, MD5:消息摘要算法,对输入任意长度的消息进行运算,产生一个128位的消息摘要. SHA:安全散列算法,SHA-1,SHA-256,SHA-384,SHA-512 二:对称加密算法 1.加密秘钥和解密秘钥完全相同 2.加密安全性依赖于秘钥的秘密性

SSHH 免密码验证生产环境分发、管理、备份笔记01

SSHH 免密码验证生产环境分发.管理.备份实战应用指南 ssh是secure shell protocol的简写,它通过对联机数据包加密的技术进行数据传递.专门为远程登录会话 和其他网络服务提供安全的协议. ssh本身提供两个服务功能:一个是类似telnet的远程联机使用shell服务,即俗称的ssh; 另外一个是类似FTP服务的sftp-server,可以提供更安全的TFP. 从客户端来看,ssh提供两种级别的安全验证. 第一种级别(基于口令的安全验证) 只要你知道自己的账号和口令,就可以登

Perl语言学习笔记 6 哈希

1.哈希的键是唯一的,值可以重复! 2.访问哈希元素 $hashname{"$key"};#哈希为大括号,数组为方括号,键为字符串 $family_name{"fred"} = "firstd";#给哈希元素赋值 3.哈希键支持任意表达式 $foo = "na"; $family_name{$foo."me"};#获取$family_name{"name"}对应的值 4.访问整个哈希 %