《算法概论》的二次作业之编程

编程要求:实现RSA算法(书籍P40)
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,需要星期五老师指导后进行修改。 未完待续......



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值