如何在RSA中加密?

时间:2011-02-26 20:03:16

标签: java rsa encryption modular

我想在没有图书馆的情况下编写自己的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 个答案:

答案 0 :(得分:4)

要做的第一件事是看一下java.math.BigInteger类。本课程将帮助您实施“学校书”RSA。

答案 1 :(得分:2)

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


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

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

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

当您开始使用大数字时,intdouble(??)将无法容纳它们。请改用BigInteger


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

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


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

答案 2 :(得分:1)

Java在java.security包下有内置加密算法。 Check this。所以不需要外部库。我认为没有生产需要自己实现它。只有它是作业(你没有标记)

答案 3 :(得分:1)

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

顺便说一句,如果您希望这一切都安全,那么您应该使用java.security.SecureRandom,而不是java.util.Random