第九章密码学与信息加密1. 密码学包含哪些概念?有什么功能?答:密码学(Cryptology)是研究信息系统安全保密的科学,密码编码学(Cryptography)主要研究对信息进行编码,实现对信息的隐藏。
密码分析学(Cryptanalytics)主要研究加密消息的破译或消息的伪造。
密码学主要包含以下几个概念:1)密码学的目标:保护数据的保密性、完整性和真实性。
保密性就是对数据进行加密,使非法用户无法读懂数据信息,而合法用户可以应用密钥读取信息。
完整性是对数据完整性的鉴别,以确定数据是否被非法纂改,保证合法用户得到正确、完整的信息。
真实性是数据来源的真实性、数据本身真实性的鉴别,可以保证合法用户不被欺骗。
2)消息的加密与解密:消息被称为明文,用某种方法伪装消息以隐藏它的内容的过程称为加密,加了密的消息称为密文,而把密文转变为明文的过程称为解密。
3)密码学的功能:提供除机密性外,密码学还提供鉴别、完整性和抗抵赖性等重要功能。
这些功能是通过计算机进行社会交流至关重要的需求。
鉴别:消息的接收者应该能够确认消息的来源;入侵者不可能伪装成他人。
完整性:消息的接收者应该能够验证在传送过程中消息没有被修改;入侵者不可能用假消息代替合法消息。
抗抵赖性:发送消息者事后不可能虚假地否认他发送的消息。
4)密码算法和密钥:密码算法也叫密码函数,是用于加密和解密的数学函数。
通常情况下,有两个相关的函数:一个用做加密,另一个用做解密。
密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的数据。
基于密钥的算法通常有两类:对称算法和公开密钥算法。
对称密钥加密,又称公钥加密,即信息的发送方和接收方用一个密钥去加密和解密数据。
它的最大优势是加/解密速度快,适合于对大数据量进行加密,但密钥管理困难。
非对称密钥加密,又称私钥密钥加密。
它需要使用一对密钥来分别完成加密和解密操作,一个公开发布,即公开密钥,另一个由用户自己秘密保存,即私用密钥。
信息发送者用公开密钥去加密,而信息接收者则用私用密钥去解密。
私钥机制灵活,但加密和解密速度却比对称密钥加密慢得多。
2. 简述对称加密算法的基本原理。
答:对称算法有时又称为传统密码算法,加密密钥能够从解密密钥中推算出来,反过来也成立。
在大多数对称算法中,加解密的密钥是相同的。
在对称加密算法中,数据发信方将明文(原始数据)和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。
收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。
在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥。
对称算法要求发送者和接收者在安全通信之前,协商一个密钥。
对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都能对消息进行加解密。
对称算法的加密和解密表示为:E(M)=CKD(C)=MK3. 利用对称加密算法对“1234567”进行加密,并进行解密。
#include<iostream.h>class SubKey{public:int key[8][6];}subkey[16];class DES{int encipher_decipher;int key_in[8][8];int key_out[8][7];int c0_d0[8][7];int c0[4][7],d0[4][7];int text[8][8];int text_ip[8][8];int A[4][8],B[4][8];int temp[8][6];int temp1[8][6];int s_result[8][4];int text_p[8][4];int secret_ip[8][8];public:void Key_Putting();void PC_1();int function(int,int);void SubKey_Production();void IP_Convert();void f();void _IP_Convert();void Out_secret();};void DES::Key_Putting(){cout<<"请输入64位的密钥(8行8列且每行都得有奇数个1):\n";for(int i=0;i<8;i++)for(int j=0;j<8;j++){cin>>key_in[i][j];if(j!=7) key_out[i][j]=key_in[i][j];}}4. 简述公开密钥算法的基本原理。
答:公开密钥算法,加密密钥能够公开,即陌生者能用加密密钥加密信息,但只有用相应的解密密钥才能解密信息。
如果发信方想发送只有收信方才能解读的加密信息,发信方必须首先知道收信方的公钥,然后利用收信方的公钥来加密原文;收信方收到加密密文后,使用自己的私钥才能解密密文。
显然,采用不对称加密算法,收发信双方在通信之前,收信方必须将自己早已随机生成的公钥送给发信方,而自己保留私钥。
(M)=C。
公开密钥和私人密钥是不同的,用相应的公开密钥K1加密表示为:EK1(C)=M。
私人密钥K2解密可表示为:DK25. 利用公开密钥算法对“1234567”进行加密,并进行解密。
package test;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStream;import java.io.OutputStream;import java.security.Key;import java.security.SecureRandom;import javax.crypto.Cipher;import javax.crypto.CipherInputStream;import javax.crypto.CipherOutputStream;import javax.crypto.KeyGenerator;import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder;public class DESUtil {Key keypublic DESUtil() {}public DESUtil(String str) {setKey(str); //生成密匙}public Key getKey() {return key}public void setKey(Key key) {this . key = key;}/***根据参数生成KEY*/public void setKey(String strKey) {try {KeyGenerator _generator = KeyGenerator.getInstance ( "DES" ); _generator.init( new SecureRandom(strKey.getBytes()));this . key = _generator.generateKey();_generator = null} catch (Exception e) {throw new RuntimeException("Error initializing SqlMap class. Cause: " + e);}} /** * 加密String 明文输入String密文输出*/public String encryptStr(String strMing) {byte [] byteMi = nullbyte [] byteMing = nullString strMi = ""BASE64Encoder base64en = new BASE64Encoder();try {byteMing = strMing.getBytes( "UTF8" );byteMi = this .encryptByte(byteMing);strMi = base64en.encode(byteMi);} catch (Exception e) {throw new RuntimeException("Error initializing SqlMap class. Cause: " + e);} finally {base64en = nullbyteMing = nullbyteMi = null}return strMi;}/*** 解密以 String 密文输入 ,String 明文输出** @param strMi* @return*/public String decryptStr(String strMi) {BASE64Decoder base64De = new BASE64Decoder(); byte [] byteMing = nullbyte [] byteMi = nullString strMing = ""try {byteMi = base64De.decodeBuffer(strMi); byteMing = this .decryptByte(byteMi);strMing = new String(byteMing, "UTF8" );} catch (Exception e) {throw new RuntimeException("Error initializing SqlMap class. Cause: " + e); } finally {base64De = nullbyteMing = nullbyteMi = null}return strMing;}/*** 加密以 byte[] 明文输入,byte[] 密文输出** @param byteS* @return*/private byte [] encryptByte( byte [] byteS) { byte [] byteFina = nullCipher cipher;try {cipher = Cipher.getInstance ( "DES" );cipher.init(Cipher. ENCRYPT_MODE , key ); byteFina = cipher.doFinal(byteS);} catch (Exception e) {throw new RuntimeException("Error initializing SqlMap class. Cause: " + e);} finally {cipher = null}return byteFina;}/*** 解密以 byte[] 密文输入 , 以 byte[] 明文输出** @param byteD* @return*/private byte [] decryptByte( byte [] byteD) {Cipher cipher;byte [] byteFina = nulltry {cipher = Cipher.getInstance ( "DES" );cipher.init(Cipher. DECRYPT_MODE , key );byteFina = cipher.doFinal(byteD);} catch (Exception e) {throw new RuntimeException("Error initializing SqlMap class. Cause: " + e);} finally {cipher = null}return byteFina;}/*** 文件 file 进行加密并保存目标文件 destFile 中** @param file* 要加密的文件如 c:/test/srcFile.txt* @param destFile* 加密后存放的文件名如c:/ 加密后文件 .txt*/public void encryptFile(String file, String destFile) throws Exception { Cipher cipher = Cipher.getInstance ( "DES" );// cipher.init(Cipher.ENCRYPT_MODE, getKey());cipher.init(Cipher. ENCRYPT_MODE , this . key );InputStream is = new FileInputStream(file);OutputStream out = new FileOutputStream(destFile);CipherInputStream cis = new CipherInputStream(is, cipher);byte [] buffer = new byte [1024];int r;while ((r = cis.read(buffer)) > 0) {out.write(buffer, 0, r);}cis.close();is.close();out.close();}/*** 文件采用 DES 算法解密文件** @param file* 已加密的文件如 c:/ 加密后文件 .txt ** @param destFile* 解密后存放的文件名如 c:/ test/ 解密后文件 .txt*/public void decryptFile(String file, String dest) throws Exception {Cipher cipher = Cipher.getInstance ( "DES" );cipher.init(Cipher. DECRYPT_MODE , this . key );InputStream is = new FileInputStream(file);OutputStream out = new FileOutputStream(dest);CipherOutputStream cos = new CipherOutputStream(out, cipher);byte [] buffer = new byte [1024];int r;while ((r = is.read(buffer)) >= 0) {cos.write(buffer, 0, r);}cos.close();out.close();is.close();}public static void main(String[] args) throws Exception {DESUtil des = new DESUtil( "1234567" );// DES 加密文件// des.encryptFile("G:/test.doc", "G:/ 加密test.doc");// DES 解密文件// des.decryptFile("G:/ 加密 test.doc", "G:/ 解密 test.doc"); String str1 = " 要加密的字符串test"// DES 加密字符串 String str2 = des.encryptStr(str1);// DES 解密字符串 String deStr = des.decryptStr(str2);System. out .println( " 加密前:" + str1);System. out .println( " 加密后:" + str2);System. out .println( " 解密后:" + deStr);}}6. 比较对称加密算法和公开密钥算法,分析它们的异同。