
网络安全第九章密码学与信息加密.doc
11页第九章 密码学与信息加密1. 密码学包含哪些概念?有什么功能?答:密码学(Cryptology)是研究信息系统安全保密的科学,密码编码学(Cryptography)主要研究对信息进行编码,实现对信息的隐藏密码分析学(Cryptanalytics)主要研究加密消息的破译或消息的伪造密码学主要包含以下几个概念:1)密码学的目标:保护数据的保密性、完整性和真实性保密性就是对数据进行加密,使非法用户无法读懂数据信息,而合法用户可以应用密钥读取信息完整性是对数据完整性的鉴别,以确定数据是否被非法纂改,保证合法用户得到正确、完整的信息真实性是数据来源的真实性、数据本身真实性的鉴别,可以保证合法用户不被欺骗2)消息的加密与解密:消息被称为明文,用某种方法伪装消息以隐藏它的内容的过程称为加密,加了密的消息称为密文,而把密文转变为明文的过程称为解密3)密码学的功能:提供除机密性外,密码学还提供鉴别、完整性和抗抵赖性等重要功能这些功能是通过计算机进行社会交流至关重要的需求鉴别:消息的接收者应该能够确认消息的来源;入侵者不可能伪装成他人完整性:消息的接收者应该能够验证在传送过程中消息没有被修改;入侵者不可能用假消息代替合法消息。
抗抵赖性:发送消息者事后不可能虚假地否认他发送的消息4)密码算法和密钥:密码算法也叫密码函数,是用于加密和解密的数学函数通常情况下,有两个相关的函数:一个用做加密,另一个用做解密密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的数据基于密钥的算法通常有两类:对称算法和公开密钥算法对称密钥加密,又称公钥加密,即信息的发送方和接收方用一个密钥去加密和解密数据它的最大优势是加/解密速度快,适合于对大数据量进行加密,但密钥管理困难非对称密钥加密,又称私钥密钥加密它需要使用一对密钥来分别完成加密和解密操作,一个公开发布,即公开密钥,另一个由用户自己秘密保存,即私用密钥信息发送者用公开密钥去加密,而信息接收者则用私用密钥去解密私钥机制灵活,但加密和解密速度却比对称密钥加密慢得多2. 简述对称加密算法的基本原理答:对称算法有时又称为传统密码算法,加密密钥能够从解密密钥中推算出来,反过来也成立在大多数对称算法中,加解密的密钥是相同的在对称加密算法中,数据发信方将明文(原始数据)和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。
在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥对称算法要求发送者和接收者在安全通信之前,协商一个密钥对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都能对消息进行加解密对称算法的加密和解密表示为:EK(M)=CDK(C)=M3. 利用对称加密算法对“1234567”进行加密,并进行解密includeclass 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>key_in[i][j];if(j!=7) key_out[i][j]=key_in[i][j];}}4. 简述公开密钥算法的基本原理。
答:公开密钥算法,加密密钥能够公开,即陌生者能用加密密钥加密信息,但只有用相应的解密密钥才能解密信息如果发信方想发送只有收信方才能解读的加密信息,发信方必须首先知道收信方的公钥,然后利用收信方的公钥来加密原文;收信方收到加密密文后,使用自己的私钥才能解密密文显然,采用不对称加密算法,收发信双方在通信之前,收信方必须将自己早已随机生成的公钥送给发信方,而自己保留私钥公开密钥 K1加密表示为:E K1(M)=C公开密钥和私人密钥是不同的,用相应的私人密钥 K2解密可表示为:D K2(C)=M5. 利用公开密钥算法对“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 key public 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 = null byte [] byteMing = null String 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 = null byteMing = null byteMi = null } return strMi; } /** * 解密 以 String 密文输入 ,String 明文输出 * * @param strMi * @return */ public String decryptStr(String strMi) { BASE64Decoder base64De = new BASE64Decoder(); byte [] byteMing = null byte [] byteMi = null String 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 = null byteMing = null byteMi = null } return strMing; } /** * 加密以 byte[] 明文输入,byte[] 密文输出 * * @param byteS * @return */ private byte [] encryptByte( byte [] byteS) { byte [] byteFina = null Cipher 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 = null try { 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: "。
