1、准备步骤

1)取大素数 p 和 g(g < p,g 最好是 p 的素根)

注解:若 a 是素数 p 的一个素根,则 a mod p, a^2 mod p , …, a^p-1 mod p 是 1 到 p - 1 的排列

2)随机选取一整数 x (1 <= x <= (p - 2),(p,g,x) 是私钥)

3)计算 y = g^x (mod p) ( (p,g,y) 是公钥)

2、加密过程

1)随机选取一整数 k (1 <= k <= (p - 2) 且 k 与 (p - 1) 互素)

2)计算 a = g^k mod p,b = m*y^k mod p(m 为要加密的明文)

3)密文 C = (a, b)

3、解密过程

1)m = b * a^(-x) mod p

注解:ba^(-x) mod p Ξ m * y^k * g^(-xk) Ξ m * g^(xk) * g^(-xk) Ξ m

加密及解密的实现:

1 importjava.util.ArrayList;2

3 public classMain {4 static ArrayList suArr = new ArrayList<>();5 public static voidmain(String[] args) {6 int max = 8096, p, g, x, y, k, a, b;7 doublebuff;8 char[] m = "ABC".toCharArray(); //加密字符串"ABC"

9 ArrayList C = new ArrayList<>(); //存取加密后的密文

10 intsize1;11 suArr.add(2);12

13 //随机取一个小于2048的素数g

14 for (int i = 3; i <= 2048; i++) {15 if(isSuShu(i)) suArr.add(i);16 }17 size1 =suArr.size();18 g =getRanNum(size1);19

20 //随机取一个大素数p

21 for (int i = 2049; i <= max; i++) {22 if(isSuShu(i)) suArr.add(i);23 }24 p = getRanNum(suArr.size() -size1, size1);25

26 //x是1~(p-2)中的一个数

27 x = (int)(Math.random() * (p-2) + 1);28 //k是1~(p-2)中的一个数且k与p-1互素

29 k = (int)(Math.random() * (p-2) + 1);30 while (isHuZhi(k, p-1) != 1) {31 k = (int)(Math.random() * (p-2));32 }33

34 //y = g^x mod p

35 y =myPow(g, x, p);36

37 //a = g^k mod p

38 a =myPow(g, k, p);39 C.add(a);40

41 //加密过程,即计算b = m*y^k mod p (m是明文)

42 for (charc : m) {43 C.add((int)c*myPow(y, k, p));44 }45

46 buff =myPow(a, x, p);47 //将解密后的明文输出

48 for (int i = 1; i < C.size(); i++) {49 System.out.print((char)(C.get(i) * (1/buff)));50 }51

52 }53

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

55 public static boolean isSuShu(intnum) {56 int max = (int) Math.sqrt(num);57 for (int i = 2; i <= max; i++) {58 if (num % i == 0)59 return false;60 }61 return true;62 }63

64 //在素数数组中随机取一个数

65 public static int getRanNum(intsize) {66 return suArr.get((int) (Math.random() *(size)));67 }68

69 //在素数数组中的(left, arr.size())之间随机取一个数

70 public static int getRanNum(int size, intleft) {71 return suArr.get((int) (Math.random() * (size)) +left);72 }73

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

75 public static int isHuZhi(int a, intb) {76 return b == 0 ? a : isHuZhi(b, a %b);77 }78

79 public static int myPow(int a, int b, intm) {80 int res = 1;81 a %=m;82 while (b != 0) {83 if ((b & 1) == 1)84 res = (res * a) %m;85 a = (a * a) %m;86 b >>= 1;87 }88 returnres;89 }90

91 public static int getSuGen(intp) {92 booleanisSuGen;93 for (intg : suArr) {94 isSuGen = true;95 for (int i = 1; i < p; i++) {96 if (myPow(g, i, p) != i) isSuGen = false;97 }98 if (isSuGen) returng;99 }100 return 2; //如果在素数数组中找不到p的素根,则返回一个默认值

101 }102 }103

104 /*

105 * 参考:106 * 素根的定义:a是素数p 的一个素根,如果a mod p, a^2 mod p , …, a^p-1 mod p 是1到p-1的排列,称a是P的一个素根107 * 加密时x和k的选取:https://blog.csdn.net/qq_34490018/article/details/79758620

108 */

原文:https://www.cnblogs.com/GjqDream/p/11543367.html

