一、实验目的

在掌握了ElGamal和Schorr数字签名算法的基础上,进一步地学习和掌握DSA签名算法。深入地理解该算法是如何降低了签名信息的长度(当其中一个重要参数选为512bit的素数时,ElGamal签名的长度为1024bit,而DSA中通过160bit的素数可以将签名的长度降低为320bit),从而减少了存储空间和传输带宽。

二、实验要求

4.学习DSA数字签名算法。
5.掌握如何使用Java BigInteger类,简单实现最基础的DSA公私钥签名算法。
6.深入地理解DSA签名算法与RSA算法的区别。

三、开发环境

JDK 1.8,Java开发环境
四、实验内容

【1-1】DSA签名算法的实现

  1. 实现系统参数的设置:根据书本上的知识, DSA公私钥生成算法首先选择一个160bit 的素数,接着选择一个长度在512~1024bit的素数,使得能被整除(),最后选择,其中是整数,满足,且。从中随机地选择一个整数作为私钥,计算,用户的公钥为。具体的代码如下:
public void initKeys(){q = new BigInteger(160, 100, new SecureRandom());do {BigInteger t = new BigInteger(512, new SecureRandom());p = t.multiply(q).add(BigInteger.ONE);System.out.println("~");}while(!p.isProbablePrime(100));BigInteger h = _randomInZq();g = h.modPow(p.subtract(BigInteger.ONE).divide(q), p);x = _randomInZq();y = g.modPow(x, p);System.out.println("p : " + p);System.out.println("q : " + q);System.out.println("g : " + g);System.out.println("x : " + x);System.out.println("y : " + y);
}

其中,需要在前面定义、、、、、和设置一个随机函数。代码分别如下:

public class DSASign {public BigInteger p,q,g;public BigInteger x,y;public BigInteger _randomInZq(){BigInteger r= null;do {System.out.print(".");r = new BigInteger(160, new SecureRandom());}while(r.compareTo(q) >=0);System.out.print(".");return r;}
  1. 实现签名算法:DSA签名算法是对待签名的消息进行签名,其计算如下两个分量:

因此,可根据公式,写代码如下:

   public BigInteger[] signature(byte m[]){BigInteger k = _randomInZq();BigInteger sig[] = new BigInteger[2];sig[0] = g.modPow(k, p).mod(q);sig[1] = _hashInZq(m).add(x.multiply(sig[0])).mod(q).multiply(k.modInverse(q)).mod(q);return sig;
}

其中选择的DSA签名算法中规定了Hash函数为SHA-1算法:

public BigInteger __hash(byte m[]) {MessageDigest md;try {md = MessageDigest.getInstance("SHA-1");md.update(m);byte b[] = new byte[17];System.arraycopy(md.digest(), 0, b, 1, 16);return new BigInteger(b);} catch (NoSuchAlgorithmException e) {System.out.println("this cannot happen.");}return null;}

3.实现验证签名算法:当签名接收者在接收到消息和签名信息后,进行如下步骤计算:

实现该验证算法的代码如下:

public boolean verify(byte m[], BigInteger sig[]){BigInteger w = sig[1].modInverse(q);BigInteger u1 = _hashInZq(m).multiply(w).mod(q);BigInteger u2 = sig[0].multiply(w).mod(q);BigInteger v = g.modPow(u1, p).multiply(y.modPow(u2, p)).mod(p).mod(q);System.out.println("v = " + v);System.out.println("r = " + sig[0]);return v.compareTo(sig[0]) == 0;}
4.实现main方法,在main方法中调用算法进行测试:注意,此处需要修改为你的名字和学号。
public static void main(String args[]){DSASign dsa = new DSASign();dsa.initKeys();String message = "My name is xxx, my student number is xxxxxx.";System.out.println(message);BigInteger sig[] = dsa.signature(message.getBytes());System.out.println("DSASignture verifies result:" + dsa.verify(message.getBytes(),sig) );
}

【1-2】完整参考代码。

import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Random;public class DSASign {public BigInteger p,q,g;public BigInteger x,y;public BigInteger _randomInZq(){BigInteger r= null;do {System.out.print(".");r = new BigInteger(160, new SecureRandom());}while(r.compareTo(q) >=0);System.out.print(".");return r;}public BigInteger _hashInZq(byte m[]){MessageDigest md;try {md = MessageDigest.getInstance("SHA-1");md.update(m);byte b[] = new byte[17];System.arraycopy(md.digest(), 0, b, 1, 16);return new BigInteger(b);}catch (NoSuchAlgorithmException e){System.out.print("This cannot happen!");}return null;}public void initKeys(){q = new BigInteger(160, 100, new SecureRandom());do {BigInteger t = new BigInteger(512, new SecureRandom());p = t.multiply(q).add(BigInteger.ONE);System.out.println("~");}while(!p.isProbablePrime(100));BigInteger h = _randomInZq();g = h.modPow(p.subtract(BigInteger.ONE).divide(q), p);x = _randomInZq();y = g.modPow(x, p);System.out.println("p : " + p);System.out.println("q : " + q);System.out.println("g : " + g);System.out.println("x : " + x);System.out.println("y : " + y);}public BigInteger[] signature(byte m[]){BigInteger k = _randomInZq();BigInteger sig[] = new BigInteger[2];sig[0] = g.modPow(k, p).mod(q);sig[1] = _hashInZq(m).add(x.multiply(sig[0])).mod(q).multiply(k.modInverse(q)).mod(q);return sig;}public boolean verify(byte m[], BigInteger sig[]){BigInteger w = sig[1].modInverse(q);BigInteger u1 = _hashInZq(m).multiply(w).mod(q);BigInteger u2 = sig[0].multiply(w).mod(q);BigInteger v = g.modPow(u1, p).multiply(y.modPow(u2, p)).mod(p).mod(q);System.out.println("v = " + v);System.out.println("r = " + sig[0]);return v.compareTo(sig[0]) == 0;}public static void main(String args[]){DSASign dsa = new DSASign();dsa.initKeys();String message = "My name is xxx, my student number is xxxxxx.";System.out.println(message);BigInteger sig[] = dsa.signature(message.getBytes());System.out.println("DSASignture verifies result:" + dsa.verify(message.getBytes(),sig) );}}

【1-3】算法运行截图

运行要求:运行算法,DSA签名验证结果应该为true。

【1-4】注意事项:

DSA数字签名算法主要依赖于整数有限域离散对数难题,素数必须足够大,且至少包含一个大素数因子以抵抗Pohlig &Hellman算法的攻击。一般都应采用信息的HASH值。DSA加密算法的安全性主要依赖于和,若选取不当则签名容易伪造,应保证对于的大素数因子不可约。其安全性与RSA相比差不多。DSA数字签名算法,它是另一种公开密钥算法,它不能用作加密,只用作数字签名(这就是何RSA的区别)。特别要注意的是,要深入地挖掘算法所隐藏的含义,这对我们理解算法和代码实现极其重要。同时在代码的实现过程中一定要细心地到底是模还是模,这关乎着验证过程的正确性。

DSA数字签名算法及其实现相关推荐

  1. dsa数字签名算法_密码学中的数字签名算法(DSA)

    dsa数字签名算法 Digital Signature Algorithm (DSA) is one of the Federal Information Processing Standard fo ...

  2. dsa数字签名c语言编程,实验三DSA数字签名算法

    <实验三DSA数字签名算法>由会员分享,可在线阅读,更多相关<实验三DSA数字签名算法(8页珍藏版)>请在人人文库网上搜索. 1.实验三 DSA数字签名算法姓 名: 学 号: ...

  3. 【图解DSA数字签名算法】DSA签名算法的Python实现 | 物联网安全 | 信息安全

    系列索引:[图解安全加密算法]加密算法系列索引 Python保姆级实现教程 | 物联网安全 | 信息安全 DSA数字签名算法基于SHA1哈希算法,关于SHA1的实现看另一篇文章. 文章目录 一.什么是 ...

