《算法概论》的二次作业之编程
来源:互联网 发布:卡特里娜飓风 知乎 编辑:程序博客网 时间:2024/05/07 09:51
编程要求:实现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,需要星期五老师指导后进行修改。 未完待续......
0 0
- 《算法概论》的二次作业之编程
- 《算法概论》第一次作业之编程
- 《算法概论》第三次作业之编程
- 算法概论第一次作业之算法概论思维导图
- 《算法概论》第二次作业之阅读资料
- 算法概论的第一次作业:最大公约数
- 算法概论第一次作业
- 算法概论第二次作业
- 算法概论作业汇总
- 第一次编程作业:计算两个数的最大公约数和《算法概论》的思维导图
- 第一周作业-算法概论
- 《算法概论》第一周作业
- 第一周算法概论作业
- 算法概论第二周作业
- 算法概论第三周作业
- 第三周作业 算法概论
- 第四周作业 算法概论
- 算法概论 第五周作业
- GStreamer基础教程13——播放速度
- 抒发心情。这个专业在累人。
- 25.字母图形
- java使用Jsoup连接网站超时的解决方法 链接的时候设定超时时间即可。 doc = Jsoup.connect(url).timeout(5000).get();
- HDU 1518
- 《算法概论》的二次作业之编程
- bzoj 1057 [ZJOI2007] 棋盘制作 题解
- 在CentOS 6.4 x86_64中Rhythmbox的解码器安装
- Codeforces Round #237 (Div. 2)(D)
- O’Reilly精品图书系列:编写可读代码的艺术].(鲍斯维尔等).尹哲等
- JAF(JavaBeans Activation Framework)
- Linux下基于OpenCV的摄像头数据采集与传输
- 筛选法求素数
- 26.数列特征