一 密钥分配Word格式.docx

上传人:b****2 文档编号:4531308 上传时间:2023-05-03 格式:DOCX 页数:27 大小:187.68KB
下载 相关 举报
一 密钥分配Word格式.docx_第1页
第1页 / 共27页
一 密钥分配Word格式.docx_第2页
第2页 / 共27页
一 密钥分配Word格式.docx_第3页
第3页 / 共27页
一 密钥分配Word格式.docx_第4页
第4页 / 共27页
一 密钥分配Word格式.docx_第5页
第5页 / 共27页
一 密钥分配Word格式.docx_第6页
第6页 / 共27页
一 密钥分配Word格式.docx_第7页
第7页 / 共27页
一 密钥分配Word格式.docx_第8页
第8页 / 共27页
一 密钥分配Word格式.docx_第9页
第9页 / 共27页
一 密钥分配Word格式.docx_第10页
第10页 / 共27页
一 密钥分配Word格式.docx_第11页
第11页 / 共27页
一 密钥分配Word格式.docx_第12页
第12页 / 共27页
一 密钥分配Word格式.docx_第13页
第13页 / 共27页
一 密钥分配Word格式.docx_第14页
第14页 / 共27页
一 密钥分配Word格式.docx_第15页
第15页 / 共27页
一 密钥分配Word格式.docx_第16页
第16页 / 共27页
一 密钥分配Word格式.docx_第17页
第17页 / 共27页
一 密钥分配Word格式.docx_第18页
第18页 / 共27页
一 密钥分配Word格式.docx_第19页
第19页 / 共27页
一 密钥分配Word格式.docx_第20页
第20页 / 共27页
亲,该文档总共27页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

一 密钥分配Word格式.docx

《一 密钥分配Word格式.docx》由会员分享,可在线阅读,更多相关《一 密钥分配Word格式.docx(27页珍藏版)》请在冰点文库上搜索。

一 密钥分配Word格式.docx

DES使用16个循

环,但最后一个循环不交换。

攻击DES,一般只能使用穷举的密钥搜索,即重复尝试各种密钥直到有一个符合为

止。

如果DES使用56位的密钥,则可能的密钥数量是256个,穷举难度较大。

IBM曾对DES拥有几年的专利权,但在1983年到期。

在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。

加密算法E和解密算法D也都是公开的。

虽然解密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK。

正是基于这种理论,1978年出现了著名的RSA算法,它通常是先生成一对RSA密钥,其中之一是保密密钥,由用户保存;

另一个为公开密钥,可对外公开,甚至可在网络服务器中注册。

为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。

这就使加密的计算量很大。

为减少计算量,在传送信息时,常采用传统加密方法与公开密钥加密方法相结合的方式,即信息采用改进的DES或IDEA对话密钥加密,然后使用RSA密钥加密对话密钥和信息摘要。

对方收到信息后,用不同的密钥解密并可核对信息摘要。

2.问题分析

(1).对称密钥密码体系

对称密钥密码体系也叫密钥密码体系,它是指消息发送方和消息接收方必须使用相同的密钥,该密钥必须保密。

发送方用该密钥对待发消息进行加密,然后将消息传输至接收方,接收方再用相同的密钥对收到的消息进行解密。

这一过程可用数学形式来表示。

消息发送方使用的加密函数encrypt有两个参数:

密钥K和待加密消息M,加密后的消息为E,E可以表示为E=encrypt(K,M)消息接收方使用的解密函数decrypt把这一过程逆过来,就产生了原来的消息M=decrypt(K,E)=decrypt(K,encrypt(K,M))

(2).非对称密钥密码体系

非对称密钥密码体系又叫公钥密码体系,它使用两个密钥:

一个公共密钥PK和一个私有密钥SK。

这两个密钥在数学上是相关的,并且不能由公钥计算出对应的私钥,同样也不能由私钥计算出对应的公钥。

这种用两把密钥加密和解密的方法表示成如下数学形式。

假设M表示一条消息,pub—a表示用户a的公共密钥,prv—a表示用户a的私有密钥,那么:

M=decrypt(pub—a,encrypt(prv—a,M))

3.算法分析及流程图

4.实验原理

(1)利用java中的KeypairGenerator类创建公钥密钥对,工厂类KeypairGenerator的静态方法getInstance()可以获得KeypairGenerator类型对象。

(2)方法getInstance()的参数为字符串类型,指定加密算法为RSA。

(3)RSA算法是使用整数进行加密运算的,RSA的公钥中包含两个信息:

公钥对应的整数e和用于取模的整数n。

对于明文m计算密文的公式是memodn。

java中的BigInteger类中定义的modPow()方法可以计算memodn。

(4)RSA的私钥中包含两个信息:

私钥对应的整数d和用于取模的整数n。

计算明文的公式是:

Cemodn。

5.类图

四.数据测试及结果

1、利用DES算法生成对称密钥Key,运行程序后生成Key.dat文件

