首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Eclipse开发 >

写了一个用RAS算法获取密钥,求改正,该怎么处理

2012-04-25 
写了一个用RAS算法获取密钥,求改正运行完就卡死,好像死循环,求更正public class RSA {public static class

写了一个用RAS算法获取密钥,求改正
运行完就卡死,好像死循环,求更正

public class RSA {

public static class getNumbers{
int p,q,e,d;
int n,a ;


public void getPrimerPQ(){
boolean pp,qq;
p=(int)(Math.random()*10);/*生成两个素数p,q*/
pp=judge(p);
while(pp==false){
p=(int)(Math.random()*10);
pp=judge(p);
}
q=(int)(Math.random()*10);
qq=judge(q);
while(qq==false){
q=(int)(Math.random()*10);
qq=judge(q);
}

}  
public void getN(){ /*生成n,e*/
n=p*q;
boolean ee;
a=(p-1)*(q-1);
e=(int)(Math.random()*10);
ee=huzhi(a,e);
while(ee==false){
e=(int)(Math.random()*10);
}

d=e-1%a;

}

public boolean judge (int m){ /*判断两个数是不是素数*/
boolean tag=true;
 
for(int i=m-1;i>1;i--)
if(m%i==0)
tag=false;
 
return tag;
 
}

public boolean huzhi(int a,int e){/*判断两个数是不是互质数*/
boolean F=false;
int i=0;
while(a>0&&e>0){
if(a>e) a=a-e;
else
e=e-a;

}
i=a+e;
if(i==1) F=true;

return F;


}


}
public static void main(String agv[]){
getNumbers tt=new getNumbers();
tt.getPrimerPQ();
tt.getN();
System.out.println(tt.p);
System.out.println(tt.q);
System.out.println(tt.e);
System.out.println(tt.d);
}

}


[解决办法]
import java.math.BigInteger;
 
/**
 * 
 * @author FJC 2012/04/20
 * 
 * 
 */
 
public class SimpleRSA {

/**
* ci = mi^e ( mod n ) 
* 20120420
* @param data
* @param n
* @param e
* @return
*/
public static BigInteger encrypt(BigInteger data,BigInteger n,int e){
data = data.pow(e);
return data.remainder(n);
}

public static int encrypt(int data,int n,int e){
return encrypt(BigInteger.valueOf(data),new BigInteger(n+""),e).intValue();
}

/**
* mi = ci^d ( mod n ) 
* 20120420
* @param data
* @param n
* @param d
* @return
*/
public static BigInteger decrypt(BigInteger data,BigInteger n,int d){
data = data.pow(d);
return data.remainder(n);
}

public static int decrypt(int data,int n,int d){
return encrypt(BigInteger.valueOf(data),BigInteger.valueOf(n),d).intValue();
}
 
public static void main(String agv[]) {
RSAInit rsaInit = new RSAInit();
rsaInit.init();

System.out.println("e="+rsaInit.e);
System.out.println("d="+rsaInit.d);
System.out.println("n="+rsaInit.n);

String str="This is a test!";
System.out.println("明文为:\n"+str);
System.out.println("密文为:");
 
int [] MM=new int[str.length()];
for(int i=0;i<str.length();i++){ 
MM[i]=encrypt((int)str.charAt(i),rsaInit.n,rsaInit.e);
System.out.print(MM[i]+" ");
}
int []NN=new int[str.length()];
System.out.println("");
System.out.println("解密后:");
for(int i=0;i<str.length();i++){
NN[i]=decrypt(MM[i],rsaInit.n,rsaInit.d); 
System.out.print((char)NN[i]);


}
}
 
}
 
class RSAInit {
private int p, q;
int e, d;
int n, a;
 
//the range of p,q
//p*q>=2^8(一个字节单元)
int rangeMin = 20;
int rangeMax = 100;
 
public void getPrimerPQ() {
boolean pFlag, qFlag;
// 生成两个不同的素数p,q 
p = (int)((rangeMax-rangeMin)*Math.random()+rangeMin);
pFlag = isPrime(p);
while (pFlag == false) {
p = (int)((rangeMax-rangeMin)*Math.random()+rangeMin);
pFlag = isPrime(p);
}
q = (int)((rangeMax-rangeMin)*Math.random()+rangeMin);
qFlag = isPrime(q);
while (qFlag == false||q == p) {
q = (int)((rangeMax-rangeMin)*Math.random()+rangeMin);
qFlag = isPrime(q);
}
System.out.println("p-1="+(p-1)+" q-1="+(q-1)+" a="+(p-1)*(q-1));
}

/**
* 生成n,e,d
*/
public void getNED() { 
n = p*q;
boolean ee;
a = (p-1)*(q-1);
//1<e<a
e = (int)(Math.random() * a);
ee = primeTwo(a, e);
while (ee == false) {
e = (int)(Math.random() * a);
ee = primeTwo(a, e);
}
d = getD(e, a);
 
}
 
/**
* e×d ≡ 1 mod (p-1)*(q-1) 20120415

* @param e
* @param a
* @return d
*/
public int getD(int e, int a) {
// System.out.println(p+" "+q+" "+e);
for (int i=1;; i++) {
if (i*e%a == 1)
return i;
}
}
 
/**
* 判断是不是素数
* @param m
* @return
*/
public boolean isPrime(long m) { 
boolean flag = true;
if (m == 0 || m == 1)
flag = false;
 
for (long i = m - 1; i > 1; i--)
if (m % i == 0)
flag = false;
 
return flag;
 
}
 
/**
* 判断两个数是不是互质
* @param a
* @param e
* @return
*/
public boolean primeTwo(int a, int e) {
boolean flag = false;
int i = 0;
while (a > 0 && e > 0) {
if (a > e)
a = a - e;
else
e = e - a;
 
}
i = a + e;
if (i == 1)
flag = true;
 
return flag;
 
}

/**
* 生成 密钥
*/
public void init(){
getPrimerPQ();
getNED();
}
 
}

热点排行