算法概论第二次作业
来源:互联网 发布:teamviewer mac版下载 编辑:程序博客网 时间:2024/04/29 19:37
1、公钥加密与数字签名之间的联系与区别
RSA:公钥加密算法,是一种能抵抗到目前为止的绝大多数密码攻击的算法。它基于一个很简单的数论事实:即将两个素数相乘的结果进行因式分解的话是一件极其困难的事情,因此可以将两个素数的乘积公开作为加密密钥。它采用了数和互为素数,模运算,费马定理,欧拉定理等公式和定理。数字签名:又称公钥数字签名或电子签章,是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。一般而言,一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。
公钥:是与私钥算法一起使用的密钥对的非秘密一半。它通常用于加密会话密钥、验证数字签名或加密可以用相应的私钥解密的数据。它和私钥是通过一种算法得到的一个密钥对(即一个公钥和一个私钥)其中的一个向外界公开,另一个自己保留的。通过这种算法得到的密钥对能保证在世界范围内是唯一的。
DES:数据加密算法(Data Encryption Algorithm,DEA),是一种对称加密算法,很可能是使用最广泛的密钥系统,特别是在保护金融数据的安全中,最初开发的DEA是嵌入硬件中的。
从上面的解释可以看出,公钥加密与数字签名的联系还是十分紧密的,数字签名中使用了公钥加密领域的技术,所以说数字签名是基于公钥加密的技术来实现的,也就是从某种意义上讲,公钥加密是有包括了数字签名的,只不过包括得不多而已;而且公钥加密和数字签名都采用了类似对称的思想,即公钥加密采用了公钥和私钥这个密钥对,而数字签名也采用了相对应的互补运算。而两者也存在着一定的差别,比如公钥加密采用的是密钥对的思想,通过公钥和私钥的相互转换来实现加密的功能,而数字签名这是采用互补运算,即一个签名,一个验证的思想来实现加密的功能,这两者在实现算法上有本质上的区别。
2、程序编写
2.1 判断一个正整数是否为质数的算法。函数签名如下int isPrime(long a)
输入:一个长整数a
输出:返回1(为质数),返回0(非质数)
源码:
import java.util.*;public class Prime {//输入:一个长整数,若为素数则返回 true,否则返回false;static int isPrime(long a){ if(a==1) return 0; for(long i=2;i<=Math.sqrt(a);i++){ if(a%i==0) return 0; } return 1;}public static void main(String args[]){System.out.println("请输入一个长整数:");Scanner scan=new Scanner(System.in);long x = scan.nextLong();int y =isPrime(x);if(y==0){System.out.println(x + "不是质数,所以返回" + y);}else{System.out.println(x + "是质数,所以返回" + y);}} }
运行结果:
2.2 随机生成一个n bit位的长整数。函数签名如下
long createRndInteger(int n)输入:随机数bit位的长度为n(解释:3bit位,则最大为111,最小为100;n bit位,则该数字二进制长度为n)
输出:返回该随机数
源码:
import java.util.Random; import java.util.Scanner; public class createRndInteger { public static void main(String[] args) { System.out.print("请输入随机生成n bit位的长整数的长度n:"); Scanner scanner=new Scanner(System.in); int x= scanner.nextInt(); long random= createRndInteger(x); System.out.println("随机生成的" + x + "位长整数是:" + random); } public static long createRndInteger(int n){ int a[]={0,1}; StringBuilder sb=new StringBuilder(); Random random=new Random(); if(n==1){ return a[random.nextInt(a.length)]; }else{ sb.append(1); for(int i=0;i<n-1;i++){ sb.append(a[random.nextInt(a.length)]); } long num=Long.parseLong(sb.toString()); return num; } } }
另一种方法:
源码:
import java.util.Random;import java.util.Scanner;public class CreateRndInteger2 {public static void main(String[] args) {int a[];a=new int[100];int x;System.out.println("请输入随机生成的n bit数的长度n:");Scanner scan = new Scanner(System.in);int n = scan.nextInt();int d=CreateRndInteger(n);System.out.print("这位随机产生的 " + n + " bit位数是:");for(int i=0;i<n;i++){x=d%2;a[i]=x;d=d/2;}for(int i=n-1;i>=0;i--){System.out.print(a[i]);}}public static int CreateRndInteger(int x){long b = (int) Math.pow(2, x-1);Random rn = new Random();int c = (int)(rn.nextInt((int)b)+b);return c;}}
运行结果:
0 0
- 算法概论第二次作业
- 《算法概论》第二次作业之阅读资料
- 算法概论第一次作业
- 算法概论作业汇总
- 算法第二次作业
- 算法--第二次作业
- 算法 第二次作业
- 算法第二次作业
- 第一周作业-算法概论
- 《算法概论》第一周作业
- 第一周算法概论作业
- 算法概论第二周作业
- 算法概论第三周作业
- 第三周作业 算法概论
- 第四周作业 算法概论
- 算法概论 第五周作业
- 算法概论第五周作业
- 算法概论第六周作业
- bzoj 1271 秦腾与教学评估 题解
- 车载导航仪的基本机能概要
- 顺了一篇关于java native的
- java解析CSV
- 1002 Grading(2011年浙江大学计算机及软件工程研究生机试真题)
- 算法概论第二次作业
- C++学习笔记
- unity3D游戏开发实战原创视频讲座系列1之3D俄罗斯方块开发
- 使用Content Provider得到联系人信息实例
- 关于博士生学位论文创新——2008全国博士生学术会议•邹广天教授讲座摘录
- 【OpenCV入门教程之六】 创建Trackbar & 图像对比度、亮度值调整
- iOS企业开发发布流程
- 7.9 qt5 creator 上运行qt4需要注意的问题:
- Linux下串口编程入门