网络安全第九章密码学与信息加密.docx
- 文档编号:26430278
- 上传时间:2023-06-19
- 格式:DOCX
- 页数:16
- 大小:21.05KB
网络安全第九章密码学与信息加密.docx
《网络安全第九章密码学与信息加密.docx》由会员分享,可在线阅读,更多相关《网络安全第九章密码学与信息加密.docx(16页珍藏版)》请在冰豆网上搜索。
网络安全第九章密码学与信息加密
第九章密码学与信息加密
1.密码学包含哪些概念?
有什么功能?
答:
密码学(Cryptology)是研究信息系统安全保密的科学,密码编码学(Cryptography)主要研究对信息进行编码,实现对信息的隐藏。
密码分析学(Cryptanalytics)主要研究加密消息的破译或消息的伪造。
密码学主要包含以下几个概念:
1)密码学的目标:
保护数据的保密性、完整性和真实性。
保密性就是对数据进行加密,使非法用户无法读懂数据信息,而合法用户可以应用密钥读取信息。
完整性是对数据完整性的鉴别,以确定数据是否被非法纂改,保证合法用户得到正确、完整的信息。
真实性是数据来源的真实性、数据本身真实性的鉴别,可以保证合法用户不被欺骗。
2)消息的加密与解密:
消息被称为明文,用某种方法伪装消息以隐藏它的内容的过程称为加密,加了密的消息称为密文,而把密文转变为明文的过程称为解密。
3)密码学的功能:
提供除机密性外,密码学还提供鉴别、完整性和抗抵赖性等重要功能。
这些功能是通过计算机进行社会交流至关重要的需求。
鉴别:
消息的接收者应该能够确认消息的来源;入侵者不可能伪装成他人。
完整性:
消息的接收者应该能够验证在传送过程中消息没有被修改;入侵者不可能用假消息代替合法消息。
抗抵赖性:
发送消息者事后不可能虚假地否认他发送的消息。
4)密码算法和密钥:
密码算法也叫密码函数,是用于加密和解密的数学函数。
通常情况下,有两个相关的函数:
一个用做加密,另一个用做解密。
密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的数据。
基于密钥的算法通常有两类:
对称算法和公开密钥算法。
对称密钥加密,又称公钥加密,即信息的发送方和接收方用一个密钥去加密和解密数据。
它的最大优势是加/解密速度快,适合于对大数据量进行加密,但密钥管理困难。
非对称密钥加密,又称私钥密钥加密。
它需要使用一对密钥来分别完成加密和解密操作,一个公开发布,即公开密钥,另一个由用户自己秘密保存,即私用密钥。
信息发送者用公开密钥去加密,而信息接收者则用私用密钥去解密。
私钥机制灵活,但加密和解密速度却比对称密钥加密慢得多。
2.简述对称加密算法的基本原理。
答:
对称算法有时又称为传统密码算法,加密密钥能够从解密密钥中推算出来,反过来也成立。
在大多数对称算法中,加解密的密钥是相同的。
在对称加密算法中,数据发信方将明文(原始数据)和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。
收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。
在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥。
对称算法要求发送者和接收者在安全通信之前,协商一个密钥。
对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都能对消息进行加解密。
对称算法的加密和解密表示为:
EK(M)=C
DK(C)=M
3.利用对称加密算法对“1234567”进行加密,并进行解密。
#include
classSubKey{
public:
intkey[8][6];
}subkey[16];
classDES{
intencipher_decipher;
intkey_in[8][8];
intkey_out[8][7];
intc0_d0[8][7];
intc0[4][7],d0[4][7];
inttext[8][8];
inttext_ip[8][8];
intA[4][8],B[4][8];
inttemp[8][6];
inttemp1[8][6];
ints_result[8][4];
inttext_p[8][4];
intsecret_ip[8][8];
public:
voidKey_Putting();
voidPC_1();
intfunction(int,int);
voidSubKey_Production();
voidIP_Convert();
voidf();
void_IP_Convert();
voidOut_secret();
};
voidDES:
:
Key_Putting()
{
cout<<"请输入64位的密钥(8行8列且每行都得有奇数个1):
\n";
for(inti=0;i<8;i++)
for(intj=0;j<8;j++){
cin>>key_in[i][j];
if(j!
=7)key_out[i][j]=key_in[i][j];
}
}
4.简述公开密钥算法的基本原理。
答:
公开密钥算法,加密密钥能够公开,即陌生者能用加密密钥加密信息,但只有用相应的解密密钥才能解密信息。
如果发信方想发送只有收信方才能解读的加密信息,发信方必须首先知道收信方的公钥,然后利用收信方的公钥来加密原文;收信方收到加密密文后,使用自己的私钥才能解密密文。
显然,采用不对称加密算法,收发信双方在通信之前,收信方必须将自己早已随机生成的公钥送给发信方,而自己保留私钥。
公开密钥K1加密表示为:
EK1(M)=C。
公开密钥和私人密钥是不同的,用相应的私人密钥K2解密可表示为:
DK2(C)=M。
5.利用公开密钥算法对“1234567”进行加密,并进行解密。
packagetest;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.security.Key;
importjava.security.SecureRandom;
importjavax.crypto.Cipher;
importjavax.crypto.CipherInputStream;
importjavax.crypto.CipherOutputStream;
importjavax.crypto.KeyGenerator;
importsun.misc.BASE64Decoder;
importsun.misc.BASE64Encoder;
publicclassDESUtil{
Keykey
publicDESUtil(){
}
publicDESUtil(Stringstr){
setKey(str);//
生成密匙
}
publicKeygetKey(){
returnkey
}
publicvoidsetKey(Keykey){
this.key=key;
}
/**
*
根据参数生成
KEY
*/
publicvoidsetKey(StringstrKey){
try{
KeyGenerator_generator=KeyGenerator.getInstance("DES");
_generator.init(newSecureRandom(strKey.getBytes()));
this.key=_generator.generateKey();
_generator=null
}catch(Exceptione){
thrownewRuntimeException(
"ErrorinitializingSqlMapclass.Cause:
"+e);
}
}/***加密
String明文输入
String
密文输出
*/
publicStringencryptStr(StringstrMing){
byte[]byteMi=null
byte[]byteMing=null
StringstrMi=""
BASE64Encoderbase64en=newBASE64Encoder();
try{
byteMing=strMing.getBytes("UTF8");
byteMi=this.encryptByte(byteMing);
strMi=base64en.encode(byteMi);
}catch(Exceptione){
thrownewRuntimeException(
"ErrorinitializingSqlMapclass.Cause:
"+e);
}finally{
base64en=null
byteMing=null
byteMi=null
}
returnstrMi;
}
/**
*解密以String密文输入,String明文输出
*
*@paramstrMi
*@return
*/
publicStringdecryptStr(StringstrMi){
BASE64Decoderbase64De=newBASE64Decoder();
byte[]byteMing=null
byte[]byteMi=null
StringstrMing=""
try{
byteMi=base64De.decodeBuffer(strMi);
byteMing=this.decryptByte(byteMi);
strMing=newString(byteMing,"UTF8");
}catch(Exceptione){
thrownewRuntimeException(
"ErrorinitializingSqlMapclass.Cause:
"+e);
}finally{
base64De=null
byteMing=null
byteMi=null
}
returnstrMing;
}
/**
*加密以byte[]明文输入,byte[]密文输出
*
*@parambyteS
*@return
*/
privatebyte[]encryptByte(byte[]byteS){
byte[]byteFina=null
Ciphercipher;
try{
cipher=Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE,key);
byteFina=cipher.doFinal(byteS);
}catch(Exceptione){
thrownewRuntimeException(
"ErrorinitializingSqlMapclass.Cause:
"+e);
}finally{
cipher=null
}
returnbyteFina;
}
/**
*解密以byte[]密文输入,以byte[]明文输出
*
*@parambyteD
*@return
*/
privatebyte[]decryptByte(byte[]byteD){
Ciphercipher;
byte[]byteFina=null
try{
cipher=Cipher.getInstance("DES");
cipher.init(Cipher.DECRYPT_MODE,key);
byteFina=cipher.doFinal(byteD);
}catch(Exceptione){
thrownewRuntimeException(
"ErrorinitializingSqlMapclass.Cause:
"+e);
}finally{
cipher=null
}
returnbyteFina;
}
/**
*文件file进行加密并保存目标文件destFile中
*
*@paramfile
*要加密的文件如c:
/test/srcFile.txt
*@paramdestFile
*加密后存放的文件名如c:
/加密后文件.txt
*/
publicvoidencryptFile(Stringfile,StringdestFile)throwsException{
Ciphercipher=Cipher.getInstance("DES");
//cipher.init(Cipher.ENCRYPT_MODE,getKey());
cipher.init(Cipher.ENCRYPT_MODE,this.key);
InputStreamis=newFileInputStream(file);
OutputStreamout=newFileOutputStream(destFile);
CipherInputStreamcis=newCipherInputStream(is,cipher);
byte[]buffer=newbyte[1024];
intr;
while((r=cis.read(buffer))>0){
out.write(buffer,0,r);
}
cis.close();
is.close();
out.close();
}
/**
*文件采用DES算法解密文件
*
*@paramfile
*已加密的文件如c:
/加密后文件.txt*
*@paramdestFile
*解密后存放的文件名如c:
/test/解密后文件.txt
*/
publicvoiddecryptFile(Stringfile,Stringdest)throwsException{
Ciphercipher=Cipher.getInstance("DES");
cipher.init(Cipher.DECRYPT_MODE,this.key);
InputStreamis=newFileInputStream(file);
OutputStreamout=newFileOutputStream(dest);
CipherOutputStreamcos=newCipherOutputStream(out,cipher);
byte[]buffer=newbyte[1024];
intr;
while((r=is.read(buffer))>=0){
cos.write(buffer,0,r);
}
cos.close();
out.close();
is.close();
}
publicstaticvoidmain(String[]args)throwsException{
DESUtildes=newDESUtil("1234567");
//DES加密文件
//des.encryptFile("G:
/test.doc","G:
/加密test.doc");
//DES解密文件
//des.decryptFile("G:
/加密test.doc","G:
/解密test.doc");Stringstr1="要加密的字符串test"
//DES加密字符串Stringstr2=des.encryptStr(str1);
//DES解密字符串StringdeStr=des.decryptStr(str2);
System.out.println("加密前:
"+str1);
System.out.println("加密后:
"+str2);
System.out.println("解密后:
"+deStr);
}
}
6.比较对称加密算法和公开密钥算法,分析它们的异同。
答:
通过比较第2、4对称密钥和公开密钥两种算法的基本原理,我们不难看出二者有以下异同点:
1)相同点:
二者都采用密钥加密解密。
2)不同点:
对称密钥加密的加密密钥和解密密钥是同一个密钥,收信方想解读密文必须拥有发信方的密钥,密钥是非公开的。
对称密钥得法具有算法公开、计算量小、加密速度快、加密效率高等特点,但是对称密钥算法安全性过于依赖密钥,导致密钥管理负担重、成本高,在分布式网络系统中使用较为困难。
公开密钥算法有两个密钥,一个密钥值用来加密消息,另一个密钥值用来解密消息。
这两个密钥值在同一个过程中生成,称为密钥对。
用来加密消息的密钥称为公钥,用来解密消息的密钥称为私钥。
用公钥加密的消息只能用与之对应的私钥来解密,私钥除了持有者外无人知道,而公钥却可通过非安全管道来发送或在目录中发布,这使得公开密钥算法可广泛应用于分布式系统中。
非对称加密体系不要求通信双方事先传递密钥或有任何约定就能完成保密通信,并且密钥管理方便,可实现防止假冒和抵赖,因此,更适合网络通信中的保密通信要求。
公开密钥算法比对称加密算法慢数千倍,但在保护通信安全方面,公开密钥算法却具有对称密码难以企及的优势。
7.恺撒密码的加密方法是把a变成D,b变成E,c换成F,依次类推,z换成C。
这样明文和密文的字母就建立一一对应的关系。
加密原理其实就是:
对明文加上了一个偏移值29,即“a”对应的ASCII码位97,“D”对应的ASCII码为68,相减得到29。
编写程序1:
实现恺撒密码加密单词“julus”。
#include
#defineN5
voidjiami(charnamea[256])
{
FILE*fp_jiami,*fp_file2;
charc;
fp_jiami=fopen(namea,"rb");
fp_file2=fopen("file2.txt","wb");
while(EOF!
=(fscanf(fp_jiami,"%c",&c)))
{
if((c>='A'&&c<='Z')||(c>='a'&&c<='z'))
{
c=c+N;
if(!
((c>='A'&&c<='Z')||(c>='a'&&c<='z')))c=c-26;
if(c>='a'&&c<='z')c=c-32;
}
fprintf(fp_file2,"%c",c);
}
fclose(fp_file2);
fclose(fp_jiami);
}
voidjiemi(charen_name[256])
{
FILE*fp_jiemi,*fp_file3;
charc;
fp_jiemi=fopen(en_name,"rb");
fp_file3=fopen("file3.txt","wb");
while(EOF!
=(fscanf(fp_jiemi,"%c",&c)))
{
if((c>='A'&&c<='Z')||(c>='a'&&c<='z'))
{
c=c-N;
if(!
((c>='A'&&c<='Z')||(c>='a'&&c<='z')))c=c+26;
if(c>='A'&&c<='Z')c=c+32;
}
fprintf(fp_file3,"%c",c);
}
fclose(fp_file3);
fclose(fp_jiemi);
}
intmain()
{
charname[256];
intn;
printf("输入你要操作的TXT文本:
");
gets(name);
printf("\n请选择需要进行的操作:
\n");
printf("1:
加密2:
解密\n");
printf("输入你的选择:
");
scanf("%d",&n);
switch(n){
case1:
{jiami(name);printf("\t加密成功!
!
\n\n");
break;}
case2:
{jiemi(name);printf("\t解密成功!
!
\n\n");
break;}
default:
{printf("输入操作不存在!
");}
}
return0;
}
编写程序2:
实现解密,将程序1得到的密文进行解密。
8.简述PGP加密技术的应用。
答:
PGP(PrettyGoodPrivacy)加密技术是一个基于RSA公钥加密体系的邮件加密软件,提出了公共钥匙或不对称文件的加密技术。
PGP加密技术的创始人是美国的PhilZimmermann。
他创造性地把RSA公钥体系和传统加密体系结合起来,并且在数字签名和密钥认证管理机制上有巧妙的设计,因此PGP成为目前几乎最流行的公钥加密软件包。
由于RSA算法计算量极大,在速度上不适合加密大量数据,所以PGP实际上用来加密的不是RSA本身,而是采用传统加密算法IDEA,IDEA加解密的速度比RSA快得多。
PGP随机生成一个密钥,用IDEA算法对明文加密,然后用RSA算法对密钥加密。
收件人同样是用RSA解出随机密钥,再用IEDA解出原文。
这样的链式加密既有RSA算法的保密性和认证性(Authentication),又保持了IDEA算法速度快的优势。
9.使用PGP软件加密文件,并与其他人交换密钥。
用鼠标右键单击要加密的文件,在快捷菜单中选择“PGP”中的“Encrypt”选项,系统自动出啊先对话框,让用户选择要使用的加密密钥,选中一个密钥,单击“OK”按钮,目标文件被加密后,会在当前目录下自动产生一个新的文件。
10.简述X.509v3证书的结构。
答:
X.509v3证书主要结构如下:
1)版本号该域用于区分各连续版本的证书,像版本1、版本2和版本3。
版本号域同样允许包括将来可能的版本。
2) 证书序列号该域含有一个唯一于每一个证书的整数值,它是由认证机构产生的。
3) 签名算法标识符该域用来说明签发证书所使用的算法以及相关的参数。
4) 签发者该域用于标识生成和签发该证书的认证机构的唯一名。
5)有效期(NotBefore/After)该域含有两个日期/时间值:
“NotValidBefore”和“NotValidAfter”;它们定义了该证书可以被看作有效的时间段,除非该证书被撤销。
6)拥有者该域标识本证书拥有者的唯一名(DN),也就是拥有与证书中公钥所对应私钥的主体。
此域必须非空,除非在版本3的扩展项中使用了其他的名字。
7)拥有
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络安全 第九 密码学 信息 加密