elgamal java_ElGamal算法的基本原理及实现相关推荐

  1. EEMD算法的基本原理

    目录 EMD算法存在的不足 EEMD算法简介 EEMD算法的基本原理 EMD算法存在的不足 EMD算法能将原始信号不断进行分解,获取符合一定条件下的IMF分量.这些 IMF 分量之间的频率往往不同,这 ...

  2. moead算法流程步骤_数据聚类(一)常见聚类算法的基本原理[图解]

    文章整理了五种常见聚类算法的基本原理,通过简易图解的形式对算法原理进行形象化的描述,同时给出了算法的实现流程和数学表达.全文约4192字. 相关名词的英文翻译 监督学习Supervised Learn ...

  3. 语音识别中的CTC算法的基本原理解释

    原标题:语音识别中的CTC算法的基本原理解释 目前主流的语音识别都大致分为特征提取,声学模型,语音模型几个部分.目前结合神经网络的端到端的声学模型训练方法主要CTC和基于Attention两种. 本文 ...

  4. opencv中人脸识别算法的基本原理

    opencv中人脸识别算法的基本原理(一) 使用opencv中自带的三种人脸识别算法进行实验后,特意去了解学习了一下其基本原理,在这里记录下. opencv人脸识别 关于如何使用opencv实现人脸识 ...

  5. TextRank算法的基本原理及textrank4zh使用实例

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/wotui1842/article/de ...

  6. ElGamal公钥密码算法及ElGamal数字签名方案实现

    ElGamal公钥密码算法是在密码协议中有着重要应用的一类公钥密码算法,其安全性是基于有限域上离散对数学问题的难解性.它至今仍是一个安全性良好的公钥密码算法.它既可用于加密又可用于数字签名的公钥密码体 ...

  7. 量化交易中VWAP/TWAP算法的基本原理和简单源码实现(C++和python)(转)

    量化交易中VWAP/TWAP算法的基本原理和简单源码实现(C++和python) 原文地址:http://blog.csdn.net/u012234115/article/details/728300 ...

  8. 什么是DES算法,详解DES算法的基本原理

    DES算法是应用最为广泛的对称加密算法.它主要应用在计算机网络通信.电子资金传送系统.保护用户文件,此外,DES还可用于计算机用户识别系统中.那么,具体什么是DES算法,DES算法的基本原理是什么,本 ...

  9. elgamal签名java_ElGamal算法的数字签名

    1.准备步骤 1)随机选取大素数 p 和 g 2)随机选取整数 x,x∈[1, p-2],计算 y=g^x(mod p). 3)设 m∈Z 是待签名的消息,秘密随机选取一个整数 k,k∈[1, p-2 ...

最新文章

  1. This Gradle plugin requires Studio 3.0 minimum
  2. 实现主成分分析和白化
  3. CSDN登录机制分析(附上python、java代码)
  4. powerdesigner连接db2生成模型步骤
  5. Roguelike游戏的视野算法
  6. lavarel php区别,laravel中{{}}和{!! !!}的区别详解
  7. android 使用动态的svg资源,在Android中使用SVG作为资源 – victor
  8. css 盒模型 0302
  9. php成品网站安装,PHPweb成品网站安装环境要求和安装方法
  10. python 把txt变成字符串_如何通过 Python 如何写文件 ?
  11. 新手村之BOSS战-入门综合练习2
  12. 兰州交通大学计算机科学与技术专业排名,专业排行
  13. RTL8211E应用(二)之信号输入、输出接口
  14. 微型计算机原理王忠民PPT,微型计算机原理4 王忠民著.ppt
  15. adminlte java_AdminLTE的使用
  16. android模拟器串口,android模拟器上模拟串口通信
  17. 《权力的游戏》里,是谁活成了史诗?
  18. 关闭eslint语法检查
  19. 2021年美亚杯个人赛复盘
  20. 9*9的数独(dfs)

热门文章

  1. Java数组可变长参数详解
  2. 【剑灵攻略】001、底部菜单栏实现
  3. 学习绘制专题地图的收获与心得
  4. 运行引擎需要d3d11兼容GPU,如何解决
  5. 医疗信息化的第二春天是什么
  6. atom编辑器Linux中文版,linux atom 怎么支持中文 Linux下Atom编辑器不支持中文解决方法...
  7. 未来计算机具备什么功能,未来计算机将具备情感 能陪人类聊天
  8. 如何实现python中的strcmp函数
  9. python遗传算法VRP硬时间窗(毕设纪念)
  10. opencv读取avi视频解码问题