java rsa biginteger_RSA算法java实现(BigInteger类的各种应用)

一、RSA算法

1.密钥生成

随机生成两个大素数p、q

计算n=p*q

计算n的欧拉函数f=(p-1)*(q-1)

选取1

计算d,ed=1modf

公钥为(e,n),私钥为(d,n)

2.加密

c=m^e mod n

3.解密

m=c^e mod n

a9c9d6ee7d47aa95ac4e2a8db0ce5b7c.png

二、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类,随机生成大素数,并进行素性检验

1a9d0cffc3fc3585163e81f576c12dd3.png

2.公钥生成

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

d36d75b71f72a52f73f4f08eaf6c5efa.png

3.私钥生成

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

6a635a835bdd84415c034f1835259a72.png

c1938a0c5282cad17427d8586af1b6a5.png

4.获取密钥

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

728fdf5b5a771cb2e144e3bd08a97361.png

5.加密

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

5f9f355bd4ef09d751ecfcb19779550d.png

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

2a7c50eeb601e4c5d2dcde159bfe800a.png

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

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

8908dc90bd3170426a4a0b3ef5ae31c3.png

6.解密

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

f71b6031f45fd80c8c75f98044a184f3.png

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

8a458b8f3f5a9a508040e0eaa86c0956.png

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

8d77efaa9287377ac0cb6770738a23a5.png

(4)输出明文到文件

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

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

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

762bceac2dfbb6b3232025d3b37b920f.png

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

b7afca933b60725391ef7cefff545f37.png

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

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

76f44c62037b47bd9a54a6179309d6f0.png

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

85a0ba314fb50cf648ea22f5db0de7ec.png

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

188168cacd20de3573da41af94d3e7a9.png

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

c2c34b992ba6159d5e50ee86d6dc79f9.png

成功~~

e1f1cdc015cc74613dafdd7bc7cd8096.png

五、码云链接

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值