1

我想编写自己的没有库的 RSA 加密器!

代码:

import java.util.Random;

public class Main {

public static void main(String[] args) {
    System.out.println(createPrime());
}

private static byte encrypt(byte message) {
    double p = createPrime();
    double q = createPrime();
    double e = 2 ^ new Random().nextInt(100) % (p * q);
    byte ciphered = Math.pow(message, e);
    return ciphered;
}

private static double createPrime() {
    double testPow;
    do {
    int test = new Random().nextInt(20);
    int power = new Random().nextInt(20);
    test += 1;
    power +=1;
    testPow = Math.pow(test, power);
    System.out.println("Double Math.pow: " + testPow);
    } while (!testPrime(testPow));
    return testPow;
}

private static Boolean testPrime(Double test) {
    int factor = 2;
    int lastFactor = 1;
    while (test > 1) {
        if (test % factor == 0) {
            lastFactor = factor;
            test /= factor;
            while (test % factor == 0) {
                test /= factor;
            }
        }
        factor++;
    }
    Boolean isPrime = false;
    if (test == lastFactor) {
        isPrime = true;
    }
    return isPrime;
 }
}

这就是我用来加密的东西。我不知道我应该做什么来纠正这个问题,但在尝试这个之前我几乎已经手动完成了这个。

所以我知道加密的方程是 c = m^e (mod N) 和解密 m = c^d (mod N)

其中 p, q 是素数 - m 是消息 - c 是密文 - e 是 N 的总和 - N 是 p 乘以 q - N 的总和是 (p-1)(q-1)

任何帮助表示赞赏

4

4 回答 4

4

首先要做的是查看 java.math.BigInteger 类。本课程将帮助您实现“教科书”RSA。

于 2011-02-26T22:01:29.407 回答
2

你没有问一个真正的问题,但我还是看到了一些问题


double e = 2 ^ new Random().nextInt(100) % (p * q);

我不知道这应该做什么,但这是错误的。你的意思是Math.Pow()而不是^?在任何情况下,通常您只需使用一些带有很少设置位的小常量e来加快加密速度。 e=3或者e=65可以正常工作。

您似乎根本没有计算私钥 ( d),甚至根本没有存储公钥 ( e, p*q)。

当你开始使用大数时,int( double??) 将无法容纳它们。改为使用BigInteger


do {
    testPow = Math.pow(test, power);
} while (!testPrime(testPow));

如果power > 1, testPow 永远不会是素数...


我没有看过testPrime(),但你应该能够编写一些快速的单元测试来说服自己它是否可能有效。

于 2011-02-26T21:55:22.330 回答
1

Java 包下有内置的加密算法java.security检查这个。所以不需要外部库。我认为没有生产需要自己实现它。只有当它是家庭作业(你没有标记)

于 2011-02-26T20:08:42.927 回答
1

我建议阅读/复制现有的实现以供参考,例如 BouncyCastle: http: //www.docjar.com/html/api/org/bouncycastle/crypto/engines/RSACoreEngine.java.html

顺便说一句,如果您希望它完全安全,您应该使用 java.security.SecureRandom,而不是 java.util.Random

于 2011-02-26T22:10:51.373 回答