java El Gamal明文加密(非数字)不工作
下面是我加密明文(不是数字)的JAVA代码。 代码包括加密和解密
解密的文本与明文不匹配,我在做什么
如果我将BigInteger m = new BigInteger(msg.getBytes());
替换为此代码BigInteger m = new BigInteger(msg);
,则我的代码可以工作
package com.porsche.main;
import java.util.*;
import java.math.BigInteger;
public class ElGamal {
// Get user input for prime.
// static BigInteger p = new BigInteger("13256401");
static BigInteger p = new BigInteger("14893003337626352152463254152616458181260144281");
// Calculate a generator.
// static BigInteger g = new BigInteger("957");
static BigInteger g = new BigInteger("4893003337626352152463254152616458181260144281");
// Pick a secret a.
// BigInteger a = new BigInteger(p.bitCount()-1, r);
static BigInteger a = new BigInteger("843900337326351225463254152616458181260144281");
public static void main(String[] args) {
Random r = new Random();
// Calculate the corresponding public b.
BigInteger b = g.modPow(a, p);
// Print out our public keys.
System.out.println("p = " + p);
System.out.println("g = " + g);
System.out.println("b = " + b);
// When we send a message, the sender picks a random k.
BigInteger k = new BigInteger(p.bitCount()-1, r);
// Here, the sender starts calculating parts of the cipher text that
// don't involve the actual message.
BigInteger c1 = g.modPow(k, p);
BigInteger c2 = b.modPow(k, p);
// Here we get the message from the user.
String msg = "12345678901234567890123456789012345678901234567";
BigInteger m = new BigInteger(msg.getBytes());
System.out.println("The message encryption = " + msg);
// Now, we can calculate the rest of the second cipher text.
c2 = c2.multiply(m);
c2 = c2.mod(p);
// Print out the two cipher texts.
System.out.println("The corresponding cipher texts are");
System.out.println("c1 = " + c1);
System.out.println("c2 = " + c2);
// First, determine the inverse of c1 raised to the a power mod p.
BigInteger temp = c1.modPow(a,p);
temp = temporariness(p);
// Print this out.
System.out.println("Here is c1^ -a = "+temp);
// Now, just multiply this by the second cipher text
BigInteger recover = temp.multiply(c2);
recover = recover.mod(p);
// And this will give us our original message back!
System.out.println("The decrypted message = "+recover);
}
}
# 1 楼答案
您提供的关于“El Gamal”算法的信息非常少,因此很难找到代码没有按预期工作的原因。在网络中搜索一点,我发现了一个与您的非常相似的工作示例代码,它正在工作(http://faculty.washington.edu/moishe/javademos/Security/ElGamal.java)
请记住,使用BigInteger变量意味着您将得到非常大的数字,这限制了您可以使用的数据(“明文”)的大小。示例代码最多可以加密19个字符&;解密后,较长的明文将不起作用。因此,我使用了与您不同的明文(“9876543210987654321”)
结果如下:
这是工作代码(与链接代码相比变化最小):
编辑: 关于你的评论“谢谢你的回复。明文是否只需要是所有数字,它可以是类似“Hellow World!“?”:
根据JavaDocs(https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/math/BigInteger.html),使用这些构造函数创建一个BigInteger,并且所有构造函数都有一个共同点——它必须是一个表示BigInteger值的数字,而不是一个字符: