eclipse实现DSA数字签名
作者:秃头选拔赛形象大使 发布时间:2023-08-24 19:11:37
标签:eclipse,DSA,数字签名
DSA数字签名,供大家参考,具体内容如下
一、实验目的
在掌握了ElGamal和Schorr数字签名算法的基础上,进一步地学习和掌握DSA签名算法。深入地理解该算法是如何降低了签名信息的长度(当其中一个重要参数 选为512bit的素数时,ElGamal签名的长度为1024bit,而DSA中通过160bit的素数 可以将签名的长度降低为320bit),从而减少了存储空间和传输带宽。
二、实验要求
4.学习DSA数字签名算法。
5.掌握如何使用Java BigInteger类,简单实现最基础的DSA公私钥签名算法。
6.深入地理解DSA签名算法与RSA算法的区别。
三、开发环境
JDK 1.7,Java开发环境(本实验采用Windows+eclipse作为实验环境),要求参与实验的同学按照对称加密提供的方法,提前安装好JDK。
四、实验原理
掌握了ElGamal和Schorr数字签名算法的基础上,进一步地学习和掌握DSA签名算法。深入地理解该算法是如何降低了签名信息的长度(当其中一个重要参数 选为512bit的素数时,ElGamal签名的长度为1024bit,而DSA中通过160bit的素数 可以将签名的长度降低为320bit),从而减少了存储空间和传输带宽
代码段:
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 xxxx.";
System.out.println(message);
BigInteger sig[] = dsa.signature(message.getBytes());
System.out.println("DSASignture verifies result:" + dsa.verify(message.getBytes(),sig) );
}
}
来源:https://blog.csdn.net/qq_45056216/article/details/106894361


猜你喜欢
- 本文主要从两个方面对Android Volley框架的使用方法进行讲解,具体内容如下一、网络请求1.get方式请求数据// 1 创建一个请求
- Gstreamer到底是个啥?GStreamer 是一个 基于pipeline的多媒体框架,基于GObject,以C语言写成。应用GStre
- 最近要实现一个功能,就是checkbox跨页多选,在网上看了一下,资料很少,而且大多是不完全的。不过经过我的努力,终于做出来了。
- 一.模拟问题最近在公司遇到一个问题,挂号系统是做的集群,比如启动了两个相同的服务,病人挂号的时候可能会出现同号的情况,比如两个病人挂出来的号
- 1. Easy Rules 概述Easy Rules是一个Java规则引擎,灵感来自一篇名为《Should I use a Rules En
- 一、稀疏数组1、什么是稀疏数组当一个数组中大部分元素为0,或者为同一个值的数组时,可以用稀疏数组来保存该数组。稀疏数组,记录一共有几行几列,
- 今天是圣诞节平安夜,为此特别制作了一个雪花飘落的场景,我们的雪花渲染方式不同于网上流行的使用Camera Filter,需要将脚本挂接到相机
- 在windows环境下,命令行程序为cmd.exe,是一个32位的命令行程序,微软Windows系统基于Windows上的命令解释程序,类似
- 分类自定义Layout可以分为两种情况。自定义ViewGroup,创造出一些不同于LinearLayout,RelativeLayout等之
- C#移除字符串中的不可见Unicode字符 背景最近发现某个数据采集的系统拿下来的数据,有些字段的JSON被莫名截断了,导致后续数
- 先看一下效果图Tinker已知问题由于原理与系统限制,Tinker有以下已知问题:Tinker不支持修改AndroidManifest.xm
- collect通知flow执行public suspend inline fun <T> Flow<T>.colle
- java web返回中文乱码ajax返回中文乱码问题 在浏览器按F12查看数据包可以看到charset为 iso-8859-1,这是spri
- 效果就是这样,RecyclerView列表可拖拽排序,可删除,可添加;RecyclerView给我们提供了一个手势器:ItemTouchHe
- SpringFramework5.0是自2013年12月版本4发布之后SpringFramework的第一个主发行版。SpringFrame
- C#客户端程序,生成后是一个exe,如果带有大量的dll,那么dll和exe会混乱在一起,看起来非常混乱,我们可以建立一个文件夹,把dll放
- 本文实例讲述了Android编程实现仿美团或淘宝的多级分类菜单效果。分享给大家供大家参考,具体如下:这里要实现的是诸如美团/淘宝/百度糯米
- 本文实例为大家分享了Android自定义控件实现时间轴的具体代码,供大家参考,具体内容如下由于项目中有需求,就简单的封装一个,先记录一下,有
- 前言本篇文章将教你作为一个.NET程序员如何快入门Spring Boot。你不需要用Eclipse,也不需要用IDEA。已经习惯了VS,其他
- 在Web开发过程中离不开数据的交互,这就需要规定交互数据的相关格式,以便数据在客户端与服务器之间进行传递。数据的格式通常有2种:1、xml;