ElGamal算法,是一种较为常见的加密算法,它是基于1985年提出的公钥密码体制和椭圆曲线加密体系。既能用于数据加密也能用于数字签名,其安全性依赖于计算有限域上离散对数这一难题。在加密过程中,生成的密文长度是明文的两倍,且每次加密后都会在密文中生成一个随机数K,在密码中主要应用离散对数问题的几个性质:求解离散对数(可能)是困难的,而其逆运算指数运算可以应用平方-乘的方法有效地计算。也就是说,在适当的群G中,指数函数是单向函数。

密钥生成

  1. 随机选择一个大素数p,且要求p-1有大素数因子。再选择一个模p的本原元α。将p和α公开。
  2. sk = d:  随机选择一个整数d作为密钥,2≤d≤p-2 。
  3. pk = (p, α, y):  计算y=α^d mod p,y为公钥。

加密 : 对M加密

  1. 随机地选取整数k,2≤k≤p-2
  2. U=y^k mod p
  3. C1=α^k mod p
  4. C2=UM mod p
  5. 密文为(C1,C2)

解密

  1. V=C1^d
  2. M=C2/V mod p=C2V^-1 mod p

加解密过程实现

import java.math.BigInteger;
import java.util.Random;public class ElGamal {public static void main(String[] args) {}/*y=α^x(mod p),1≤x≤p-1x=logαy,1≤y≤p-1*/public BigInteger p, alpha, y;private BigInteger d;   //private keypublic ElGamal() {do {p = BigInteger.probablePrime(100, new Random());} while (p.subtract(BigInteger.ONE).divide(new BigInteger("2")).isProbablePrime(100));do {alpha = new BigInteger(100, new Random());} while (! isOrigin(alpha, p));do {d = new BigInteger(100, new Random());} while (d.compareTo(BigInteger.ONE) != 1 || d.compareTo(p.subtract(BigInteger.ONE)) != -1);y = alpha.modPow(d, p);}public ElGamal(BigInteger p, BigInteger alpha, BigInteger d) {this.p = p;this.alpha = alpha;this.d = d;y = alpha.modPow(d, p);}/*** 加密* @param M* @return*/BigInteger[] encrypt(BigInteger M) {BigInteger[] C = new BigInteger[2];BigInteger k, U;do {do {k = new BigInteger(100, new Random());} while (k.compareTo(BigInteger.ONE) != 1 || k.compareTo(p.subtract(BigInteger.ONE)) != -1);U = y.modPow(k, p);} while (U.intValue() != 1);C[0] = alpha.modPow(k, p);C[1] = U.multiply(M).mod(p);return C;}/*** 加密* @param M* @param k* @return*/BigInteger[] encrypt(BigInteger M, BigInteger k) {BigInteger[] C = new BigInteger[2];BigInteger U = y.modPow(k, p);C[0] = alpha.modPow(k, p);C[1] = U.multiply(M).mod(p);return C;}/*** 解密* @param C* @return*/BigInteger decrypt(BigInteger[] C) {BigInteger V = C[0].modPow(d, p);BigInteger M = C[1].multiply(V.modPow(new BigInteger("-1"), p)).mod(p);return M;}/*** 判断a是否为模m的原根,其中m为素数* @param a* @param m* @return*/static boolean isOrigin(BigInteger a, BigInteger m) {if (a.gcd(m).intValue() != 1) return false;BigInteger i = new BigInteger("2");while (i.compareTo(m.subtract(BigInteger.ONE)) == -1) {if (m.mod(i).intValue() == 0) {if (a.modPow(i, m).intValue() == 1)return false;while (m.mod(i).intValue() == 0)m = m.divide(i);}i = i.add(BigInteger.ONE);}return true;}public BigInteger getD() {return d;}}

测试代码

import java.math.BigInteger;public class TestElGamal {public static void main(String[] args) {//BigInteger p=BigInteger.valueOf(2579L);System.out.println("initial...");BigInteger p=new BigInteger("2579");BigInteger alpha=new BigInteger("2");BigInteger d=new BigInteger("765");//skElGamal elGamalDemo=new ElGamal(p,alpha,d);System.out.println("System Parameter...");System.out.println("p="+elGamalDemo.p);System.out.println("alpha="+elGamalDemo.alpha);System.out.println("d="+elGamalDemo.getD());System.out.println("y="+elGamalDemo.y);BigInteger M=new BigInteger("2023");BigInteger k=new BigInteger("853");System.out.println("M="+M);System.out.println("Encrypt...");BigInteger[] C=elGamalDemo.encrypt(M,k);System.out.print("After encryption : ");System.out.println(C[0]+" "+C[1]);BigInteger newM=elGamalDemo.decrypt(C);System.out.println("Decrypt...");System.out.print("After decryption : ");System.out.println(newM);}
}

ELGamal 加密算法及Java实现相关推荐

  1. [密码学] ElGamal加密算法与离散对数

    文章目录 前言 离散对数问题 ElGamal加密算法 算法描述 密钥生成 加密算法 解密算法 椭圆曲线群上的ElGamal加密 密钥生成 加密算法 解密算法 优势 点压缩 离散对数问题的困难性 穷举搜 ...

  2. 常用加密算法的Java实现(一) ——单向加密算法MD5和SHA

    1.Java的安全体系架构 1.1           Java的安全体系架构介绍 Java中为安全框架提供类和接口.JDK 安全 API 是 Java 编程语言的核心 API,位于 java.sec ...

  3. 常用加密算法(Java实现)总结

    1.Java的安全体系架构 Java中为安全框架提供类和接口.JDK 安全 API 是 Java 编程语言的核心 API,位于 java.security 包(及其子包),以及sun.security ...

  4. 转:常用的几种加密算法以及java实现

    转自:  https://blog.csdn.net/wqwqwqwq403/article/details/103948952 工作中经常会接触到一些加密算法,比如说base64.MD5.DES.A ...

  5. 常用加密算法的Java实现(一)

    常用加密算法的Java实现(一) --单向加密算法MD5和SHA 摘自:http://www.blogjava.net/amigoxie/archive/2014/06/01/414299.html ...

  6. aes加密算法 java实现,AES加密算法的java实现

    AES加密算法的java实现 package com.encryp; import java.security.InvalidKeyException; import java.security.No ...

  7. Elgamal 加密算法

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

  8. ElGamal加密算法简介

    目录 简介 阶 本原元 算法流程 1.密钥生成 2.加密 3.解密 简介 上一篇介绍了非对称加密算法中的RSARSA算法简介,这次看一下ElGamal算法. 首先它是一个基于迪菲-赫尔曼密钥交换的非对 ...

  9. MD5加密算法及Java实现

    MD5加密算法及Java实现 上个学期在学数据库的时候,大作业是用Java Web+MySQL实现一个简易的系统,其中老师就提到了MD5算法,用来将用户提交的密码进行加密后放在数据库中,以防被泄露.在 ...

最新文章

  1. 静态html文件js读取url参数
  2. Windows下编程需要看哪些书
  3. ArcUser 2006第2期拾零
  4. Unix系统编程():分散输入和集中输出(Scatter-Gather IO):readv和writev
  5. 你究竟值多少钱?2021 科技行业薪酬分析
  6. CocoaPods加载第三方库
  7. PHP多重身份认证,浅谈php用户身份认证
  8. photoshop CS6 DDS插件
  9. 小米手机html格式怎么打开,小米手机打开HTML用WPS
  10. 补充STM32 PWM占空比,频率的计算及输入捕获细节到STM32库函数的掌握方法
  11. mac 外接显示器 发热严重 解决方案
  12. 上海提取公积金所需材料
  13. 云开发电商小程序实战教程-篇首语
  14. 电脑游戏怎么转移新电脑,换新电脑如何迁移游戏
  15. 运动检测ViBe算法python实现
  16. simHash 简介以及 java 实现
  17. python版本降级
  18. 百度IFE前端学院-DAY1-Web开发概览
  19. java基于ssm+vue网上考试报名系统 element
  20. C++ 单链表基本操作分析与实现 链表   链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结

热门文章

  1. 我为SEO代言,屌丝为我代言
  2. 疯了!一个rm-rf把公司整个数据库删没了...
  3. 在家里赚钱的工作,在家利用互联网赚钱,应该这样干!
  4. 我的一点企业上云经验
  5. 【GT跑车】GT跑车是什么意思 GT跑车有哪些
  6. 梆梆加固的Android P版本预兼容之路
  7. 实时车辆行人多目标检测与跟踪系统-上篇(UI界面清新版,Python代码)
  8. 技术管理那些事(二)“人剑合一”的团队
  9. 下载win10镜像(iso)
  10. 导出word功能,用html代码在word中插入分页符