Java 带biginteger的rsa接受p&;来自用户的q

Java 带biginteger的rsa接受p&;来自用户的q,java,encryption,cryptography,rsa,biginteger,Java,Encryption,Cryptography,Rsa,Biginteger,我正在尝试的是使用rsa加密当前日期和时间,并使用此密码文本输入另一个应用程序以验证用户身份 这是代码。我对java不感兴趣,所以我从互联网上复制了它,并对它做了一些更改 程序- import java.math.BigInteger; import java.security.SecureRandom; import java.util.Scanner; import java.util.Date; import java.text.DateFormat; import java.text.S

我正在尝试的是使用rsa加密当前日期和时间,并使用此密码文本输入另一个应用程序以验证用户身份

这是代码。我对java不感兴趣,所以我从互联网上复制了它,并对它做了一些更改

程序-

import java.math.BigInteger;
import java.security.SecureRandom;
import java.util.Scanner;
import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;


public class RSA3
{
public BigInteger n, d, e;

private int bitlen = 16;



 /** Create an instance that can both encrypt and decrypt. */

 public RSA3(int bits) 
{
     bitlen = bits;
    SecureRandom r = new SecureRandom();
 Scanner in = new Scanner(System.in);
 String number1, number2;
 System.out.println("Enter first number");
 number1 = in.nextLine();

 System.out.println("Enter second number");
 number2 = in.nextLine();

 BigInteger p  = new BigInteger(number1);
 BigInteger q = new BigInteger(number2);
 //BigInteger p = new BigInteger(bitlen / 2,100,r);
    //BigInteger q = new BigInteger(bitlen / 2,100,r);
    n = p.multiply(q);

 System.out.println("\n n="+n);
    BigInteger m =  (p.subtract(BigInteger.ONE)).multiply(q.subtract(BigInteger.ONE));
  System.out.println("\n m="+m);
    e = new BigInteger("3");
    while (m.gcd(e).intValue() > 1) 
 {
         e = e.add(new BigInteger("2"));
    }
  System.out.println("\n e="+e);
   d = e.modInverse(m);
  System.out.println("\n d="+d);
 }




  /** Encrypt the given plaintext message. */

  public synchronized BigInteger encrypt(BigInteger message) 
  {System.out.println("\n 2nd enc");
     return message.modPow(e, n);

   }



  /** Decrypt the given ciphertext message. */
  public synchronized BigInteger decrypt(BigInteger message) 
  {System.out.println("\n2nd dec");
   return message.modPow(d, n);

  }




  /** Trivial test program. */
 public static void main(String[] args) 
 {
  RSA3 rsa = new RSA3(1024);
 DateFormat dateFormat = new SimpleDateFormat("yyyyMMddHH");
   //get current date time with Date()
  Date date = new Date();
   System.out.println(dateFormat.format(date));


  String text1 = dateFormat.format(date);
  System.out.println("Plaintext: " + text1);
  BigInteger plaintext = new BigInteger(text1.getBytes());

   BigInteger ciphertext = rsa.encrypt(plaintext);
  System.out.println("Ciphertext: " + ciphertext);
  plaintext = rsa.decrypt(ciphertext);

    String text2 = new String(plaintext.toByteArray());
   System.out.println("Plaintext: " + text2);
  }
  }
如果我像在代码中那样从用户处获取p&q值。密文有点问题。 但是如果我使用biginger(bitlen/2100,r);它工作得很好。 但每次用这个随机数生成密文都是新的。我不想这样 我想要我自己选择的p&q

我想我把biginteger搞砸了。 请让我知道,如果有任何其他方法,我可以做到这一点

我在这里找不到逻辑错误 请帮忙
谢谢

目前还不清楚您当前的代码有什么问题。请澄清这一点,并相应地回答您的问题。请快速回复,并为我糟糕的英语感到抱歉。您是想在项目中使用此RSA实现,还是这纯粹是学术性的?教科书坏了。要使RSA安全,必须使用OAEP等填充方案。Java通过提供所有必要的东西来完成这项工作。您的代码可以正常工作。您可能在输入两个长素数时出错。当发布到stackoverflow时,请尽可能描述您的问题。“密文有问题”永远不是一个好的错误描述。