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) );
  }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2020-06-22

eclipse实现Schnorr数字签名

Schnorr数字签名,供大家参考,具体内容如下 一.实验目的 学习Schnorr算法在数字签名方面的使用,掌握公钥签名中最基础的签名算法-Schnorr数字签名算法的编写. 二.实验要求 1. 熟悉Schnorr算法的描述,已经其使用场景. 2. 熟悉Schnorr数字签名算法. 3. 掌握如何使用java语言,实现Schnorr签名算法. 三.开发环境/p> JDK1.8,eclipse. 四.实验原理 数字签名是指消息发送方利用特定参数产生的一段消息码,该消息码可以用来标识消息发送者真实身

Java实现的数字签名算法RSA完整示例

本文实例讲述了Java实现的数字签名算法RSA.分享给大家供大家参考,具体如下: 一 背景介绍 数字签名:带有密钥(公钥.私钥)的消息摘要算法. 验证数据完整性.认证数据来源.抗否认. 私钥签名.公钥验证. 常用算法:RSA.DSA.ECDSA 二 RSA介绍 包括MD和SHA两类 三 Java代码实现 package com.imooc.security.rsa2; import java.security.KeyFactory; import java.security.KeyPair; i

常用数字签名算法RSA与DSA的Java程序内实现示例

RSA加密算法 我们来回顾一下RSA的加密算法.我们从公钥加密算法和签名算法的定义出发,用比较规范的语言来描述这一算法. RSA公钥加密体制包含如下3个算法:KeyGen(密钥生成算法),Encrypt(加密算法)以及Decrypt(解密算法). 密钥生成算法以安全常数作为输入,输出一个公钥PK,和一个私钥SK.安全常数用于确定这个加密算法的安全性有多高,一般以加密算法使用的质数p的大小有关.越大,质数p一般越大,保证体制有更高的安全性.在RSA中,密钥生成算法如下:算法首先随机产生两个不同大质

eclipse实现ElGamal数字签名

