zoukankan      html  css  js  c++  java
  • RSA算法java实现(BigInteger类的各种应用)

    一、RSA算法

    1.密钥生成

    • 随机生成两个大素数p、q
    • 计算n=p*q
    • 计算n的欧拉函数f=(p-1)*(q-1)
    • 选取1<e<f,使e与f互素
    • 计算d,ed=1modf
    • 公钥为(e,n),私钥为(d,n)

    2.加密

    • c=m^e mod n

    3.解密

    • m=c^e mod n

    二、BigInteger类(大数)

    • 定义:
    BigInteger b=new BigInteger("1"); 
    
    • 将其他类型变量转化为BigInteger变量
    BigInteger b=BigInteger.valueof(1);
    
    • 随机生成大素数
    BigInteger bigInteger = BigInteger.probablePrime(2048, r);    //随机生成2048位的大素数,r为Random变量
    
    • 素性检验(米勒罗宾检验)
    boolean a = b.isProbablePrime(256);    //b是素数的概率为1 - 1 / 2^256
    
    • 四则运算
    BigInteger a,b,c;
    c=a.add(b);   //加
    c=a.subtract(b);  //减
    c=a.multiply(b);  //乘
    c=a.divide(b);  //除
    
    • 最大公因子
    BigInteger a,b,c;
    c=a.gcd(b);
    
    • 取余
    BigInteger a,b,c;
    c=a.remainder(b);
    
    • 次方模(a^b mod m)
    BigInteger a,b,c;
    c=a.modPow(b,m);
    

    三、算法实现

    1.两个大素数的生成

    • 构建Big类,随机生成大素数,并进行素性检验

    2.公钥生成

    • 寻找与f互素的公钥e(1<e<f)

    3.私钥生成

    • 利用欧几里得算法(辗转相除法),列表,计算e模f的逆d

    4.获取密钥

    • 在Keys类中将公钥、私钥输出到文件

    5.加密

    (1)从文件逐行读取明文、公钥

    (2)使用getByte()将明文转化为byte数组

    (3)依次计算c=m^e mod n

    (4)将结果逐行输出到文件

    6.解密

    (1)从文件逐行读取密文、私钥

    (2)读入密文的同时计算m=c^d mod n,并将其存入byte数组

    (3)将byte数组还原为字符串(明文)

    (4)输出明文到文件

    四、遇到的问题和解决方法

    问题1:加密时不知道如何将明文转化为可用于加密的数字

    解决1:纠结了好久,想到看书时看到过的getByte()方法可以将字符串转化为byte数组

    问题2:解密时,出现了以下问题

    解决2:这个错误还没法调试,检查了好久,发现自己计算公钥e的时候模的是n,修改了成模f后,解决了该问题

    问题3:之后,解密出来的文件还是有问题

    解决3:调试后,发现自己犯了很蠢的错误,我把int i=0放在了while 循环里,每次循环都会把i置1...

    问题4:然后,输出还是有问题,后面会多一些空格

    解决4:增加一个与明文长度等长的byte数组

    成功~~

    五、码云链接

  • 相关阅读:
    最小的k个数
    数组中出现次数超过一半的数字
    字符串的排列
    二叉搜索树与双向链表
    复杂链表的复制
    二叉树中和为某一值的路径
    centos7安装wrk
    【胡思乱想】JNI与线程池的维护
    【胡思乱想】命令模式中,命令对象如何解耦Invoker和Receiver
    【胡思乱想】命令模式 与 Thread Runnable
  • 原文地址:https://www.cnblogs.com/wyf20175217/p/10886124.html
Copyright © 2011-2022 走看看