2、利用RSA算法生成公钥密钥对,将公钥存入A文件夹下,将私钥存入B文件夹下,运行程序后在A文件夹下生成Skey_RSA_pub.dat文件,在B文件夹下生成Skey_RSA_priv.dat文件:

3.利用RSA加密算法对对称密钥加密,将加密后文件保存为Enc_RSA.dat文件,运行程序后:

4、利用RSA解密算法对密文进行解密,将解密后的文件Key.dat写入B文件夹下,运行程序后B文件夹下生成Key.dat文件:

五.总结

通过本次实习,复习了DES和RSA的相关知识,通过使用DES算法和RSA算法实现密钥分发与通信过程,对密钥的分配过程有了一定的了解。

让我更加认识到了加密算法的复杂,也更加巩固了我们的java知识,理解了公钥密码算法,掌握了RSA密码算法加解密过程的实现,学习了java.security.*和java.crypto.*中相关类。

对于KeypairGenerator,KeyPair,PublicKey,PrivateKey等类有了进一步的了解,RSA算法是使用整数进行加密运算的,RSA的公钥中包含两个信息公钥对应的整数e和用于取模的整数n。

由于时间精力有限,本次实验还存在很多问题,在控制台进行明文的加密解密正常,图形界面的加密也正常,解密时调用Skey_RSA的解密方法时未能完成解密工作。

加密方法的参数密钥由KeypairGenerator的静态方法getInstance()可以获得KeypairGenerator类型对象,所以在界面使用文本框获得key值会造成初始化方法init()的publickey参数错误,于是设置成密钥由系统生成。

Ciphercipher=Cipher.getInstance("

RSA"

);

//Cipher负责完成加密或解密工作,基于RSA

cipher.init(Cipher.ENCRYPT_MODE,publicKey);

//根据公钥,对Cipher对象进行初始化

对称密码一般要求:

1、加密解密用相同的密钥

2、收发双方必须共享密钥

安全性要求:

1、密钥必须保密

2、没有密钥,解密不可行

3、知道算法和若干密文不足以确定密钥

公钥密码一般要求:

1、加密解密算法相同,但使用不同的密钥

2、发送方拥有加密或解密密钥,而接收方拥有另一个密钥

1、两个密钥之一必须保密

2、无解密密钥,解密不可行

3、知道算法和其中一个密钥以及若干密文不能确定另一个密钥

源程序

//生成对称密钥

packageSkey;

importjava.io.FileOutputStream;

importjava.io.ObjectOutputStream;

importjavax.crypto.KeyGenerator;

importjavax.crypto.SecretKey;

publicclassSkey_DES{

/**

*@paramargs

*/

//TODOAuto-generatedmethodstub

//对称密钥的生成,并通过对象序列化方式保存在文件中

publicstaticvoidmain(Stringargs[])throwsException

{

KeyGeneratorkg=KeyGenerator.getInstance("

DESede"

//创建密钥生成器

kg.init(168);

//初始化密钥生成器

SecretKeyk=kg.generateKey();

//生成密钥

//通过对象序列化方式将密钥保存在文件中

FileOutputStreamf1=newFileOutputStream("

A/Key.dat"

ObjectOutputStreamb1=newObjectOutputStream(f1);

b1.writeObject(k);

}

//生成对称密钥对

packageRSA;

importjava.io.*;

importjava.security.*;

importjava.security.interfaces.RSAPrivateKey;

importjava.security.interfaces.RSAPublicKey;

importjavax.crypto.Cipher;

publicclassSkey_RSA{

//KeyGenerator提供对称密钥生成器的功能,支持各种算法

publicKeyPairGeneratorkeyPairGen;

//SecretKey负责保存对称密钥

KeyPairkeyPair;

RSAPrivateKeyprivateKey;

RSAPublicKeypublicKey;

//Cipher负责完成加密或解密工作

privateCipherc;

//该字节数组负责保存加密的结果

privatebyte[]cipherByte;

//KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象

Skey_RSA(){

//KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象

KeyPairGeneratorkeyPairGen=null;

try{

keyPairGen=KeyPairGenerator.getInstance("

}catch(NoSuchAlgorithmExceptione){

//TODO自动生成的catch块

e.printStackTrace();

}

//初始化密钥对生成器,密钥大小为1024位

keyPairGen.initialize(1024);

//生成一个密钥对,保存在keyPair中

KeyPairkeyPair=keyPairGen.generateKeyPair();

//得到私钥

RSAPrivateKeyprivateKey=(RSAPrivateKey)keyPair.getPrivate();

//得到公钥

RSAPublicKeypublicKey=(RSAPublicKey)keyPair.getPublic();

publicRSAPrivateKeygetPrivateKey(){

returnprivateKey;

publicvoidsetPrivateKey(RSAPrivateKeyprivateKey){

this.privateKey=privateKey;

publicRSAPublicKeygetPublicKey(){

returnpublicKey;

publicvoidsetPublicKey(RSAPublicKeypublicKey){

this.publicKey=publicKey;

publicbyte[]encrypt(RSAPublicKeypublicKey,byte[]srcBytes){

if(publicKey!

=null){

try{

//Cipher负责完成加密或解密工作,基于RSA

Ciphercipher=Cipher.getInstance("

//根据公钥,对Cipher对象进行初始化

cipher.init(Cipher.ENCRYPT_MODE,publicKey);

//加密,结果保存进resultBytes

byte[]resultBytes=cipher.doFinal(srcBytes);

returnresultBytes;

}catch(Exceptione){

e.printStackTrace();

}

}

returnnull;

publicbyte[]decrypt(RSAPrivateKeyprivateKey,byte[]encBytes){

if(privateKey!

//根据私钥,对Cipher对象进行初始化

cipher.init(Cipher.DECRYPT_MODE,privateKey);

//解密,结果保存进resultBytes

byte[]decBytes=cipher.doFinal(encBytes);

returndecBytes;

}catch(Exceptione)

{

publicstaticvoidmain(String[]args)throwsException{

//密钥对生成器KeyPairGenerator工厂,非对称加密算法:

RSA,DSA

KeyPairGeneratorkpg=KeyPairGenerator.getInstance("

//制定密钥长度

kpg.initialize(1024);

//生成密钥对

KeyPairkp=kpg.genKeyPair();

PublicKeypbkey=kp.getPublic();

PrivateKeyprkey=kp.getPrivate();

FileOutputStreamf1=newFileOutputStream("

A/Skey_RSA_pub.dat"

ObjectOutputStreamb1=newObjectOutputStream(f1);

b1.writeObject(pbkey);

FileOutputStreamf2=newFileOutputStream("

B/Skey_RSA_priv.dat"

ObjectOutputStreamb2=newObjectOutputStream(f2);

b2.writeObject(prkey);

Skey_RSArsa=newSkey_RSA();

Stringmsg="

rsa_安全编程技术"

;

System.out.println("

明文是:

"

+msg);

KeyPairGeneratorkeyPairGen=KeyPairGenerator.getInstance("

//初始化密钥对生成器,密钥大小为1024位

keyPairGen.initialize(1024);

//生成一个密钥对,保存在keyPair中

KeyPairkeyPair=keyPairGen.generateKeyPair();

//得到私钥

RSAPrivateKeyprivateKey=(RSAPrivateKey)keyPair.getPrivate();

//得到公钥

RSAPublicKeypublicKey=(RSAPublicKey)keyPair.getPublic();

//用公钥加密

byte[]srcBytes=msg.getBytes();

byte[]resultBytes=rsa.encrypt(publicKey,srcBytes);

Stringresult=newString(resultBytes);

用公钥加密后密文是:

+result);

//用私钥解密

byte[]decBytes=rsa.decrypt(privateKey,resultBytes);

Stringdec=newString(decBytes);

用私钥解密后结果是:

+dec);

}

//公钥加密

importjava.math.*;

publicclassEnc_RSA{

publicstaticvoidmain(String[]args)throwsException{

BufferedReaderin=newBufferedReader(newInputStreamReader(newFileInputStream("

)));

Strings=in.readLine();

FileInputStreamf=newFileInputStream("

ObjectInputStreamb=newObjectInputStream(f);

//公钥转换为RSA公钥

RSAPublicKeypbk=(RSAPublicKey)b.readObject();

//获取公钥参数:

公钥对应的整数e,用于取模的整数n

BigIntegere=pbk.getPublicExponent();

BigIntegern=pbk.getModulus();

e="

+e);

n="

+n);

byteptext[]=s.getBytes("

UTF8"

BigIntegerm=newBigInteger(ptext);

BigIntegerc=m.modPow(e,n);

c="

+c);

Stringcs=c.toString();

BufferedWriterout=

newBufferedWriter(newOutputStreamWriter(

newFileOutputStream("

Enc_RSA.dat"

out.write(cs,0,cs.length());

out.close();

//私钥解密

importjava.security.interfaces.*;

publicclassDec_RSA{

BufferedReaderin=newBufferedReader(

newInputStreamReader(

newFileInputStream("

Stringctext=in.readLine();

BigIntegerc=newBigInteger(ctext);

FileInputStreamf=newFileInputStream("

ObjectInputStreamb=newObjectInputStream(f);

RSAPrivateKeyprk=(RSAPrivateKey)b.readObject();

BigIntegerd=prk.getPrivateExponent();

BigIntegern=prk.getModulus();

System.out.println("

d="

+d);

BigIntegerm=c.modPow(d,n);

m="

+m);

byte[]mt=m.toByteArray();

PlainTextis"

for(inti=0;

i<

mt.length;

i++){

System.out.print((char)mt[i]);

FileOutputStreamf1=newFileOutputStream("

B/Key.dat"

ObjectOutputStreamb1=newObjectOutputStream(f1);

b1.writeObject(m);

//图形界面

packageDec;

/*

*Window.java

*

*Createdon__DATE__,__TIME__

importjava.io.IOException;

importjava.util.Scanner;

/**

*@author__USER__

publicclassWindowextendsjavax.swing.JFrame{

/**CreatesnewformWindow*/

publi

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2