Rsa加密解密算法java

import java.io.*;//输入输出

import java.util.*;//Scanner,Random

import java.math.*;//bigintger


public class Rsa{
    public static void main(String[] args) {
        int num1=0,num2=0,e=0,p=1;//num1,num2两个素数,e公匙,p明文
        while(true){
        Scanner cin = new Scanner(System.in);

        System.out.println("请输入两个素数");
        num1=cin.nextInt();//输入两个数
        num2=cin.nextInt();

         System.out.println("请输入原文");
         p =cin.nextInt();

         System.out.println("密文:"+doEcryption(p,num1,num2));
         System.out.println("原文:"+doDecryption(p,num1,num2));
        }


    }

    public static BigInteger doEcryption(int p,int first,int second){
    
    int n=0,d=0,n1,size=0,e=0;//n就是n=p*q,d密匙,c密文。n1欧拉值,e密匙
    int [] arr=new int[100];//素数数组
    BigInteger c = BigInteger.valueOf(1);//c密文
    BigInteger p1 = BigInteger.valueOf(p);//p1是p(明文)的BigInteger版
    n1=(first-1)*(second-1);//欧拉值
     n=first*second;
     BigInteger n2 = BigInteger.valueOf(n);//n2是n的BigInteger版
    boolean isPrime;  
    //是素数,写入数组
    for (int i = 2; i < n1; i++) {  
        isPrime = true;  
        for (int j = 2; j < i; j++) {  
            //若能除尽,则不为素数  
            if ((i % j) == 0) {  
                isPrime = false;  
                break;  
            }  
        }  
        //如果是素数,则写入数组
        if (isPrime) {  
        arr[size]=i;
        size++;//数组地址加一
            
        }  
    }
    /*for(int k=1;k<size;k++)
        System.out.print(arr[k]+" 0 ");*/

        Random random = new Random();//随机数

        int s = random.nextInt(size-1);//生成0-size-1之间数
        e=arr[s];//取素数赋值给e

 System.out.println("加密密匙{"+e+" "+n+"}");
    n=first*second;//n

    for(int i=0;i<e;i++)//c=p^e
        c=c.multiply(p1);//p1明文
        c=c.mod(n2);//加密算法c=p^e%n
    return c;

    }

    public static BigInteger doDecryption(int p,int first,int second){
    int n=0,d=0, i=1,n1;//n就是n=p*q,d密匙,i变量。n1欧拉值
    n1=(first-1)*(second-1);//欧拉值
    boolean flag=true;//判断5*d=96*x+1中x要用
    BigInteger p1 = BigInteger.valueOf(p);//int p(明文) 赋值BigInteger p1
  
    n=first*second;//n
    BigInteger n2 = new BigInteger("" + n);//n赋值n2 int强转BigInteger
    
    BigInteger c = BigInteger.valueOf(1);//密文c初始化1

    while(flag)//找5*d=96*x+1中的x
    {
        if((96*i+1)%5==0)
        {
            d=(96*i+1)/5;//5*d=96*x+1公式算d
            flag=false;

        }
        else

            i++;
    }
    System.out.println("解密密匙{"+d+" "+n+"}");

    for( i=0;i<d;i++)
    {
        p1=p1.multiply(c);//p=c^d
        
    }
    p1=p1.mod(n2);//解密公式p=c^d%n
    return p1;
   }
}

转载于:https://my.oschina.net/u/3760042/blog/1595783

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值