ElGamal数字签名,供大家参考,具体内容如下

一、实验目的

学习ElGamal算法在数字签名方面的使用,掌握教科书版本的ElGamal数字签名算法的编写,掌握ElGamal加密算法和ElGamal数字签名算法的异同。

二、实验要求

1.熟悉ElGamal数字签名算法。

2.掌握如何使用Java BigInteger类,简单实现教科书式的ElGamal公私钥签名算法。

3.了解ElGamal加密算法和ElGamal数字签名算法的异同。

三、开发环境

JDK 1.7,Java开发环境(本实验采用Windows+eclipse作为实验环境),要求参与实验的同学按照对称加密提供的方法,提前安装好JDK。

四、实验内容

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

1.实现公私钥生成算法:根据教材,ElGamal公私钥生成算法首选需要选取一个大素数 ,然后选取 作为其生成元。接着随机选取私钥 ,计算 作为其公钥。因此,可写代码如下:

public void initKeys() {

System.out.println("choose a prime p with securitylevel "

+ securitylevel + " , please wait ...");

p = new BigInteger(securitylevel, 100, new Random());

System.out.println("p : " + p);

g = __randomInZp();

System.out.println("g : " + g);

x = __randomInZp();

System.out.println("x : " + x);

y = g.modPow(x, p);

System.out.println("y : " + y);

}

其中,__randomInZp定义如下函数,实现从 中随机选取一个大整数:

public BigInteger __randomInZp() {

BigInteger r = null;

do {

System.out.print(".");

r = new BigInteger(securitylevel, new SecureRandom());

}while(r.compareTo(p) >= 0);

System.out.println(".");

return r;

}

2.实现签名算法:

ElGamal签名算法需要随机选取 ,同时计算

此时, 即为签名。因此,可根据公式,写代码如下:

public BigInteger[] signature(byte m[]) {

BigInteger sig[] = new BigInteger[2];

BigInteger k = __randomPrimeInZp();

sig[0] = g.modPow(k, p);

sig[1] = __hashInZp(m).subtract(x.multiply(sig[0]))

.mod(p.subtract(BigInteger.ONE))

.multiply(k.modInverse(p.subtract(BigInteger.ONE)))

.mod(p.subtract(BigInteger.ONE));

System.out.println("[r,s] = [" + sig[0] + ", " + sig[1] + "]");

return sig;

}

此处的__randomPrimeInZp意为从 中随机选取一个大素数,实现如下:

public BigInteger __randomPrimeInZp() {

BigInteger r = null;

do {

System.out.print(".");

r = new BigInteger(securitylevel, 100, new SecureRandom());

}while(r.compareTo(p) >= 0);

System.out.println(".");

return r;

}

另有一哈希函数,实现如下:

public BigInteger __hashInZp(byte m[]) {

MessageDigest md;

try {

md = MessageDigest.getInstance("SHA-256");

md.update(m);

byte b[] = new byte[33];

System.arraycopy(md.digest(), 0, b, 1, 32);

return new BigInteger(b);

} catch (NoSuchAlgorithmException e) {

System.out.println("this cannot happen.");

}

return null;

}

3.实现验证算法:ElGamal签名验证算法即判定公式 是否成立。因此,可考虑写代码如下:

public boolean verify(byte m[], BigInteger sig[]) {

BigInteger l = y.modPow(sig[0], p)

.multiply(sig[0].modPow(sig[1], p)).mod(p);

BigInteger r = g.modPow(__hashInZp(m), p);

return l.compareTo(r) == 0;

}

4.实现main方法,在main方法中调用算法进行测试:

public static void main(String args[]) {

ElGamalSignatureInstance instance = new ElGamalSignatureInstance();

instance.initKeys();

byte m[] = "my name is ElGamal, my student number is 201300012345.".getBytes();

BigInteger sig[] = instance.signature(m);

System.out.println("Real signature verify result : " + instance.verify(m, sig));

sig[0] = sig[0].add(BigInteger.ONE);

System.out.println("Faked signature verify result : " + instance.verify(m, 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 ElGamalSignatureInstance {

int securitylevel = 1024;

BigInteger p, g, x, y;

public BigInteger __randomInZp() {

BigInteger r = null;

do {

System.out.print(".");

r = new BigInteger(securitylevel, new SecureRandom());

}while(r.compareTo(p) >= 0);

System.out.println(".");

return r;

}

public BigInteger __randomPrimeInZp() {

BigInteger r = null;

do {

System.out.print(".");

r = new BigInteger(securitylevel, 100, new SecureRandom());

}while(r.compareTo(p) >= 0);

System.out.println(".");

return r;

}

public BigInteger __hashInZp(byte m[]) {

MessageDigest md;

try {

md = MessageDigest.getInstance("SHA-256");

md.update(m);

byte b[] = new byte[33];

System.arraycopy(md.digest(), 0, b, 1, 32);

return new BigInteger(b);

} catch (NoSuchAlgorithmException e) {

System.out.println("this cannot happen.");

}

return null;

}

public void initKeys() {

System.out.println("choose a prime p with securitylevel " + securitylevel + " , please wait ...");

p = new BigInteger(securitylevel, 100, new Random());

System.out.println("p : " + p);

g = __randomInZp();

System.out.println("g : " + g);

x = __randomInZp();

System.out.println("x : " + x);

y = g.modPow(x, p);

System.out.println("y : " + y);

}

public BigInteger[] signature(byte m[]) {

BigInteger sig[] = new BigInteger[2];

BigInteger k = __randomPrimeInZp();

sig[0] = g.modPow(k, p);

sig[1] = __hashInZp(m).subtract(x.multiply(sig[0])).mod(p.subtract(BigInteger.ONE))

.multiply(k.modInverse(p.subtract(BigInteger.ONE))).mod(p.subtract(BigInteger.ONE));

System.out.println("[r,s] = [" + sig[0] + ", " + sig[1] + "]");

return sig;

}

public boolean verify(byte m[], BigInteger sig[]) {

BigInteger l = y.modPow(sig[0], p).multiply(sig[0].modPow(sig[1], p)).mod(p);

BigInteger r = g.modPow(__hashInZp(m), p);

return l.compareTo(r) == 0;

}

public static void main(String args[]) {

ElGamalSignatureInstance instance = new ElGamalSignatureInstance();

instance.initKeys();

byte m[] = "my name is ElGamal, my student number is 201300012345.".getBytes();

BigInteger sig[] = instance.signature(m);

System.out.println("Real signature verify result : " + instance.verify(m, sig));

sig[0] = sig[0].add(BigInteger.ONE);

System.out.println("Faked signature verify result : " + instance.verify(m, sig));

}

}

由于产生随机大素数的方法(即__randomPrimeInZp)的运行速度受到 值和电脑CPU速度的影响,在某些同学的电脑上可能出现选取参数缓慢的问题。此时可将securitylevel的值调低(缺省1024,可调低到512),即可提高速度。但注意调低securitylevel将会导致安全强度下降。

【1-5】扩展内容:ElGamal加密算法和ElGamal签名算法有何异同?

答:

(1)在产生公私钥方面,二者几乎完全一致。

(2)加密/签名步骤,都需要先选取一个随机数 并计算 作为其密文的第一分量(这也是ElGamal的概率输出的原因所在)。不同点在于,加密算法后续采用 的方式产生密文第二分量,而签名算法采用了 作为其第二分量。

(3)解密/验证方面,解密算法采用 恢复明文,而签名验证算法采用公式 来验证签名是否吻合。

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

elgamal java_eclipse实现ElGamal数字签名相关推荐

  1. ElGamal加密算法|ElGamal签名算法|公钥密码|数字签名|密码学|信息安全

    ElGamal加密算法 简单介绍 EIGamal密码是除了RSA密码之外最有代表性的公开密钥密码 EIGamal是建立在离散对数的困难问题上的一种公钥体制密码 密钥产生 选一个素数p,以及小于p的两个 ...

  2. 信息安全——ELGamal数字签名方案的实现

    ELGamal数字签名方案的实现 1. 问题描述 为简化问题,我们取p=19,g=2,私钥x=9,则公钥y=29 mod 19=18.消息m的ELGamal签名为(r,s),其中r=gk mod p, ...

  3. elgamal签名算法c语言,ELGamal数字签名.doc

    ELGamal数字签名 摘要 随着网络的发展,人们之间的各种交流变得越来越来方便,但同时也对信息传递的安全提出了新的要求,数字签名随之广泛的深入到了人们的日常生活中. ELGamal作为目前应用比较广 ...

  4. Elgamal 加密算法

    Elgamal 加密算法 1.ElGamal算法简介 2.ElGamal算法原理 3.c语言代码实现 4.测试结果 1.ElGamal算法简介 ElGamal算法是由Tather ElGamal在19 ...

  5. 非对称加密算法——ELGamal

    非对称密钥加密概述 前面讲述了对称密钥加密体制.使用对称密钥加密体制进行保密通信时,任意不同的两个用户之间都应该使用互不相同的密钥.这样,如果一个网络中有n个用户,他们之间彼此都可能进行秘密通信,这时 ...

  6. ELGamal算法的编程实现

    ELGamal算法的编程实现 [实验目的] [实验环境] [实验预备知识点] [实验内容] [实验步骤] [实验思考题] [实验目的] 1.理解非对称密码算法的工作原理 2.了解ELGamal算法的密 ...

  7. ElGamal体制和Diffie-Hellman问题

    ElGamal签名体制 ElGamal密码体制 Diffie-Hellman密钥交换 注意一下本原根的概念

  8. 密码学之公钥密码体系(3):ElGamal算法

    密码学之公钥密码体系(3):ElGamal算法 文章目录 1. ElGamal算法 2. ElGamal算法基本原理 2.1 ElGamal密钥生成 2.2 ElGamal加密过程 2.3 ElGam ...

  9. 密码学系列之七:数字签名

    数字签名 1. 概述 1.1 基本概念 1.2 签名原理 1.2.1 形式化定义 1.2.2 签名过程 2 基于RSA的签名方案 2.1 实现过程 2.2 安全性分析 3 基于离散对数的签名方案 3. ...

最新文章

  1. Java如何解决mysql读写延迟_java中延迟任务的处理方式
  2. java 跟踪错误程序_Java异常处理 如何跟踪异常的传播路径
  3. JAVA中String字符串比较equals()和equalsIgnoreCase()的区别
  4. TensorFlow2实现协同过滤算法中的矩阵分解(首家基于TS2版本)
  5. CF1039D-You Are Given a Tree【根号分治,贪心】
  6. hadoop0.20.0第一个例子
  7. Web前端笔记-element ui中table中某列添加a便签进行跳转
  8. Unity新项目如何快速理清顶层代码结构
  9. Spring MVC中@Controller和@RequestMapping注解详解
  10. mqtt发布json数据_微服务实战:从架构到发布(一)
  11. SQL Server 2016 bak文件还原
  12. CentOs7下Zabbix安装教程——zabbix agent安装和前端配置
  13. vscode json插件
  14. 360网上商城:链接生态与终端
  15. 为了让机器听懂“长篇大论”,阿里工程师构建了新模型
  16. 2k 幻14_ROG幻14经典版2K屏14寸
  17. 广义相对论-学习记录3-第二章-狭义相对论2
  18. 谷歌浏览器访问https请求总是显示不安全提示
  19. 江苏大专计算机考试,江苏省教育考试院2020年高职(专科)注册入学申请入口...
  20. 2021年最实用的12款SEO工具

热门文章

  1. 晚上可以做点什么长久的小生意,日赚200元至1000元?
  2. 华为鸿蒙系统升级攻略,华为鸿蒙系统2.0怎么升级 鸿蒙系统2.0升级方法
  3. 计算机办公所有的快捷键大全,(办公最实用)电脑键盘快捷键大全.pdf
  4. sshd maxstartup和MaxSessions
  5. 【计算机毕业设计】学生考勤管理
  6. H5自动适配之终极方法(耗费了几个小时的结晶)
  7. idea 的奇葩问题
  8. Java Stream API(一)
  9. 类的概念以及定义方法
  10. html初学者自我介绍,html初学者自我介绍网页(6页)-原创力文档