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数组
成功~~
五、码云链接
RSA算法java实现(BigInteger类的各种应用)的更多相关文章
- 算法笔记--java的BigInteger类及BigDecimal类
引包:import java.math.*; BigInteger类: 可以使用构造方法:public BigInteger(String val),或者valueOf(int)函数,如: BigIn ...
- java基础-BigInteger类常用方法介绍
java基础-BigInteger类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.BigInteger类概述 Java中long型为最大整数类型,对于超过long ...
- Java学习——BigInteger类和BigDecimal类
Java学习——BigInteger类和BigDecimal类 摘要:本文主要学习了用于大数字运算的BigInteger类和BigDecimal类. 部分内容来自以下博客: https://www.c ...
- AES算法,DES算法,RSA算法JAVA实现
1 AES算法 1.1 算法描述 1.1.1 设计思想 Rijndael密码的设计力求满足以下3条标准: ① 抵抗所有已知的攻击. ② 在多个平台上速度快,编码紧凑. ③ 设计 ...
- Java API —— BigInteger类
1.BigInteger类概述 可以让超过Integer范围内的数据进行运算 2.构造方法 public BigInteger(String val) 3.BigInteger类 ...
- 解析java.math.BigInteger类——构造函数
最早由于做作业,结识了java的BigInrger类.读着读着,越来越觉得有趣.后来作业做完,也不忍丢下它,索性把全部代码研究一遍. 开始的时候,一个上午时间最多读懂2个方法.但是还是有滋有味的坚持了 ...
- 【搬运】Tea算法Java实现工具类
最近在做数据加密,目标是实现平台app的数据安全性,所以准备使用AES+Base64进行加密,适逢一个特长的json串AES加密不了,于是在谷歌了各种算法,判断是否合用,参见 各种加密算法比较 一文中 ...
- RSA算法 Android JAVA C#互通
RSA算法属非对称加密算法,在实际使用中,往往客户端使用公钥进行加密传递敏感数据,服务端server使用私钥进行解密,这样防止中间人从网络获取敏感数据的明文. Android端主要代码如下: pack ...
- 重复造轮子之RSA算法(一) 大素数生成
出于无聊, 打算从头实现一遍RSA算法 第一步, 大素数生成 Java的BigInteger里, 有个现成的方法 public static BigInteger probablePrime(int ...
随机推荐
- js设置全局变量与读取全局变量
方法1: 设置: var a = 1; 读取: a window.a window['a'] 方法2: 设置: window.b=2; 读取: b window.b window['b'] 方法3: ...
- Android源码分析(三)-----系统框架设计思想
一 : 术在内而道在外 Android系统的精髓在源码之外,而不在源码之内,代码只是一种实现人类思想的工具,仅此而已...... 近来发现很多关于Android文章都是以源码的方向入手分析Androi ...
- Java 8中的Base64编码和解码
转自:https://juejin.im/post/5c99b2976fb9a070e76376cc Java 8会因为将lambdas,流,新的日期/时间模型和Nashorn JavaScript引 ...
- mac php Swoole入门
一. swoole 扩展安装 安装前必须保证系统已经安装了下列软件 php-7.0 或更高版本 gcc-4.8 或更高版本 make autoconf pcre (CentOS系统可以执行命令:yum ...
- Django 之 rest_framework 分页器使用
Django rest_framework 之分页器使用以及其源码分析 三种分页方式: 常规分页 -->PageNumberPagination 偏移分页 -->LimitOffsetPa ...
- 树莓派无显示屏连接wifi
在烧好Raspbian系统的TF卡boot分区新建 wpa_supplicant.conf 文件,内容如下(修改自己的WIFI名和密码,key_mgmt根据路由器配置),保存后启动树莓派即可自动连接W ...
- Anaconda安装、更新第三方包
conda和pip简介 conda conda是包及其依赖项和环境的管理工具. 适用语言:Python, R, Ruby, Lua, Scala, Java, JavaScript, C/C++, F ...
- P4281 [AHOI2008]紧急集合 / 聚会[LCA]
解析 蒟蒻用的办法比较蠢,不如上面的各位大佬,直接化成一个式子了,我还是分类讨论做的. 下面正文. 猜想:最优集合点一定是三点任意两对点对应的路径的交点. 不妨这样想,如果任意两个人经过同一条路径,那 ...
- 缺jar包异常:java.lang.NoClassDefFoundError: org/springframework/core/convert/support/PropertyTypeDescriptor
严重: StandardWrapper.Throwable java.lang.NoClassDefFoundError: org/springframework/core/convert/suppo ...
- springMVC中的日期格式的转化
一.jsp页面传递到controller的日期 如果实体类中封装的日期类型为Date,而jsp页面中的传来的为string类型,这个时候后台就会报错,出现400错误,原因是前后端的数据类型不一致.要将 ...