[英]How to encrypt in RSA?
我要编写没有库的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)
任何帮助表示赞赏
首先要做的是查看类java.math.BigInteger。 该课程将为您实施“学校手册” RSA带来很大帮助。
您没有问一个真正的问题,但是我仍然看到几个问题
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()
,但是您应该能够编写一些快速的单元测试来说服自己是否可行。
Java在java.security
包下具有内置的加密算法。 检查一下 。 因此,无需外部库。 我认为没有生产需要自己实施。 仅当是家庭作业(您未标记)时
我建议阅读/复制现有的实现以供参考,例如BouncyCastle: http : //www.docjar.com/html/api/org/bouncycastle/crypto/engines/RSACoreEngine.java.html
顺便说一句,如果您希望此操作完全安全,则应该使用java.security.SecureRandom,而不是java.util.Random
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.