一.资料阅读:
1,RSA算法:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
2,数字签名:(又称公钥数字签名、电子签章)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。
3,公钥:是与密钥算法一起使用的密钥对的非秘密一半。公钥通常用于加密会话签名、验证数字签名,或加密可以用相应的私钥解密的数据。公钥和私钥是通过一种算法得到的一个密钥对(即一个公钥和一个私钥)其中的一个向外界公开,称为公钥;另一个自己保留,称为私钥。通过这种算法得到的密钥对能保证在世界范围内是唯一的。使用这个秘钥对的时候,如果用其中一个密钥加密一段数据,必须用另一个密钥解密。
4,DES即数据加密算法:数据加密算法(Data Encryption Algorithm,DEA)是一种对称加密算法。
5,公钥加密 与 数字签名 之间的联系与区别:
5.1,联系:都是唯一的,都是用于保证文件不被非法查看,修改。
5.2,区别:公钥加密是对文件加密,数字签名是用私钥形成的。
二. 程序编写:
1,判断一个正整数是否为质数的算法。
public static int isPrime(double a){
int i=0;
double k=0;
//当i=0时a不是质数,当i=1时a是质数;
k=Math.sqrt(a);
k=Math.round(k);
for(int j=2;j<=k;j++){
if((a%j)==0){
i=0;
break;
}else{
i=1;
}
}
return i;
}
2,随机生成一个n bit位的长整数。(解释:3bit位,则最大为111,最小为100;n bit位,则该数字二进制长度为n)
public static double createRndInteger(int n){
double a=0; //a返回n bit的长整数的十进制数;
double max=0,min=0,rand=0; //max为第nbit位的十进制数,min为后n-1bit位的十进制数;
max=Math.pow(2,(n-1));
for(int i=0;i<=(n-2);i++){
a=Math.pow(2,i);
min=a+min;
}
rand=Math.random();
a=max+(min*rand);
a=Math.rint(a);
return a;
}
3,随机生成一个n bit位的长质数。
public static double createRndPrime(int n){
int i=0;
double a=0;
while(i==0){
a=rsa.createRndInteger(n);
i=rsa.isPrime(a);
}
return a;
}
4,公开密钥(N,e)的生成算法
public static double[] createPubKey(int n,int m){
//其中Bob[0]为N,Bob[1]为e
double[] Bob={0,0};
double a=0,b=0,c=0;
a=rsa.createRndPrime(n);
b=rsa.createRndPrime(m);
Bob[0]=b*a;
c=(a-1)*(b-1);
Bob[1]=rsa.createRndPrime(n+m);
while(Bob[1]==c){
Bob[1]=rsa.createRndPrime(n+m);
}
return Bob;
}
5,保密密钥(N,d)的生成算法 (关键是运用扩展Euclid算法,生成e模(p-1)(q-1)的逆元)
6,
7,