java处理加密文件---实现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=2;i<=k;i++)
{
if((t%i)==0)
{
flag = false;
break outer;
}
}
return flag;
}
//输入PQ
public void inputPQ()throws Exception
{
do{
System.out.println("请输入素数p: ");
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
String br=stdin.readLine();
this.p=Integer.parseInt(br);
}
while(!primenumber(this.p));
do{
System.out.println("请输入素数q: ");
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
String br=stdin.readLine();
this.q=Integer.parseInt(br);
}
while(!primenumber(this.q));
this.n=this.p*this.q;
this.m=(p-1)*(q-1);
System.out.println("这两个素数的乘积为p*q:"+this.n);
System.out.println("所得的小于N并且与N互素的整数的个数为m=(p-1)(q-1):"+this.m);
}
//求最大公约数
public long gcd(long a,long b)
{
long gcd;
if(b==0)
gcd=a;
else
gcd=gcd(b,a%b);
System.out.println("gcd:"+gcd);
return gcd;
}
//输入公匙
public void getPublic_key()throws Exception
{
do{
System.out.println("请输入一个公钥的值,这个值要求小于m并且和m互质: ");
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
String br=stdin.readLine();
this.public_key=Long.parseLong(br);
}while((this.public_key >= this.m) || (this.gcd(this.m,this.public_key)!=1));
System.out.println("公钥为:"+this.public_key);
}
//计算得到密匙
public void getPrivate_key()
{
long value=1;
outer:for(long i=1;;i++)
{
value=i*this.m+1;
System.out.println("value: "+value);
if((value%this.public_key==0)&& (value/this.public_key < this.m))
{
this.private_key=value/this.public_key;
break outer;
}
}
System.out.println("产生的一个私钥为:"+this.private_key);
}
//输入明文
public void getText()throws Exception
{
System.out.println("请输入明文:");
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
String br=stdin.readLine();
this.text=Long.parseLong(br);
}
//加密、解密计算
public long colum(long y,long n,long key)
{
long mul;
if(key==1)
mul=y%n;
else
mul=y*this.colum(y,n,key-1)%n;
return mul;
}
//加密后解密
public void pascolum()throws Exception
{
this.getText();
System.out.println("输入明文为: "+this.text);
//加密
this.secretword=this.colum(this.text,this.n,this.public_key);
System.out.println("所得的密文为:"+this.secretword);
//解密
this.word=this.colum(this.secretword,this.n,this.private_key);
System.out.println("解密后所得的明文为:"+this.word);
}
public static void main(String []args)throws Exception
{
Rsa t = new Rsa();
t.inputPQ();
t.getPublic_key();
t.getPrivate_key();
t.pascolum();
}
}
3试验介绍
2.1输入PQ,计算m、n
3.2输入公匙,产生密匙
3.3输入明文,产生密文,并解密
此处时间限制,明文暂时用个数字代替,有兴趣的可以改变程序,变成一段数字
请输入素数p:
23
请输入素数q:
29
这两个素数的乘积为p*q:667
所得的小于N并且与N互素的整数的个数为m=(p-1)(q-1):616
请输入一个公钥的值,这个值要求小于m并且和m互质:
611
gcd:1
gcd:1
gcd:1
gcd:1
公钥为:611
产生的一个私钥为:123
请输入明文:
311
输入明文为: 311
所得的密文为:653
解密后所得的明文为:311
转载于:https://www.cnblogs.com/javaTest/archive/2012/06/20/2589092.html
java处理加密文件---实现RSA算法相关推荐
- 第十九篇:JAVA加密解密之RSA算法
RSA算法简介 RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.1987年首 ...
- java pdf加密文件,java使用itext为pdf文件设置密码保护
我们可以使用itext的PdfWriter类的setEncryption方法来为pdf文件设置密码 package com.open.pdf; import java.io.File; import ...
- java exchange 数字证书认证_java处理加密文件---数字证书文件格式(cer和pfx)的区别 - 数安时代(GDCA)SSL证书官网...
java处理加密文件中常见的两种数字证书文件格式(cer和pfx) 数字证书文件格式(cer和pfx)的区别 1.带有私钥的证书 由Public Key Cryptography Standards ...
- RSA算法以及所涉及的数论定理的简单证明
理解RSA算法需要了解的数论定理全家桶 前言 "≡\equiv≡"符号的使用和模运算的规律简述 RSA算法 RSA算法的加密解密过程 RSA算法的加密解密实例 RSA算法的证明 欧 ...
- Java代码实现非对称加密RSA算法示例
非对称加密:有两把密钥:使用公钥加密,必须使用私钥解密:或者使用私钥加密,必须使用公钥解密 加解密核心类:Cipher 下面代码是使用RSA算法加解密的一个示例,实现过程包括:生成密钥对,把公钥和私钥 ...
- Java DES、AES、RSA、DM5读取文件加密解密
//下面代码是直接读取文件来进行加密解密,算法文件 package Test; import javax.crypto.KeyGenerator; import javax.crypto.Cipher ...
- golang通过RSA算法生成token,go从配置文件中注入密钥文件,go从文件中读取密钥文件,go RSA算法下token生成与解析;go java token共用
RSA算法 token生成与解析 本文演示两种方式,一种是把密钥文件放在配置文件中,一种是把密钥文件本身放入项目或者容器中. 下面两种的区别在于私钥公钥的初始化, init方法,需要哪种取哪种. 通过 ...
- 数据传输加密——非对称加密算法RSA+对称算法AES(适用于java,android和Web)
本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 转载请注明出处:http://blog.csdn.net/chay_chan/article/details/58605605 数据 ...
- JAVA RSA算法加密实现 eclipse
RSA算法加密实现 一.实验目的 学习经典的RSA公钥加密算法的基本原理和特点,能够编写简单的代码实现RSA公钥加密和私钥解密的过程. 二.实验要求 1. 熟悉RSA公私钥加密算法. 2. 掌握如何使 ...
最新文章
- Visual Studio中的《C# 语言规范》
- 2017年云栖大会-云HBase专场会后资料-欢迎扩散
- 乌兰浩特市大数据平台助力就业脱贫
- 小程序首页获取数据给数组赋值,实现加载更多,以及遇到的坑
- dart参数传方法_为 JavaScript 开发人员准备的 Dart 参考教程
- 开始写博客,毕业一年的收获
- koa --- 监听路由,并使用模板引擎渲染显示
- mysql进阶3_MySQL进阶
- 给你安利一款国产良心软件uTools
- mysql简单增删改查(CRUD)
- centos 如何测udp端口是否开放_如何测试端口通不通(四种方法)
- 网页版数据库管理工具
- php里面像素怎么表示,php检索图片像素最接近的色值位置
- 构建一个 CLI 工具
- 思科PC远程控制交换机和路由器
- 找工作需要有工作经验,而没工作就没工作经验。如何理解这种死循环?
- Element ui 组件中用键盘事件
- 第七期 | 网约车司机的“捞偏门”手段:作弊抢单、空跑刷单
- kotlin(java) 文件压缩
- revit建模中复合墙与叠层墙区别?Revit中怎么创建叠层墙?
热门文章
- android怎么看错误日志,android运行错误日志帮看下 不懂啊
- easymock接口模拟_EasyMock部分模拟
- android mvvm_Android MVVM设计模式
- 三元运算符和if else_PHP If-Else,Switch Case和速记三元运算符示例
- scala面试问题_Scala高级面试问答
- Java软件开发中,常用的工具有哪些?
- 学好C++能够从事哪些岗位?
- C++基础教程之数据结构
- 想做C++软件开发工程师,我该如何去学习?
- Java基础篇:构造函数