  4. dsa数字签名c语言编程,DSA 数字签名算法

    Digital Signature Algorithm (DSA)是Schnorr和ElGamal签名算法的变种,被美国NIST作为DSS(DigitalSignature Standard). (文 ...

  5. 国际 数字签名算法介绍和区别

    数字签名是一个带有密钥的消息摘要算法,这个密钥包括了公钥和私钥,用于验证数据完整性.认证数据来源和抗否认,遵循OSI参考模型.私钥签名和公钥验证.也是非对称加密算法和消息摘要算法的结合体,常见的数字签 ...

  6. 数字签名算法_DSA

    DSS:数字签名标准 DSA:数字签名算法 DSA和RSA区别: DSA:仅包含数字签名 RSA:既包含数字签名也包含数字加密 DSA签名和RSA签名Java jdk提供的实现代码基本一样,BC提供的 ...

  7. dsa的java实现_Java数字签名算法DSA实例详解

    本文实例讲述了Java数字签名算法DSA.分享给大家供大家参考,具体如下: 一.介绍 DSS:Digital Signature Standard 数字签名标准 DSA:Digital Signatu ...

  8. [以太坊源代码分析] IV. 椭圆曲线密码学和以太坊中的椭圆曲线数字签名算法应用

    数字签名算法在Ethereum中的应用不少,目前已知至少有两处:一是在生成每个交易(Transaction, tx)对象时,对整个tx对象进行数字签名:二是在共识算法的Clique算法实现中,在针对新 ...

  9. .NET Core加解密实战系列之——消息摘要与数字签名算法

    简介 加解密现状,编写此系列文章的背景: 需要考虑系统环境兼容性问题(Linux.Windows) 语言互通问题(如C#.Java等)(加解密本质上没有语言之分,所以原则上不存在互通性问题) 网上资料 ...

最新文章

  1. 张一鸣演讲全文:外部波澜起伏,内心平静如常
  2. python循环语句打印矩形_Python中使用循环语句打印三角形、菱形
  3. ubuntu下超级用户和普通用户
  4. zzuli 2269:minval
  5. Java商品信息查询
  6. 作者:杜克明(1980-),男,中国农业科学院农业环境与可持续发展研究所助理研究员。...
  7. secureCRT下载地址,亲测有效
  8. centos8.0配置静态IP详解
  9. html将英文日期格式转化为中文日期格式,excel中文日期与英文日期的转换
  10. Flash制作大雪纷飞效果动画
  11. 深度揭密SSD中的原片-白片-黑片:莫贪小便宜
  12. mysql 复合索引(联合索引) a b c的使用
  13. python tkinter编写界面,使用win32com操作excel获取数据生成截图后,wxpy登录微信,给租客发送房租(二)
  14. 私有云是伪命题:真正的私有云 ≈ 公有云
  15. 什么是MTD分区和NAND flash?
  16. unity制作图片下拉框
  17. python微信自动发消息_Python使用微信itchat接口实现查看自己微信的信息功能详解...
  18. 一个人窝在摇椅里乘凉 我承认这样真的很安详 和楼下老爷爷一样
  19. Word排版:页眉不能对应每章标题、页脚偶数页消失等问题
  20. input正则邮箱_邮箱的正则表达式验证

热门文章

  1. 征途linux版服务端修改说明,挑战服务端修改技能图文教程
  2. Web从入门到放弃-web的基本介绍(一)
  3. 江西移动10086呼叫中心加大客服权限 提升投诉处理效率
  4. 有一些软件包无法被安装。如果您用的是 unstable 发行版,这也许是因为系统无法达到您要求的状态造成的
  5. 《HeadFirst设计模式》读书笔记-第9章v3-组合迭代器
  6. 太原科技大学2021计算机调剂,2021年太原科技大学机械工程研究生调剂信息
  7. vue.js-脚手架
  8. Node 小游戏服务端2
  9. windows11终端设置字体
  10. STM32之红外遥控信号自学习实现