我想在没有图书馆的情况下编写自己的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)
感谢任何帮助
答案 0 :(得分:4)
要做的第一件事是看一下java.math.BigInteger类。本课程将帮助您实施“学校书”RSA。
答案 1 :(得分: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()
,但你应该能够写一些快速的单元测试来说服自己是否可能有用。
答案 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