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

来源:互联网 发布:卡特里娜飓风 知乎 编辑:程序博客网 时间:2024/05/07 09:51
编程要求:实现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,需要星期五老师指导后进行修改。 未完待续......



0 0
原创粉丝点击