编程要求:实现RSA算法(书籍P40)
自我感觉已经运用了RSA加密解密的算法,但是没有得到满意的答案。最后解出来的明文不是25,需要星期五老师指导后进行修改。 未完待续......
2.1: 判断一个正整数是否为质数的算法。函数签名如下
int isPrime(long a)
输入:一个长整数a
输出:返回1(为质数),返回0(非质数)
2.2: 随机生成一个n bit位的长整数。函数签名如下
long createRndInteger(int n)
输入:随机数bit位的长度为n(解释:3bit位,则最大为111,最小为100;n bit位,则该数字二进制长度为n)
输出:返回该随机数
2.3:随机生成一个n bit位的长质数。函数前面如下
long createRndPrime(int n)
输入:随机质数的bit位长度为n
输出:nbit位长度的质数
关键为使用随机化算法判断一个长整数是否为素数(P33)。
2.4:公开密钥(N,e)的生成算法。 关键为怎样选择一个与(p-1)(q-1)互质的数e。
2.5:保密密钥(N,d)的生成算法。关键是运用扩展Euclid算法,生成e模(p-1)(q-1)的逆元,见书籍25页。
2.6:RSA加密算法。对消息m=25进行加密,生成密文c。
2.7:RSA解密算法。对密文c进行解密。
/**
* 程序功能:简单的RSA加密算法完成第二次作业编程要求
* 作者:冯得晟
* 时间:2014.03.20
*/
import java.util.Random;
import java.util.Scanner;
public class RasArithmetic {
private long p = 0;
private long q = 0;
private long n = 0;
private long t = 0; // (p-1)*(q-1) 欧拉函数
private long e = 0; // 公匙
private long d = 0; // 密匙
private long c = 0; // 密文
private long a=0; //中间变量
boolean isPrime(long a){
if(a<=2)
return false;
for(long i=2;i<=a/2;++i){ //a不可能被比a/2大的数整除
if(a%i==0){
return false;
}
}
return true;
}
long createRndinteger(long n){
Random rm = new Random();
int b=(int)(Math.pow(2, n)-1); //最大能产生的数值
long sum=rm.nextInt(b); //产生十进制随机数
/*long c=sum;
String a=new String();
do{ //转化为二进制
a=c%2+a;
c=c/2;
}
while(c!=0);
System.out.println(a);*/
return sum;
}
long createRndPrime(long n){
Random r=new Random();
int b=(int)(Math.pow(2, n)-1);
long num;
for(;;){
long c=r.nextInt(b);
if(isPrime(c)){
num=c;
break;
}
}
return num;
}
long mgys(long a,long b){
int c;
while(a%b!=0){
c=(int) b;
b=a%b;
a=c;
}//辗转相除
return b;
}
void addPublic_key(){
p=this.createRndPrime(a);
q=this.createRndPrime(a);
System.out.println("p="+p);
System.out.println("q="+q);
n=p*q;
t=(p-1)*(q-1);
do{
e=(long)(Math.random()*10000);
}
while((e>=t)||(this.mgys(t, e)!=1)||(e<=1));
System.out.println("产生的公钥是"+"("+n+","+e+")");
}
void addPrivate_key(){
long m=1;
for(long j=1;;j++){
m=j*t+1;
if(m%e==0){
d=m/e;
break;
}
}
System.out.println("产生的密钥是"+"("+this.n+","+this.d+")");
}
void encrypt(long word){
long b=(long)(Math.pow(word, e));
long c=b%n;
this.c=c;
System.out.println("产生的密文是:"+c);
}
void discoding(){
long b=(long)(Math.pow(c, d));
long k=b%n;
System.out.println("解密后的明文是:"+k);
}
public static void main(String args[]){
RasArithmetic obj=new RasArithmetic();
Scanner in=new Scanner(System.in);
System.out.println("请输入随机数的位数:");
long a=in.nextLong();
obj.a=a;
obj.addPublic_key();
obj.addPrivate_key();
obj.encrypt(25);
obj.discoding();
}
}
自我感觉已经运用了RSA加密解密的算法,但是没有得到满意的答案。最后解出来的明文不是25,需要星期五老师指导后进行修改。 未完待续......