簡體   English   中英

如何在RSA中加密?

[英]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=3e=65可以正常工作。

您似乎根本沒有計算私鑰( d ),甚至根本沒有存儲公鑰( ep*q )。

當您開始使用大數時, intdouble (??)將無法保留它們。 改用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM