[英]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.