当前位置: 首页 > 知识库问答 >
问题:

加密时返回NaN的Java RSA算法

林弘壮
2023-03-14

我正在尝试用RSA加密对用户输入进行加密。

使用Eclipse中的调试监视器,我可以看到当代码使用“e”为asciiLetter提供动力并尝试mod"n“时,”e“和”n“是一个太大的数字,并且返回无穷大或nan。有什么关于如何改变这一点的指导吗?

我将位长从1024更改为128,但这没有效果。

稍后,我需要解密,但正在努力使这部分工作在事前。

public class RSA {


    static int bitlength = 128;
    private static Random r = new Random();
    private static BigInteger p = BigInteger.probablePrime(bitlength, r); 
    private static BigInteger q = BigInteger.probablePrime(bitlength, r);
    private static BigInteger n = p.multiply(q);
    private BigInteger phi = p.subtract(BigInteger.ONE).multiply(q.subtract(BigInteger.ONE)); 
    private static BigInteger e = BigInteger.probablePrime(bitlength / 2, r);
    private BigInteger d;
    private static BigInteger encryptedMessage; {
        while (phi.gcd(e).compareTo(BigInteger.ONE) > 0 && e.compareTo(phi) < 0)    {
        e.add(BigInteger.ONE);        
        }
    BigInteger d = (e.modInverse(phi)); 
    }

    public static void main(String[] args)    {

    Scanner input = new Scanner(System.in);
        System.out.println("Please enter your message: ");

    String clearMsg = input.nextLine().trim(); // String clearMsg = input.next();
        System.out.println(clearMsg); // Check message trimmed

char userInputArray[] = clearMsg.toCharArray();
ArrayList<BigInteger> cipherTextArray = new ArrayList<BigInteger> (); 

for (int i = 0; i < userInputArray.length; i++) {

    int letter = userInputArray[i];
    BigInteger bigLetter = new BigInteger(String.valueOf(letter));
    BigInteger asciiLetter = (BigInteger) bigLetter;
    BigInteger encryptedMessage = pow(asciiLetter, e);
    BigInteger encryptM = encryptedMessage;
    BigInteger encryptedMessageMod = encryptM.mod(n);
    cipherTextArray.add(encryptedMessageMod);
}

        System.out.println(cipherTextArray);
}


private static BigInteger pow(BigInteger asciiLetter, BigInteger e) { 
    // TODO Auto-generated method stub
    return null;

共有1个答案

蓟安歌
2023-03-14

而不是使用BigInteger.pow(...)然后在计算结果mod n的第二步中,查看BigInteger.modpow(...)

同时完成两个步骤,并且不需要在内存中有一个比你的内存更大的结果...

 类似资料:
  • 我在C#程序(我在下面提到)中使用了RSA非对称密钥加密算法,我必须通过java程序加密数据。我希望我的java程序生成与C#程序相同的加密密钥。 公钥: C#加密程序: Java加密方案: 我尝试了上述java程序,但结果如下: O+gw 7+X hY x A 9 ltD V 5 zE RsF 4 Dy Xg MTc/gx 82 wR tT 1 x fR 3 su Y 0 XB JLa dp 7

  • 我不明白为什么下面的函数返回NaN,甚至答案不应该是NaN。我试着搜索类似的问题,但大多数是在其他编程语言中,我无法理解。 提前谢了。

  • 我很熟悉在JavaScript中是“怪异的”,即总是返回,如本文所述。因此,不应进行比较来检查,而应使用isNaN(..)取而代之的是。 所以我惊讶地发现 这似乎不一致。为什么会有这种行为? 它是怎么工作的?方法是否专门检查?

  • 我在一个JavaScript类中有一个乘法方法,它应该将数组中非未定义的所有元素相乘。我使用for loop检查每个元素的类型,即number并将它们推到一个空数组,然后使用reduce方法将它们相乘。但我现在有的问题是结果是返回南。我想知道我做错了什么。 下面是我的代码。 null null

  • 想要在java中使用生成的RSA公钥,在c#函数中加密数据并在Java解密函数中解密。 生成的Java公钥已被替换为c#中的模数标记: C#加密功能: Java解密函数: 第一个问题:在c#XML字符串中替换模数标记中的Java公钥正确吗?指数标签呢?我用了AQAB值。 第二个问题:为什么在解密Java得到这个错误: 经过一些研究,我发现这是一个普遍的错误,什么原因会导致这种错误?