您的位置:首页 > 其它

算法概论第二次作业

2014-03-18 21:01 239 查看
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;
}
}

运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: