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 ...
随机推荐
- CSS3 弹性盒布局
一.伸缩布局 CSS3 在布局方面做了非常大的改进,使得我们对块级元素的布局排列变得十分灵活,适应性非常强,其强大的伸缩性,在响应式开中可以发挥极大的作用. 二.定义 Flexbox 语法格式: di ...
- 英特尔加速 Android 应用
下载地址 https://software.intel.com/zh-cn/android https://github.com/intel/haxm 解压目录 双击.exe,安装即可 检查SDK M ...
- Android中自定义环形图2
如图: 自定义属性,在values文件夹下创建 attrs.xml <?xml version="1.0" encoding="utf-8"?> & ...
- Tachyon内存文件系统快速入门
一.简介 Tachyon是介于磁盘存储和计算框架之间的一种中间件,用于实现分布式的内存文件读写等功能,实现分布式集群内部共享数据. 应用实例: 二.架构 1.心跳机制 在Tachyon中,心跳用于Ma ...
- fastjson 将json字符串转化成List<Map<String, Object>>
亲测可行,如下: JSON.parseObject(jsonstr, new TypeReference<List<Map<String, Object>>>() ...
- Haproxy 让后端RS记录真实IP
一.修改haproxy.cfg配置文件,在defaults中加入如下两行,并重启haproxy. vim /etc/haproxy/haproxy.cfg defaults option http-s ...
- Vue基本用法
在学习Vue的基本用法之前,我们先简单的了解一些es6的语法 let: 特点:1.局部作用域 2.不会存在变量提升 3.变量不能重复声明 const: 特点:1.局部作用域 2.不会存在变量提升 3. ...
- 学习:费马小定理 & 欧拉定理
费马小定理 描述 若\(p\)为素数,\(a\in Z\),则有\(a^p\equiv a\pmod p\).如果\(p\nmid a\),则有\(a^{p-1}\equiv 1\pmod p\). ...
- 查看服务器被访问最大的ip
网站有时会很卡,可以先看看哪些ip访问最多,一行命令就可以列出来,如下所示 netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c ...
- The Best Open Source Game Engine: In Search Of Perfection
https://www.greatsoftline.com/the-best-open-source-game-engine-in-search-of-perfection/ The game eng ...