首页 - 新闻世界 - 神医喜来乐,区块链中的暗码学之非对称暗码ELGamal算法(十一),囊肿

神医喜来乐,区块链中的暗码学之非对称暗码ELGamal算法(十一),囊肿

发布时间:2019-04-06  分类:新闻世界  作者:admin  浏览:305

1. 前语

ELGamal暗码是除了RSA之外最有代表性的揭露密钥暗码之一,它的安全性建立在离散对数问题的困难性之上,是一种公认安全的公钥暗码。

咱们再来回忆下离双组份灌胶机散对数问题:

设p为素数,若存在一个正整数,使得、2、...、p-1关钛金瓦于模p互不同余,则称吴昊俣为模p的一个原根。所以有如下运算:的幂乘运算:y=x(mod p),1≤x≤p-1,的对数运算:x=logy,1≤y≤p-1

只需p足够大,求解离散对数问题时适当杂乱的。离散对数问题神医喜来乐,区块链中的暗码学之非对称暗码ELGamal算法(十一),囊肿具有较好的单向性。

2. ELGamal加解密算法

1.随机地挑选一个大素数p,且要求p-1有大素数因子,将p揭露。

2.挑选一个模p的周克华案改编的电视剧原根,并将揭露。

3.随机地挑选一个整数d(1<d<p-1)作为私钥,并对d保密。

4.核算公钥y=^d(mod p),并将y揭露。

加密

1.随机地选取一个整数k(1<k<p-1)。

2.核算U=y^k锚草论(mod p)、C1=^k(mod p)、C2=UM(mod p)。

3.取(C1,C2)作为密文。

解密

1.核算V=C1^d(mod p)。

2.核算M=C2V^-1(mod p)。

正确性证明

3. ELGamal算法细节

完成ELGamal算法,需求完成以下几个部分:

1.对大数的素数断定;(RSA算法学习过)

2.判别原根;

3.模指运算;(RSA算法学习过)

4神医喜来乐,区块链中的暗码学之非对称暗码ELGamal算法(十一),囊肿.模逆运神医喜来乐,区块链中的暗码学之非对称暗码ELGamal算法(十一),囊肿算。(RSA算法学习过)

判别原根

已知a和m互素,假如d是满意a^d=1(mod m)的最小正整数,则称d为a模m的阶,记为d=m(a)。因为a和m互素,依据欧拉定理可知a^(m)=1(mod m),由此能够得到m(a) | (m)。

若a是m的原根,则m(a)=(m)。

依据上述两点,推出逆否命题:假如∃d | (m)且d≠(m),使得a^d=1(mod m),则a不是模m的原根。所以判别a是否为模m的原根,最快的办法便是判别(m)的每一个因子d是否使得a^d=1(mod m)。假如满意ad=1(mod m)的d=(m),则a是模m的原根。

eg:判别2是不是模11的原根,(11)=10。10的因子有1、2、5、10,所以:

2(mod 11)=2

2^2(mod 11)=4

2^5(mod 11)=10

2^10(mod 11)=1

因而,2是模11的原根。

4. ELGamal暗码的安全性

因为ELGamal暗码的安全性建立在GF(p)上离散对数的困难性之上,而现在尚无求解GF(p)上离散对数的有用算法,所以在p足够大时ELGamal暗码是安全的。抱负情况下p为强素数,p-1=2q,q为大素数。

为了安全加密所运用的k有必要是一次性的。假如长时间使救君缘用同一个k加密的话,就可能被攻击者卡为尔获取,然后依据V=U=y^k(mod p),M=C2V^-1(mod p)而得日加木到明文。别的,运用同一个k加密不同的明文M和M',则因为

假如攻击者知道M,则很简单求出M'。此外,k选取时还要确保U=y^乱男宫k(mod p)≠1。

5. 根据ELGamal的java源码的完成

ELGamal源码:

import java.math.BigInteger;
import java.util.Random;
public class ELG神医喜来乐,区块链中的暗码学之非对称暗码ELGamal算法(十一),囊肿amal {
public BigInteger p, alpha, y;
private BigInteger d;
public ELGamal() {
do {
//1. 随机地挑选一个大素数p,且要求p-1有大素数因子,将p揭露。
p = BigInteger.probablePrime神医喜来乐,区块链中的暗码学之非对称暗码ELGamal算法(十一),囊肿(100, new Random());
} while (p.subtract(BigInteger.ONE).divide(new BigInteger("2")).isProbablePrime(100));
do {
//2.挑选一个模p的原根,并将揭露。
alpha = new BigInteger(1名伦神峰顶00, new Random());
} while (! isOrigin(alpha, p));
do {
//3.随机地挑选一个整数d(1<d<p-1)神医喜来乐,区块链中的暗码学之非对称暗码ELGamal算法(十一),囊肿作为私钥,并对d保密。
d = new BigInteger(100, new Random());
} while (d.compareTo(BigInteger.ONE) != 1 || d.compareTo(p.subtract(BigInteger.ONE)) != -1);
//4.核算公钥y=^d(mod p),并将y揭露。
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);
}
/**
* 加密
* 随机地选取神医喜来乐,区块链中的暗码学之非对称暗码ELGamal算法(十一),囊肿一个整数k(1<k<p-1)
* 核算U=yk(mod p)、C1=k(mod p)、C2=UM(mod p)
* 取(C1,C2)作为密文
* @param M
* @return
*/
BigInteger[] encrypt(BigInteger M) {
BigInteger[] C = new BigInteger[2];
BigIn挽妻teger 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;
}
/**
* 解密
* 核算V=C1^d(mod p);
* 核算M=C2V^-1(mod p)
* @p养女小说aram C
* @return
*/
BigInteger decrypt(BigInteger[] C) {
Big恶魔榨精Integer V = C[0].modPow(d, p);
Big闻檀的作品集Integer M = C[1].multiply(V.modPow(new BigInteger("-1"), p)).mod(p);
return M;
}
/**
* 判别a是否为模m的原根,其间m为素数
* @param a
* @param m
* @return
*/
static boolean isO鲛人直播歌唱的日子rigin(BigInteger a, BigInteger m) {
if (色5a.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 = new BigInteger("2579");
BigInteger alpha = new BigInteger("2");
BigInteger d = new BigInteger("765");
ELGamal elgamal = new ELGamal(p, alpha, d);
妈妈说下面痒了想玩System.out.println("p=" + elgamal.p);
System.out.println("=" + elgamal.alpha);
System.out.println("d=" + elgamal.getD());
System.out.println("y=" + elgamal.y);
BigInteger M = new BigInteger("1299");
BigInteger k = new BigInteger("853");
BigInteger[] C = elgamal.encrypt(M, k);
System.out.println("明文:M=" + M);
System.out.println("k=" + k);
System.out.println("密文:(C1, C2)=(" + C宋辞遇苏惜[0] + ", " + C[1] + ")");
BigInteger decryptM=elgamal.decrypt(C);
System.out.println("解密:decryptM=" + decryptM);
}
}

测验成果:

更多代码请参阅:https://github.com/Anapodoton/Encryption/tree/master/ELGamal