信息安全综合实践
- 格式:docx
- 大小:3.53 MB
- 文档页数:46
目录
实验一 网络通信安全
1.1实验目的
1.2实验内容
1.3相关知识
1.4实验成果
1.5实验小结
实验二 网络攻防
2.1实验目的
2.2实验内容
2.3实验原理
2.4实验步骤
2.5实验小结
实验三 Web服务器配置
3.1实验目的
3.2实验要求
3.3实验内容
3.4实验小结
实验四 信息系统安全
4.1实验目的
4.2实验内容
4.3开发环境
4.4系统实现
4.5实验小结
实验一 网络通信安全
1.1实验目的
通过本章的学习,使学生掌握密码学在通信安全中的具体应用。基本要求能够实现客户服务器通信,能够使用AES算法实现消息的加密与解密,对优秀的学生要求能够实现数字签名的生成与验证
1.2实验内容
(1)实现客户服务器之间的通信;
(2)发送方传输的消息使用AES加密,接收方对消息解密获取明文;
(3)发送方传输的消息使用HMAC处理,接收方验证消息的完整性;
(4)发送方对传输的消息使用RSA进行签名,接收方验证数字签名。
1.3相关知识
1.3.1对称密码AES
1997年美国国家标准和技术委员会NIST宣布征集一个新的对称密钥分组密码算法,以取代DES作为新的加密标准,新的算法被命名为高级加密标准AES。经过角逐,由比利时密码学家Daemen和Rijment共同设计的Rijndael算法成为最后赢家。
目前的AES算法是一个迭代型分组密码,其分组长度和密钥长度都可变,各自支持128比特、192比特、256比特。
与DES相同,AES也是由最基本的变换单位——“轮”多次迭代而成的,当分组长度和密钥分组长度均为128bit时,轮数为N=10。AES的轮(除最后一轮)变换由四个不同的变换组成,这些变化被称之为内部轮函数,可以表示成如下形式:
Round(State,RoundKey){
SubBytes(State);
ShiftRows(State);
MixColumns(State);
AddRoundKey(State,RoundKey);}
State表示消息矩阵;RoundKey表示轮密钥矩阵;SubBytes(State)为字节代替变换、ShiftRows(State)为行移位变换、MixColumns(State)为列混合变换、AddRoundKey(State,RoundKey)为与子密钥异或。
最后一轮略微不同,将其记为FinalRoundKey(State,RoundKey),相当于前面的Round(State,RoundKey)去掉MixColumns(State)。
对于加密来说,输入到第一轮的State就是明文消息矩阵,最后一轮输出的State就是对应的密文消息矩阵。
AES的解密变换和加密变换时互逆的,轮函数也分为4层,分别为InvShiftRow(State)逆行移位变换、InvByteSub(State)逆字节代替变换、AddRoundKey(State,RoundKey)与子密钥位异或和InvMixColumn(State)逆列混合变换,可表示为:
InvRound(State,RoundKey){
InvShiftRow(State);
InvByteSub(State);
AddRoundKey(State,RoundKey);
InvMixColumn(State);}
AES加密过程
1.3.2公钥密码RSA
RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和明文
明文State化 RoundKey
SubBytes(State) ShiftRows(State)
MixColumns(State)
AddRoundKey(State,
RoundKey) RoundKey SubBytes(State)
ShiftRows(State)
AddRoundKey(State,
RoundKey) RoundKey LenAdleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。
RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
算法描述:
(1)密钥的产生
选择两个保密的大素数p和q;计算n=p*q,φ(n)=(p-1)(q-1),其中,φ(n)是n的欧拉函数值;选一整数e,满足1
(2)加密
加密时首先将明文比特串分组,是的每个分组对应的十进制数小于n,然后对每个明文分组m,做加密运算:c=m mod n。
(3)解密
对密文分组的解密运算为:m=c mod n。
RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。
1.4实验成果
我们使用JAVA语言(eciple工具)完成实验。
1.4.1代码分析
思路分析:首先完成客户服务器通信模块,然后插入加密模块
下面贴出部分代码以供分析
发送部分:
package kehuduan; //客户端的程序代码
import java.awt.BorderLayout;
import .*;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import javax.swing.JPanel;
import javax.swing.JFrame;
import java.awt.Panel;
import java.awt.Rectangle;
import java.awt.GridBagLayout;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import .DatagramPacket;
import .DatagramSocket;
import .InetAddress;
import java.security.Key;
public class Kehuduan extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel jContentPane = null;
private JLabel jLabel = null;
private JTextField jTextField = null;
private JTextField jTextField1 = null;
private JButton jButton = null;
private JLabel jLabel1 = null;
public Kehuduan() {
super();
initialize();
}
private void initialize() {
this.setSize(398, 258);
this.setContentPane(getJContentPane());
this.setTitle("客户端");
}
private JPanel getJContentPane() {
if (jContentPane == null) {
jLabel1 = new JLabel();
jLabel1.setBounds(new Rectangle(21, 61, 116, 21)); jLabel1.setText("输入发送的消息:");
jLabel = new JLabel();
jLabel.setBounds(new Rectangle(20, 12, 115, 25));
jLabel.setText("服务器的ip地址:");
jContentPane = new JPanel();
jContentPane.setLayout(null);
jContentPane.add(jLabel, null);
jContentPane.add(getJTextField(), null);
jContentPane.add(getJTextField1(), null);
jContentPane.add(getJButton(), null);
jContentPane.add(jLabel1, null);
}
return jContentPane;
}
private JTextField getJTextField() {
if (jTextField == null) {
jTextField = new JTextField();
jTextField.setBounds(new Rectangle(152, 12, 208, 26));
}
return jTextField;
}
private JTextField getJTextField1() {
if (jTextField1 == null) {
jTextField1 = new JTextField();
jTextField1.setBounds(new Rectangle(22, 98, 341, 67));
}
return jTextField1;
}
public static String Encrypt(String sSrc, String sKey) throws Exception
//加密函数
{
if (sKey == null) {
System.out.print("Key为空null");
return null;
}
//判断Key是否为16位
if (sKey.length() != 16)
{ System.out.print("Key长度不是16位");
return null; }
byte[] raw = sKey.getBytes("ASCII");