算法概论第二次作业

来源:互联网 发布: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
原创粉丝点击