热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

javarsa加密文件_java处理加密文件实现RSA算法

1RSA算法的原理如下:1.1原理假设我们需要将信息从机器A传到机器B,首先由机器B随机确定一个Key,我们称之为密匙private_ke

1  RSA算法的原理如下:

1.1原理

假设我们需要将信息从机器A传到机器B,首先由机器B随机确定一个Key,我们称之为密匙private_key,将这个可KEY始终保存在机器B中而不发出来;然后,由这个private_key计算出另一个Key,我们称之为公匙Public_key。这个Public_key的特性是几乎不可能通过该Key计算生成它的private_key。接下来通过网络把这个Public_key传给机器A,

机器A受到Public_key后,利用该key,将信息加密,并把加密后的信息通过网络发送到机器B,最后机器B利用已知的private_key,就可以解开加密信息。

1.2步骤

RSA算法的安全性依赖于大数因数分解的困难性。公匙和私匙都是两个大素数的函数。

1.2.1

首先选择两个大素数p、q,计算n=p*q; m=(p-1)*(q-1);

1.2.2

而后随机选择加密密匙Public_key,要求和m互质,比如Public_key=m-1;

1.2.3

利用欧几里德算法计算解密密匙private_key,使private_key满足

Public_key*private_key三1(mod m)

其中Public_key,n是公匙,private_key是密匙

1.2.4

加密信息text时,利用公式secretword=text^Public_key (mod n)得到密文secretword

1.2.5

解密时利用公式word=text^private_key(mod n)得到原文word=text.。

2程序

本算法用JAVA编程语言实现,开发环境为Eclipse

//BJTU 软件0404

import java.io.*;

public class Rsa