ElGamal数字签名,供大家参考,具体内容如下 一.实验目的 学习ElGamal算法在数字签名方面的使用,掌握教科书版本的ElGamal数字签名算法的编写,掌握ElGamal加密算法和ElGamal数字签名算法的异同. 二.实验要求 1.熟悉ElGamal数字签名算法. 2.掌握如何使用Java BigInteger类,简单实现教科书式的ElGamal公私钥签名算法. 3.了解ElGamal加密算法和ElGamal数字签名算法的异同. 三.开发环境 JDK 1.7,Java开发环境(本实验采用

Java数字签名算法DSA实例详解

本文实例讲述了Java数字签名算法DSA.分享给大家供大家参考,具体如下: 一.介绍 DSS:Digital Signature Standard 数字签名标准 DSA:Digital Signature Algorithm 数字签名算法 DSA仅包含数字签名 二.参数说明 三.代码实现 package com.imooc.security.dsa; import java.security.KeyFactory; import java.security.KeyPair; import jav

Java PDF 添加数字签名的实现方法

经过数字签名的文档,能够使作者之外的人无法对其进行修改.因此,在PDF文档中添加数字签名可以保证其安全性和真实性.同时根据添加内容的差异性,数字签名可分为文本数字签名.图片数字签名.图片及文本数字签名.本文将通过Spire.PDF for Java来演示如何在PDF文档中添加数字签名. 使用工具:Spire.PDF for Java 2.11.4 Jar文件获取及导入: 方法1:通过官网下载获取Jar包.下载后,解压文件,并将lib文件夹下的Spire.Pdf.jar文件导入Java程序.(如下

浅析java消息摘要与数字签名

消息摘要 算法简述 定义 它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生.如果消息在途中改变了,则接收者通过对收到消息的新产生的摘要与原摘要比较,就可知道消息是否被改变了.因此消息摘要保证了消息的完整性.消息摘要采用单向Hash 函数将需加密的明文"摘要"成一串密文,这一串密文亦称为数字指纹(Finger Print).它有固定的长度,且不同的明文摘要成密文,其结果总是不同的,而同样的明文其摘要必定一致.这样这串摘要便可成为验证明文是否是

使用数字签名实现数据库记录防篡改(Java实现)

本文大纲 一.提出问题 二.数字签名 三.实现步骤 四.参考代码 五.后记 六.参考资料 一.提出问题 最近在做一个项目,需要对一个现成的产品的数据库进行操作,增加额外的功能.为此,需要对该产品对数据库有什么操作进行研究(至于怎么监控一个产品的操作会引发什么数据库操作,以后会详细解说).本来已经对数据库的操作了如指掌的,无意中发现数据库表里的每条记录都会有这样一个字段: 这感觉不妙了,字段名叫signature,顾名思义,就是签名的意思呀.难道数据库表中的每条记录都会有签名?也就是说如果我不能正

Java加密解密和数字签名完整代码示例

常见的加密算法 基本的单向加密算法: BASE64严格地说,属于编码格式,而非加密算法 MD5(MessageDigestalgorithm5,信息摘要算法) SHA(SecureHashAlgorithm,安全散列算法) HMAC(HashMessageAuthenticationCode,散列消息鉴别码) 复杂的对称加密(DES.PBE).非对称加密算法: DES(DataEncryptionStandard,数据加密算法) PBE(Password-basedencryption,基于密码

详解Java数字签名提供XML安全

用Java数字签名提供XML安全 众所周知,XML在产品和项目开发中起着非常重要的作用.通过XML文档可以获取很多信息,还可以使用XML文件进行CRUD(增加.查询.更新和 删除)操作.然而值得注意的是,我们如何确保XML中的数据是来自经过认证的可信和可靠的来源.关于XML文件数据的可靠性和真实性存在很多问题.通常的 情况是,开发者直接处理XML文件而不去考虑数据的可靠性.有一些情况提出了上面的所有问题.现实生活中,每当我们从邮局收到一封信件时我们如何确定这封 信是来自我们的朋友?依据可能是他/

详解Java注解的实现与使用方法

详解Java注解的实现与使用方法 Java注解是java5版本发布的,其作用就是节省配置文件,增强代码可读性.在如今各种框架及开发中非常常见,特此说明一下. 如何创建一个注解 每一个自定义的注解都由四个元注解组成,这四个元注解由java本身提供: @Target(ElementType.**) 这是一个枚举,它置顶是该自定义的注解使用的地方,像类.变量.方法等 @Retention(RetentionPolicy.**)作用是标明注解保存在什么级别,像在编译时.class文件中,vm运行中 @D

详解Java编写并运行spark应用程序的方法

我们首先提出这样一个简单的需求: 现在要分析某网站的访问日志信息,统计来自不同IP的用户访问的次数,从而通过Geo信息来获得来访用户所在国家地区分布状况.这里我拿我网站的日志记录行示例,如下所示: 121.205.198.92 - - [21/Feb/2014:00:00:07 +0800] "GET /archives/417.html HTTP/1.1" 200 11465 "http://shiyanjun.cn/archives/417.html/" &qu

详解Java线程池和Executor原理的分析

详解Java线程池和Executor原理的分析 线程池作用与基本知识 在开始之前,我们先来讨论下"线程池"这个概念."线程池",顾名思义就是一个线程缓存.它是一个或者多个线程的集合,用户可以把需要执行的任务简单地扔给线程池,而不用过多的纠结与执行的细节.那么线程池有哪些作用?或者说与直接用Thread相比,有什么优势?我简单总结了以下几点: 减小线程创建和销毁带来的消耗 对于Java Thread的实现,我在前面的一篇blog中进行了分析.Java Thread与内

详解Java中HashSet和TreeSet的区别

详解Java中HashSet和TreeSet的区别 1. HashSet HashSet有以下特点: 不能保证元素的排列顺序,顺序有可能发生变化 不是同步的 集合元素可以是null,但只能放入一个null 当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据 hashCode值来决定该对象在HashSet中存储位置. 简单的说,HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个

详解Java读取Jar中资源文件及示例代码

详解Java读取Jar中资源文件及实现代码 直接上代码,文章的注释部分说的比较清楚,大家可以参考下, 工具类源代码: ResourceLoadFromJarUtil.java 实现代码: import java.io.IOException; import java.io.InputStream; import java.net.JarURLConnection; import java.net.MalformedURLException; import java.net.URL; import

详解java各种集合的线程安全

线程安全 首先要明白线程的工作原理,jvm有一个main memory,而每个线程有自己的working memory,一个线程对一个variable进行操作时,都要在自己的working memory里面建立一个copy,操作完之后再写入main memory.多个线程同时操作同一个variable,就可能会出现不可预知的结果.根据上面的解释,很容易想出相应的scenario. 而用synchronized的关键是建立一个monitor,这个monitor可以是要修改的variable也可以其

详解Java动态代理的实现及应用

详解Java动态代理的实现及应用 Java动态代理其实写日常业务代码是不常用的,但在框架层一起RPC框架的客户端是非常常见及重要的.spring的核心思想aop的底层原理实现就使用到了java的动态代理技术. 使用代理可以实现对象的远程调用以及aop的实现. java的动态代理的实现,主要依赖InvoctionHandler(接口)和Proxy(类)这两个. 下面是一个例子 实现的代理的一般需要有个接口 package com.yasin.ProxyLearn; public interface

详解Java中Checked Exception与Runtime Exception 的区别

详解Java中Checked Exception与Runtime Exception 的区别 Java里有个很重要的特色是Exception ,也就是说允许程序产生例外状况.而在学Java 的时候,我们也只知道Exception 的写法,却未必真能了解不同种类的Exception 的区别. 首先,您应该知道的是Java 提供了两种Exception 的模式,一种是执行的时候所产生的Exception (Runtime Exception),另外一种则是受控制的Exception (Checked

详解java JDK 动态代理类分析(java.lang.reflect.Proxy)

详解java JDK 动态代理类分析(java.lang.reflect.Proxy) /** * JDK 动态代理类分析(java.lang.reflect.Proxy使用) * * @author 张明学 * */ public class ProxyStudy { @SuppressWarnings("unchecked") public static void main(String[] args) throws Exception { // 动态代理类:通用指定类加载器,和接