1、准备步骤

1)随机选取大素数 p 和 g

2)随机选取整数 x,x∈[1, p-2],计算 y=g^x(mod p)。

3)设 m∈Z 是待签名的消息,秘密随机选取一个整数 k,k∈[1, p-2],且 k 与 p-1 互质

2、签名过程

1)计算 r 和 s:

r=g^k(mod p)

s=k^-1(m-rx)(mod p-1)(k^-1 表示 k mod p-1 的逆元)

2)(m, r, s)为对消息 m 的数字签名。

3、验证签名

1)对方收到对消息 m 的数字签名(m, r, s)后,利用签名者的公开密钥(y, g, p)对签名进行以下验证:

(y^r)(r^s) mod p=g^m(mod p)(左式计算时可以使用快速幂取模)

如果上式成立,则接受该签名,否则拒绝该签名。

4、签名过程实现(测试对消息 'A' 进行签名):

importjava.util.ArrayList;public classMain {private static ArrayList suArr = new ArrayList<>();private static int[] xy = new int[2];//定义素数的范围为 8-bit

private static int MAX = 255;public static voidmain(String[] args) {intp, g, x, y, k, r, s;int m = (int)'A';//初始化素数数组

initSuArr();//取一个素数 p

p = suArr.get((int) (Math.random() *(suArr.size())));//g 是 p 的一个本原元

g = 2;//x >= 1 && x <= p-2

x = (int)(Math.random() * (p-2))+1;//y = g^x mod p

y = myPow(g, x, p); //y是公开密钥//k >= 1 && k <= p-2 且 k 与 (p-1) 互质

k = (int)(Math.random() * (p-2))+1;while (isHuZhi(k, p-1) != 1) {

k= (int)(Math.random() * (p-2));

}//r = g^k mod p

r =myPow(g, k, p);//计算k^-1 mod p-1

exGcd(k, (p-1));

k= xy[0];if(k < 0) k += (p-1);//s = k^(-1)*(m-rx)(mod p-1)

s = (k*(m-r*x)) % (p-1); //(m,r,s)为对消息m的数字签名//s可能为负值,所以要将其转化为正数,利用a%b=(a%b+b)%b

if(s < 0) s = (s + p-1) % (p-1);if ((myPow(y, r, p) * myPow(r, s, p))%p ==myPow(g, m, p)) {

System.out.println("接受该签名");

}else{

System.out.println("拒绝该签名");

}

}//判断一个数是否为素数

public static boolean isSuShu(intnum) {int max = (int) Math.sqrt(num);for (int i = 2; i <= max; i++) {if (num % i == 0)return false;

}return true;

}//初始化素数数组

public static voidinitSuArr() {

suArr.add(2);for (int i = 3; i <= MAX; i++) {if(isSuShu(i))

suArr.add(i);

}

}//判断两个数是否互质

public static int isHuZhi(int a, intb) {return b == 0 ? a : isHuZhi(b, a %b);

}public static int myPow(int a, int b, intm) {int res = 1;

a%=m;while (b != 0) {if ((b & 1) == 1)

res= (res * a) %m;

a= (a * a) %m;

b>>= 1;

}returnres;

}//求 a mod b 的逆元

public static void exGcd(int a, intb) {if (b == 0) {

xy[0] = 1;

xy[1] = 0;

}else{

exGcd(b, a%b);int x = xy[0];

xy[0] = xy[1];

xy[1] = x - (a / b) * xy[1];

}

}

}

参考文档:

1)https://blog.csdn.net/qq_34490018/article/details/79758620

elgamal签名java_ElGamal算法的数字签名相关推荐

  1. 【密码学原理】数字签名(ElGamal签名,Schnorr签名,椭圆曲线签名,RSA-PSS签名)

    数字签名是公钥密码学发展过程中最重要的概念之一,产生和使用数字签名过程的一般模型如图所示 消息认证可以保护消息交换双方不受第三方的攻击,但是不能处理通信双方自身发生的攻击.例如对下图中的某种方式进行攻 ...

  2. 现代密码学实验5 数字签名ElGamal签名方案

    赞赏码 & 联系方式 & 个人闲话 [实验名称]数字签名ElGamal签名方案 [实验目的] 1.了解数字签名的过程,包括签名过程和认证过程: 2.掌握ElGamal签名方案. [实验 ...

  3. 数字签名(RSA签名、ElGamal签名、Schnorr签名、DSS、DSA、离散对数签名、特殊性质的签名算法、Chaum盲签名、Chaum-Antwerpen不可否认签名、群签名、MUO代理签名)

    数字签名基本概念 数字签名的必要性: 消息认证能够使通信双方对接收到的信息来源及完整性进行验证,防止第三方的攻击,然而却不能防止通信双方中的一方对另一方的欺诈. 这种欺诈有多种形式,例如通信双方(发送 ...

  4. 数字签名(代码签名)流程和数字签名的验证

    数字签名(代码签名)流程 数字签名(代码签名)流程 Authenticode : 这里翻译为数字认证代码.  code sign : 字面的翻译为代码签名,但是通常的我们称为数字签名,以下的文中均称为 ...

  5. 散列算法和数字签名笔记

    散列算法与数字签名 在RSA加密中,如果A是发送方,B是接受方,则A用B的公钥加密信息,而B可以用自己的私钥解密信息,从而达到保密传输的作用. 但是在数字签名技术中,这个过程恰好是反过来的,即:A是发 ...

  6. python实现签名RSA算法

    ⭐本专栏主要用python实现密码学中的常用经典算法,例如Vigenere.3DES.RSA.ElGamal.Diffie-Hellman.RSA签名.ElGamal签名.HMAC.哈希算法.列移位. ...

  7. 什么是计算机系统的可信基点,基于可信基点的结构化签名比较算法.pdf

    基于可信基点的结构化签名比较算法.pdf 第28卷 第24期 计算机工程与设计 21)07年12月 VO1.28 NO.24 Computer Engineering and Design Dec.2 ...

  8. API接口签名生成算法和签名验证算法

    1.参考网上资料和书本资料,实现了API接口签名生成算法和签名验证算法. (1)参考资料:https://www.jianshu.com/p/d47da77b6419 (2)参考书籍:高级软件架构师教 ...

  9. 某酷ckey签名生成算法系列--(三)ast代码控制流平坦化

    某酷ckey签名生成算法系列--(三)ast代码控制流平坦化 观察三个switch的值分别是Ci.mi和Ai.而这三个值又因为li的确定而确定的.也就是说已知li的值,就可以分别计算出Ci.mi和Ai ...

最新文章

  1. 为什么企业需关心DDoS攻击?—Vecloud微云
  2. 云栖发布|企业级互联网架构全新升级 ,助力数字创新
  3. 先排列再排行 html,三国中猛将的权威排名 颜良为何排列第二
  4. FIFO的verilog代码
  5. 在Java 7或更早版本中使用Java 8 Lambda表达式
  6. mac中apache服务器及虚拟主机配置
  7. Linux查看进程并重启服务命令
  8. 软件定义汽车带来的困境---如何破局?
  9. python自动化开发-[第十四天]-javascript(续)
  10. Java中的ObjectOutputStream –将对象写入文件
  11. Mac 连过的 WiFi 怎么查密码?看这→
  12. oc传参数给js_【一句话攻略】彻底理解JS中的回调(Callback)函数
  13. 数据库系统教程-面试汇总-合集
  14. jeecgboot框架简介
  15. Xmind8 乱码问题解决(查看文件字体并下载安装相应字体)
  16. 实现外网Ping通WSL(网卡桥接方式实现)
  17. 安装 truffle (CentOS7 与 Windows)
  18. 移动应用数据统计平台(之一)
  19. 【社区分享】专注移动端机器学习交流,TensorFlow Lite 中文兴趣小组招募中!
  20. 【单调队列优化】CF319C——Kalila and Dimna in the Logging Industry

热门文章

  1. 微信上的Siri:小i机器人首次接入微信语音API
  2. Docker启动OnlyOffice
  3. Ubuntu ip报错解决方案 ens33: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
  4. sqlilabs—less5
  5. DIYer 教你如何选购键盘
  6. jango报错django.utils.datastructures.MultiValueDictKeyError
  7. FISCO BCOS区块链 修改增加RPC接口
  8. 联想Miix320安装Win10+Ubuntu双系统引导的方法(超简单)
  9. 2007年执业护士考试全真模拟试题 答案
  10. UML-组件图-网上书店