{

private int p=0;

private int q=0;

private long n=0;

private long m=0;

private long public_key=0;//公匙

private long private_key=0;//密匙

private long text=0;//明文

private long secretword=0;//密文

private long word=0;//解密后明文

//判断是否为素数

public boolean primenumber(long t)

{

long k=0;

k=(long)Math.sqrt((double)t);

boolean flag=true;

outer:for(int i&#61;2;i<&#61;k;i&#43;&#43;)

{

if((t%i)&#61;&#61;0)

{

flag &#61; false;

break outer;

}

}

return flag;

}

//输入PQ

public void inputPQ()throws Exception

{

do{

System.out.println("请输入素数p: ");

BufferedReader stdin&#61;new BufferedReader(new InputStreamReader(System.in));

String br&#61;stdin.readLine();

this.p&#61;Integer.parseInt(br);

}

while(!primenumber(this.p));

do{

System.out.println("请输入素数q: ");

BufferedReader stdin&#61;new BufferedReader(new InputStreamReader(System.in));

String br&#61;stdin.readLine();

this.q&#61;Integer.parseInt(br);

}

while(!primenumber(this.q));

this.n&#61;this.p*this.q;

this.m&#61;(p-1)*(q-1);

System.out.println("这两个素数的乘积为p*q&#xff1a;"&#43;this.n);

System.out.println("所得的小于&#xff2e;并且与&#xff2e;互素的整数的个数为m&#61;(p-1)(q-1)&#xff1a;"&#43;this.m);

}

//求最大公约数

public long gcd(long a,long b)

{

long gcd;

if(b&#61;&#61;0)

gcd&#61;a;

else

gcd&#61;gcd(b,a%b);

System.out.println("gcd:"&#43;gcd);

return gcd;

}

//输入公匙

public void getPublic_key()throws Exception

{

do{

System.out.println("请输入一个公钥的值&#xff0c;这个值要求小于m并且和m互质&#xff1a; ");

BufferedReader stdin&#61;new BufferedReader(new InputStreamReader(System.in));

String br&#61;stdin.readLine();

this.public_key&#61;Long.parseLong(br);

}while((this.public_key >&#61; this.m) || (this.gcd(this.m,this.public_key)!&#61;1));

System.out.println("公钥为&#xff1a;"&#43;this.public_key);

}

//计算得到密匙

public void getPrivate_key()

{

long value&#61;1;

outer:for(long i&#61;1;;i&#43;&#43;)

{

value&#61;i*this.m&#43;1;

System.out.println("value:  "&#43;value);

if((value%this.public_key&#61;&#61;0)&& (value/this.public_key 

{

this.private_key&#61;value/this.public_key;

break outer;

}

}

System.out.println("产生的一个私钥为&#xff1a;"&#43;this.private_key);

}

//输入明文

public void getText()throws Exception

{

System.out.println("请输入明文&#xff1a;");

BufferedReader stdin&#61;new BufferedReader(new InputStreamReader(System.in));

String br&#61;stdin.readLine();

this.text&#61;Long.parseLong(br);

}

//加密、解密计算

public long colum(long y,long n,long key)

{

long mul;

if(key&#61;&#61;1)

mul&#61;y%n;

else

mul&#61;y*this.colum(y,n,key-1)%n;

return mul;

}

//加密后解密

public void pascolum()throws Exception

{

this.getText();

System.out.println("输入明文为: "&#43;this.text);

//加密

this.secretword&#61;this.colum(this.text,this.n,this.public_key);

System.out.println("所得的密文为&#xff1a;"&#43;this.secretword);

//解密

this.word&#61;this.colum(this.secretword,this.n,this.private_key);

System.out.println("解密后所得的明文为&#xff1a;"&#43;this.word);

}

public static void main(String []args)throws Exception

{

Rsa t &#61; new Rsa();

t.inputPQ();

t.getPublic_key();

t.getPrivate_key();

t.pascolum();

}

}

3试验介绍

2.1输入PQ&#xff0c;计算m、n

3.2输入公匙&#xff0c;产生密匙

3.3输入明文&#xff0c;产生密文&#xff0c;并解密

此处时间限制&#xff0c;明文暂时用个数字代替&#xff0c;有兴趣的可以改变程序&#xff0c;变成一段数字

请输入素数p:

23

请输入素数q:

29

这两个素数的乘积为p*q&#xff1a;667

所得的小于&#xff2e;并且与&#xff2e;互素的整数的个数为m&#61;(p-1)(q-1)&#xff1a;616

请输入一个公钥的值&#xff0c;这个值要求小于m并且和m互质&#xff1a;

611

gcd:1

gcd:1

gcd:1

gcd:1

公钥为&#xff1a;611

产生的一个私钥为&#xff1a;123

请输入明文&#xff1a;

311

输入明文为: 311

所得的密文为&#xff1a;653

解密后所得的明文为&#xff1a;311



推荐阅读
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 生成对抗式网络GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
    一、GAN原理介绍学习GAN的第一篇论文当然由是IanGoodfellow于2014年发表的GenerativeAdversarialNetworks(论文下载链接arxiv:[h ... [详细]
  • 本文详细介绍了相机防抖的设置方法和使用技巧,包括索尼防抖设置、VR和Stabilizer档位的选择、机身菜单设置等。同时解释了相机防抖的原理,包括电子防抖和光学防抖的区别,以及它们对画质细节的影响。此外,还提到了一些运动相机的防抖方法,如大疆的Osmo Action的Rock Steady技术。通过本文,你将更好地理解相机防抖的重要性和使用技巧,提高拍摄体验。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
  • 本文总结和分析了JDK核心源码(2)中lang包下的基础知识,包括常用的对象类型包和异常类型包。在对象类型包中,介绍了Object类、String类、StringBuilder类、StringBuffer类和基本元素的包装类。在异常类型包中,介绍了Throwable类、Error类型和Exception类型。这些基础知识对于理解和使用JDK核心源码具有重要意义。 ... [详细]
  • 使用freemaker生成Java代码的步骤及示例代码
    本文介绍了使用freemaker这个jar包生成Java代码的步骤,通过提前编辑好的模板,可以避免写重复代码。首先需要在springboot的pom.xml文件中加入freemaker的依赖包。然后编写模板,定义要生成的Java类的属性和方法。最后编写生成代码的类,通过加载模板文件和数据模型,生成Java代码文件。本文提供了示例代码,并展示了文件目录结构。 ... [详细]
author-avatar
尕心疼TammyY
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有