繁体   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