elgamal java_eclipse实现ElGamal数字签名
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数字签名相关推荐
- ElGamal加密算法|ElGamal签名算法|公钥密码|数字签名|密码学|信息安全
ElGamal加密算法 简单介绍 EIGamal密码是除了RSA密码之外最有代表性的公开密钥密码 EIGamal是建立在离散对数的困难问题上的一种公钥体制密码 密钥产生 选一个素数p,以及小于p的两个 ...
- 信息安全——ELGamal数字签名方案的实现
ELGamal数字签名方案的实现 1. 问题描述 为简化问题,我们取p=19,g=2,私钥x=9,则公钥y=29 mod 19=18.消息m的ELGamal签名为(r,s),其中r=gk mod p, ...
- elgamal签名算法c语言,ELGamal数字签名.doc
ELGamal数字签名 摘要 随着网络的发展,人们之间的各种交流变得越来越来方便,但同时也对信息传递的安全提出了新的要求,数字签名随之广泛的深入到了人们的日常生活中. ELGamal作为目前应用比较广 ...
- Elgamal 加密算法
Elgamal 加密算法 1.ElGamal算法简介 2.ElGamal算法原理 3.c语言代码实现 4.测试结果 1.ElGamal算法简介 ElGamal算法是由Tather ElGamal在19 ...
- 非对称加密算法——ELGamal
非对称密钥加密概述 前面讲述了对称密钥加密体制.使用对称密钥加密体制进行保密通信时,任意不同的两个用户之间都应该使用互不相同的密钥.这样,如果一个网络中有n个用户,他们之间彼此都可能进行秘密通信,这时 ...
- ELGamal算法的编程实现
ELGamal算法的编程实现 [实验目的] [实验环境] [实验预备知识点] [实验内容] [实验步骤] [实验思考题] [实验目的] 1.理解非对称密码算法的工作原理 2.了解ELGamal算法的密 ...
- ElGamal体制和Diffie-Hellman问题
ElGamal签名体制 ElGamal密码体制 Diffie-Hellman密钥交换 注意一下本原根的概念
- 密码学之公钥密码体系(3):ElGamal算法
密码学之公钥密码体系(3):ElGamal算法 文章目录 1. ElGamal算法 2. ElGamal算法基本原理 2.1 ElGamal密钥生成 2.2 ElGamal加密过程 2.3 ElGam ...
- 密码学系列之七:数字签名
数字签名 1. 概述 1.1 基本概念 1.2 签名原理 1.2.1 形式化定义 1.2.2 签名过程 2 基于RSA的签名方案 2.1 实现过程 2.2 安全性分析 3 基于离散对数的签名方案 3. ...
最新文章
- Java如何解决mysql读写延迟_java中延迟任务的处理方式
- java 跟踪错误程序_Java异常处理 如何跟踪异常的传播路径
- JAVA中String字符串比较equals()和equalsIgnoreCase()的区别
- TensorFlow2实现协同过滤算法中的矩阵分解(首家基于TS2版本)
- CF1039D-You Are Given a Tree【根号分治,贪心】
- hadoop0.20.0第一个例子
- Web前端笔记-element ui中table中某列添加a便签进行跳转
- Unity新项目如何快速理清顶层代码结构
- Spring MVC中@Controller和@RequestMapping注解详解
- mqtt发布json数据_微服务实战:从架构到发布(一)
- SQL Server 2016 bak文件还原
- CentOs7下Zabbix安装教程——zabbix agent安装和前端配置
- vscode json插件
- 360网上商城:链接生态与终端
- 为了让机器听懂“长篇大论”,阿里工程师构建了新模型
- 2k 幻14_ROG幻14经典版2K屏14寸
- 广义相对论-学习记录3-第二章-狭义相对论2
- 谷歌浏览器访问https请求总是显示不安全提示
- 江苏大专计算机考试,江苏省教育考试院2020年高职(专科)注册入学申请入口...
- 2021年最实用的12款SEO工具