用JAVA实现RSA加密解密

package rsaa;


import java.io.*;
import java.math.BigInteger;
import java.util.ArrayList;
public class RSA{
 private long p=0;
 private long q=0;
 private long n = 0;
    private long m = 0;
    private long public_key = 0; //公匙
    private long private_key = 0; //密匙
    private String text ; //明文
    private long secretword=0 ; //密文
    private long word = 0; //解密后明文
    public boolean prime(long a)//判断是否是素数
    {
     long b=0;
     b=(long) Math.sqrt((double) a);
     int c,i;
     c=0;
     for(i=2;i<b;i++)
     {if(a%i==0)
     {
      c=1;
      break;
     }
      }
     if(c==1)
      return false;
     else
      return true;
    }
    public void bigprimeRandom() {//产生随机的大素数
        do{
            p = (long) (Math.random() * 1000000);
        }while(!this.prime(p));
        do{
            q=(long)(Math.random()*1000000);
        }while(p==q||!this.prime(q));
    }
   public void pq()throws Exception{  //P Q的生成
    this.bigprimeRandom();
    System.out.println("自动生成的p,q分别为:"+this.p+"  "+this.q);
    this.n=(long)p*q;
    this.m=(long)(p-1)*(q-1);
    System.out.println("p*q=" + this.n);
       System.out.println("m=(p-1)(q-1)=" + this.m);
   
   }
   public long gys(long a ,long b)  //求最大公约数
   {
    long c;
    if(b==0)
     c=a;
    else
     c=gys(b,a%b);
    return c;
   }
   public void getPublic_key()throws Exception {//生成公钥
       do {
                 
           this.public_key=(long)(Math.random()*100000);
       } while ((this.public_key >= this.m) ||
                (this.gys(this.m, this.public_key) != 1));
       System.out.println("生成的公钥为:" + this.public_key);
   }
   public void getPrivate_key() {//得到秘钥
    int i;
       long a = 1;
      for ( i = 1; ; i++) {
           a = i * this.m + 1;
           if ( a%this.public_key== 0 &&a/this.public_key<this.m)  {
               this.private_key = a / this.public_key;
            break;
           }
       }
       System.out.println("产生的密钥为:" + this.private_key);
   }
  public void getText() throws Exception//输入明文
   {
System.out.println("请输入明文:");
BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
text = stdin.readLine();
   }
  public long jm(long y, long n, long key) {//加密
      BigInteger yy=new BigInteger(String.valueOf(y));//将long变成字符型的
      BigInteger nn=new BigInteger(String.valueOf(n));
      BigInteger kkey=new BigInteger(String.valueOf(key));
      return Long.parseLong(yy.modPow(kkey,nn).toString());//modpow()计算y^e mod n的函数
  }

 
  public void jmjm() throws Exception {  //加密,解密
      this.getText();
      System.out.println("输入明文为: " + this.text);
   
      ArrayList cestr=new ArrayList();  //动态数组
      for (int i = 0; i < text.length(); i++) {//一个字符为一组
          this.secretword = this.jm( (long)text.charAt(i), this.n,this.public_key);
          cestr.add(secretword);//将对象加在结尾处
      }
      System.out.println("加密后所得的密文为:" +cestr);
      //解密
      StringBuffer destr=new StringBuffer();
      for(int j=0;j<cestr.size();j++) {
     this.word = this.jm(Long.parseLong(cestr.get(j).toString()), this.n, this.private_key);
        destr.append((char)word);//在被选元素的结尾插入指定内容
      }
      System.out.println("解密后所得的明文为:" +destr);

  }
  public static void main(String[] args)  {
      try {
       
         int i;
       for(i=0;i<10;i++){
       RSA t = new RSA();
          t.pq();
          t.getPublic_key();
          t.getPrivate_key();
          t.jmjm();
       }
       
      }catch(Exception ex) {
          System.out.println(ex.getMessage());
      }
  }
}

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值