算法概论第二次作业

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值