RSA加密 - 查找P和Q.

时间:2015-02-26 21:54:30

标签: java algorithm encryption rsa

我试图通过查找P和Q来找出RSA加密(使用Java)。这是我必须做的:

我必须生成两个随机数(P和Q)并遵循指南:

  1. P& Q必须是最多7位长
  2. P& Q不能为0或1(使用Math.random()函数是我为此步骤做的事情
  3. P& Q必须是素数
  4. P& Q不能是相同的数字(已经有这个想法
  5. (PQ)必须至少为256(已经弄清楚
  6. 所以,基本上我是从这开始的:

        double p = Math.random();
        double q = Math.random();
    

    ...然后尝试遵循上面的5条指导原则。任何人都可以给我一个关于如何找出#1和#3的提示吗?

    谢谢!

2 个答案:

答案 0 :(得分:1)

PQ必须大于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个数字pq

以下是如何使用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);
}