我试图通过查找P和Q来找出RSA加密(使用Java)。这是我必须做的:
我必须生成两个随机数(P和Q)并遵循指南:
所以,基本上我是从这开始的:
double p = Math.random();
double q = Math.random();
...然后尝试遵循上面的5条指导原则。任何人都可以给我一个关于如何找出#1和#3的提示吗?
谢谢!
答案 0 :(得分:1)
P
和Q
必须大于1且最多7位,也就是说,小于2^7 = 128
。简单地说,生成一个介于2到127之间的数字。
为此,您应该使用Random.nextInt
,因为它已经在指定的时间间隔内为您提供了一个随机整数。确定随机整数的上限,然后设置:
final Random rand = new Random();
int p = rand.nextInt(127 - 2 + 1) + 2;
然后,回到核心:素性测试。有一些策略可以测试一个数字是否为素数,但由于你的数字很小,我们不会过分复杂化并使用试验部门。也就是说,尝试每个(奇数)小于P
的数字,看看它是否均匀地划分P
:
public boolean isPrime(int p) {
if (p == 2) return true;
if (p % 2 == 0) return false;
for (int d = 3; d < p; d += 2) {
if (p % d == 0) return false;
}
return true;
}
这里有一些可能的优化,比如如果有P
的除数,那么它不能大于Math.sqrt(p)
,但是,我会让你弄清楚细节。
所以现在你可以将这两个部分放在一起并得到一个素数生成器:
class PrimeGenerator {
private final Random rand = new Random();
public int next() {
int p = nextInt();
while (!isPrime(p)) {
p = nextInt();
}
return p;
}
private int nextInt() {
return rand.nextInt(127 - 2 + 1) + 2;
}
private boolean isPrime(int p) {
// As above...
}
}
关键是在给定范围内生成一个随机数,测试它是否为素数,并重复直到生成素数。
答案 1 :(得分:1)
您可以使用Seive of Eratosthenes来检查数字是否为素数。
你可以做的是,生成一个包含所有素数的列表(seive有助于轻松构建)小于2^7
- 以便保持条件#1。然后从列表中随机选择2个数字p
和q
。
以下是如何使用seive构建素数列表:
List<Integer> getPrimeList(final int MAX_PRIME) {
// Initialize a boolean array and set all values to true.
bool[] isPrime = new bool[MAX_PRIME + 1];
Arrays.fill(isPrime, true);
List<Integer> primes = new ArrayList<>();
// Start from 2. 0 and 1 are not prime.
for(int i = 2; i * i <= MAX_PRIME; i++) {
// If we've found a prime, set all it's multiples as composite,
// and add this prime number to the list.
if(isPrime[i]) {
for(int j = i * i; j <= MAX_PRIME; j += i) isPrime[j] = false;
primes.add(i);
}
}
return primes;
}
您可以生成此列表一次,并在每次需要获取随机素数时使用它。
int getRandomPrime() {
int randIndex = (int)(Math.random() * primes.size());
return primes.get(randIndex);
}