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进度条源码下载—js进度条代码
现在很多网站会用到进入网站特效,到网页没有加载完成的时候,会有一个loding特效,加载完了之后才能看到页面,今天就带着做一个js进度条效果,今天要做的效果是纯js进度条加载,没有用到框架,方便大家进 ...
- DataPipeline丨LinkedIn元数据之旅的最新进展—Data Hub
作者:Mars Lan, Seyi Adebajo, Shirshanka Das 译者: DataPiepline yaran 作为全球最大的职场社交平台,LinkedIn的数据团队不断致力于扩展其 ...
- python基础-os模块
os 模块 功能:与操作系统交互的模块 使用方式:import os 常用的几种功能 os.path.dirname(文件名) 用于获取当前文件的所在目录 import os # 获取当前文件的所在目 ...
- 【Python】列表推导式
1. 列表推导式 list1 = [1, 3, 5, 6, 8] list2 = [x * 2 for x in list1] print(list2) # [2, 6, 10, 12, 16]
- python工程化最佳实践
1.pipenv 真实环境 vs virtualenv vs pipenv 2.自定义用户模型 继承BaseUserManager和AbstractBaseUser,在settings中指定AUTH_ ...
- Odoo Qweb语法
转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826202.html 一:简介 QWeb是一个基于xml的模板引擎,用于生成HTML片段和页面. 模板指令 ...
- 微服务框架---搭建 go-micro环境
1.安装micro 需要使用GO1.11以上版本 #linux 下 export GO111MODULE=on export GOPROXY=https://goproxy.io # windows下 ...
- U盘启动安装CentOS 7出现 -dracut initqueue timeout
使用U盘启动安装CentOS7出现 Warning: dracut-initqueue timeout - starting timeout scripts 的解决办法 原因: ISO下,在/isol ...
- Unity 渲染教程(二):着色器基础
转载:https://www.jianshu.com/p/7db167704056 这是关于渲染基础的系列教程的第二部分.这个渲染基础的系列教程的第一部分是有关矩阵的内容.在这篇文章中我们将编写我们的 ...
- Linq入门学习
千万别被这个页面的滚动条吓到!!! 我相信你一定能在30分钟之内看完它!!! 在说LINQ之前必须先说说几个重要的C#语言特性 一:与LINQ有关的语言特性 1.隐式类型 (1)源起 在隐式类型出现之 ...