RSA算法-java
2016-04-13 20:30
393 查看
RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。RSA的算法涉及三个参数,n、e1、e2。其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。 e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。 (n,e1),(n,e2)就是密钥对。其中 (n,e1)为公钥,(n,e2)为私钥。RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e1 mod n;B=A^e2 mod n;e1和e2可以互换使用,即:A=B^e2 mod n;B=A^e1 mod n;
package com.rsa; import java.util.Scanner; public class RSA { public static void main(String[] args) { int p,q,n,e,fn,d=0; int m=0; int c=0; System.out.println("请输入两个素数:"); Scanner in=new Scanner(System.in); p=in.nextInt(); q=in.nextInt(); while(!isSuShu(p)){ System.out.println(p+"不是素数,请重新输入:"); p=in.nextInt(); } while(!isSuShu(q)){ System.out.println(q+"不是素数,请重新输入:"); q=in.nextInt(); } n=p*q; System.out.println("他们的乘积为:n="+n); fn=(p-1)*(q-1); System.out.println("n的欧拉函数为:ψ(n)=(p-1)*(q-1)="+fn); System.out.println("请输入整数e(e<ψ(n)且与ψ(n)互素):"); e=in.nextInt(); while(!isHuSu(e,fn)){ System.out.println(e+"不与fn互素,请重新输入:"); e=in.nextInt(); } d=getEni(e,fn); System.out.println("e的模fn的乘法的逆元素d="+d); System.out.println("请输入一段明文m(m<n):"); m=in.nextInt(); while(m>=n){ System.out.println("m明文不能大于n,请重新输入:"); m=in.nextInt(); } c=jiaMi(m,e,n); System.out.println("用e加密得到密文:"+c); m=jiaMi(c,d,n); System.out.println("用d解密得到明文:"+m); in.close(); } /* * 加密函数 */ public static int jiaMi(int m,int e,int n){ int s,t,u; s=1; t=m; u=e; while(u!=0){ if((u&1)==1) s=(s*t)%n; u>>=1; t=(t*t)%n; } return s; } /* * 求e的逆元素 */ public static int getEni(int e,int fn){ int d=1; while(true){ if((e*d)%fn==1) break; else d++; } return d; } /* * 判断两个数是否互为素数 */ public static boolean isHuSu(int p,int q){ int maxYue=0,lim; lim=Math.min(p, q); for(int i=1;i<=lim;i++){ if(p%i==0&&q%i==0) maxYue=i; } if(maxYue==1) return true; else return false; } /* * 判断素数 */ public static boolean isSuShu(int number){ int sqrt=(int)Math.sqrt(number); int k=0; for(int i=2;i<=sqrt;i++) { if(number%i==0) k++; } if(k==0) return true; else return false; } }
相关文章推荐
- java 中的Exception RuntimeException 区别
- Spring Notes
- javaWeb学习记录:文件上传与下载
- 关于java中的protected一点理解
- 分享我目前做小型web应用程序的包结构
- java中的静态代码块等执行顺序
- SpringMVC核心配置文件
- Java中怎么切换窗口
- java 获取 jar 包内文件列表
- Java中的内部类
- Java静态变量的初始化(static块的本质)
- eclipse设置的断点上有斜线
- 程序猿二三事之工具使用-Eclipse常用快捷键
- struts2中result跳转jsp时路径问题
- Java 压缩zip格式文件
- java的锁机制
- 我所了解的java单例模式
- SpringMVC三大设计原则
- Java虚拟机(JVM)体系结构概述及各种性能参数优化总结
- org.springframework.web.servlet.DispatcherServlet