【发布时间】:2018-09-28 04:42:03
【问题描述】:
所以,我正在尝试从头开始创建 RSA 算法。
到目前为止,我已经成功创建了选择两个素数的能力(在我当前的示例中,我有 11 和 13。然后,我通过 p x q 计算 N。得到 143。
然后,我继续我的 public BigInteger findZ() 方法,它计算 φ 即 (p-1)(q-1)。
使用这个新计算的 φ,我想找到一个数字,或者更确切地说创建一个遵循 1
这是我的代码。
import java.math.BigInteger;
public class RSA
{
//Intialize the variables.
private BigInteger p;
private BigInteger q;
private BigInteger n;
private BigInteger z;
final private BigInteger ONE = BigInteger.valueOf(1);
public BigInteger getP()
{
return p;
}
public BigInteger getQ()
{
return q;
}
//Computes N, which is just p*q.
public BigInteger findN()
{
n = p.multiply(q);
return p.multiply(q);
}
public BigInteger findZ()
{
long pMinusOne = p.intValue() - 1;
long qMinusOne = q.intValue() - 1;
z = BigInteger.valueOf(pMinusOne * qMinusOne);
return z;
}
public BigInteger getE()
{
int temp = ONE.intValue() + 1;
BigInteger GCD = BigInteger.valueOf(temp);
while (GCD.gcd(z).compareTo(ONE) != 0)
{
temp++;
}
e = BigInteger.valueOf(temp);
return e;
}
}
非常感谢任何帮助。
谢谢!
【问题讨论】:
-
这段代码有什么变化
while (GCD.gcd(z).compareTo(ONE) != 0) { temp++; }唯一变化的是temp,它是一个局部变量,所以循环永远不会结束,因为它没有改变 -
嗯,temp 正在循环中被改变,所以即使它是在本地声明的,它也应该改变。有点像 for 循环中的索引,对吗?
-
不,
while (GCD.gcd(z).compareTo(ONE) != 0)不使用temp所以改变它没有区别 -
@ScaryWombat 即使在删除临时文件后,将 GDC 更改为等于 BigInteger.valueOf(2);然后循环并执行 GCD.add(ONE);直到比较为真会导致循环永远进行。所以无论哪种方式都没有区别。
-
我也尝试在 z-1 处启动 GCD 变量,但这会导致循环立即结束,所以我的 e 总是比 z 小 1,我认为这是行不通的。
标签: java encryption rsa biginteger greatest-common-divisor