第九章密码学与信息加密1.密码学包含哪些概念?有什么功能?答:密码学(Cryptology)是研究信息系统安全保密的科学,密码编码学(Cryptography)主要研究对信息进行编码,实现对信息的隐藏。密码分析学(Cryptanalytics)主要研究加密消息的破译或消息的伪造。密码学主要包含以下几个概念:1)密码学的目标:保护数据的保密性、完整性和真实性。保密性就是对数据进行加密,使非法用户无法读懂数据信息,而合法用户可以应用密钥读取信息。完整性是对数据完整性的鉴别,以确定数据是否被非法纂改,保证合法用户得到正确、完整的信息。真实性是数据来源的真实性、数据本身真实性的鉴别,可以保证合法用户不被欺骗。2)消息的加密与解密:消息被称为明文,用某种方法伪装消息以隐藏它的内容的过程称为加密,加了密的消息称为密文,而把密文转变为明文的过程称为解密。3)密码学的功能:提供除机密性外,密码学还提供鉴别、完整性和抗抵赖性等重要功能。这些功能是通过计算机进行社会交流至关重要的需求。鉴别:消息的接收者应该能够确认消息的来源;入侵者不可能伪装成他人。完整性:消息的接收者应该能够验证在传送过程中消息没有被修改;入侵者不可能用假消息代替合法消息。抗抵赖性:发送消息者事后不可能虚假地否认他发送的消息。4)密码算法和密钥:密码算法也叫密码函数,是用于加密和解密的数学函数。通常情况下,有两个相关的函数:一个用做加密,另一个用做解密。密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的数据。基于密钥的算法通常有两类:对称算法和公开密钥算法。对称密钥加密,又称公钥加密,即信息的发送方和接收方用一个密钥去加密和解密数据。它的最大优势是加/解密速度快,适合于对大数据量进行加密,但密钥管理困难。非对称密钥加密,又称私钥密钥加密。它需要使用一对密钥来分别完成加密和解密操作,一个公开发布,即公开密钥,另一个由用户自己秘密保存,即私用密钥。信息发送者用公开密钥去加密,而信息接收者则用私用密钥去解密。私钥机制灵活,但加密和解密速度却比对称密钥加密慢得多。2.简述对称加密算法的基本原理。答:对称算法有时又称为传统密码算法,加密密钥能够从解密密钥中推算出来,反过来也成立。在大多数对称算法中,加解密的密钥是相同的。在对称加密算法中,数据发信方将明文(原始数据)和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥。对称算法要求发送者和接收者在安全通信之前,协商一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都能对消息进行加解密。对称算法的加密和解密表示为:EK(M)=CDK(C)=M3.利用对称加密算法对“1234567”进行加密,并进行解密。#includeiostream.hclassSubKey{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;i8;i++)for(intj=0;j8;j++){cinkey_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{KeykeypublicDESUtil(){}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=nullbyte[]byteMing=nullStringstrMi=BASE64Encoderbase64en=newBASE64Encoder();try{byteMing=strMing.getBytes(UTF8);byteMi=this.encryptByte(byteMing);strMi=base64en.encode(byteMi);}catch(Exceptione){thrownewRuntimeException(ErrorinitializingSqlMapclass.Cause:+e);}finally{base64en=nullbyteMing=nullbyteMi=null}returnstrMi;}/***解密以String密文输入,String明文输出**@paramstrMi*@return*/publicStringdecryptStr(StringstrMi){BASE64Decoderbase64De=newBASE64Decoder();byte[]byteMing=nullbyte[]byteMi=nullStringstrMing=try{byteMi=base64De.decodeBuffer(strMi);byteMing=this.decryptByte(byteMi);strMing=newString(byteMing,UTF8);}catch(Exceptione){thrownewRuntimeException(ErrorinitializingSqlMapclass.Cause:+e);}finally{base64De=nullbyteMing=nullbyteMi=null}returnstrMing;}/***加密以byte[]明文输入,byte[]密文输出**@parambyteS*@return*/privatebyte[]encryptByte(byte[]byteS){byte[]byteFina=nullCiphercipher;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=nulltry{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()