网络安全实验报告书
网络安全实验报告
姓名:
班级: 白晨 软件22
指导老师: 田暄
提交日期:
2015-12-10
目录
1 加解密与认证 ............................................................................................................................... 2
1.1
1.2
1.3
2 实验环境 ................................................................................................................... 2 源代码与注释 ........................................................................................................... 2 运行结果与分析 ...................................................................................................... 2 RC4流密码加密实现 ................................................................................................................ 10
2.1
2.2
2.3 实验环境 ................................................................................................................. 10 源代码与注释 ......................................................................................................... 10 运行结果与分析 .................................................................................................... 12
3 大于3人实现证书生成、签发、通信 ................................................................................... 13
3.1
3.2 实验环境 ................................................................................................................. 13 实验过程与分析 .................................................................................................... 13
加解密与认证
要求:结合所提供密码学开发库或利用Java,vc 自带密码学开发库完成如下要求
1)设计实现消息的机密性,完整性与可鉴别,认证要求。
2)报告中要有思路分析,设计流程与关键代码。每步变换后的结果
3)要求结合个人信息进行,如消息中应包含个人学号,姓名等
4)应使用到消息分组,不能太短
1.1 实验环境
语言 : Java
IDE : Eclipse绿色版
1.2 源代码与注释
import java.security.InvalidKeyException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.Signature;
import java.security.SignatureException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
public class EncryptionAndDecryption {
private static final int GROUP_SIZE = 128;
1
private static final int GROUP_MSG_SIZE = 28; // 28 bytes per group
private static final int = 24;
private static final int DIGEST_SIZE = 20;
private static final int OFFSET_GROUP_SIZE = 20;
private static final int OFFSET_CUR_GROUP = 22;
private static final int OFFSET_MSG_START = 24;
private static final int OFFSET_SIGN_SIZE = 77;
private static final int OFFSET_SIGN_START = 78;
/* Attributes
***********************************************/
private String mMsg;
private byte[][] mCipers;
private MessageDigest mMsgDigest;
private KeyPairGenerator mKeyPairGenerator;
private PublicKey mPublicKey;
private PrivateKey mPrivateKey;
private Signature mSignature;
private KeyGenerator mKeyGenerator;
private SecretKey mDesKey;
private Cipher mCipher;
*************************************/
public EncryptionAndDecryption() {
try {
mMsgDigest = MessageDigest.getInstance("SHA-1");
mKeyPairGenerator =
KeyPairGenerator.getInstance("DSA");
// Signature Algorithm is DSA
SecureRandom secrand = new SecureRandom();
// Random
secrand.setSeed("BC".getBytes()); // Use bytes of text to generate a seed
mKeyPairGenerator.initialize(512, secrand);
// Generate the key pair
KeyPair keys = mKeyPairGenerator.generateKeyPair(); // Get keys
mPublicKey = keys.getPublic(); mPrivateKey = keys.getPrivate(); //
mSignature = Signature.getInstance("DSA");
mKeyGenerator = KeyGenerator.getInstance("DES"); // Encryption Algorithm
mDesKey = mKeyGenerator.generateKey(); // DesKey
mCipher = Cipher.getInstance("DES"); // Cipher
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
}
}
/**
* Split the message into group (28bytes per group)
* @return the message groups
*/
private byte[][] splitMsg() {
final int groupSize = (mMsg.length()*2+1) /
GROUP_MSG_SIZE + 1;
// System.out.println(groupSize);
// System.out.println(mMsg.length());
byte[][] msgs = new byte[groupSize][GROUP_MSG_SIZE]; byte[] msgBytes = mMsg.getBytes();
//System.out.println(msgBytes.length);
for (int i = 0; i
for (int j = 0; (j
GROUP_MSG_SIZE + j
msgs[i][j] = msgBytes[i * GROUP_MSG_SIZE + j];
}
}
return msgs;
}
/**
* Encryption
* @return Cipher
*/
public byte[][] encrypt() {
// Split the plain text into group
byte[][] plains = splitMsg(); // Plain text group
//System.out.println(plains.length);
//System.out.println(mMsg.length());
print(plains);
byte[][] groups = new byte[plains.length][GROUP_SIZE]; // Message before encryption
byte[][] ciphers = new byte[plains.length][];
// Message after encryption
// Encrypt the groups
for (int i = 0; i
mMsgDigest.update(plains[i].clone());
byte[] digest = mMsgDigest.digest();
// Sign the message
byte[] signs = new byte[0];
try {
mSignature.initSign(mPrivateKey);
mSignature.update(digest);
signs = mSignature.sign();
} catch (SignatureException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
}
// Fill digest
for(int j = 0; j
groups[i][j] = digest[j];
}
// Fill signature information
groups[i][OFFSET_SIGN_SIZE] = (byte) signs.length; for (int s = 0; s
groups[i][OFFSET_SIGN_START + s] = signs[s]; }
// Fill the information of current group
byte[] groupSize = toByteArray(plains.length, 2); groups[i][OFFSET_GROUP_SIZE] = groupSize[0];
groups[i][OFFSET_GROUP_SIZE + 1] = groupSize[1]; byte[] curGroup = toByteArray(i, 2);
groups[i][OFFSET_CUR_GROUP] = curGroup[0];
groups[i][OFFSET_CUR_GROUP + 1] = curGroup[1];
// Fill the message
for(int m = 0; m
plains[i].length; m++) {
groups[i][OFFSET_MSG_START + m] = plains[i][m]; }
// Print groups datum
System.out.println("");
for(byte[] temp : groups)
{
for(byte t: temp)
{
System.out.print(t + " ");
}
System.out.println();
}
// Encrypt the message
try {
mCipher.init(Cipher.ENCRYPT_MODE, mDesKey);
ciphers[i] = mCipher.doFinal(groups[i]);
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
}
}
return ciphers;
}
private byte[] toByteArray(int value, int i) {
// TODO Auto-generated method stub
byte[] b = new byte[i];
b[1] = (byte) ((value>>8) & 0xFF);
b[0] = (byte) (value & 0xFF);
return b;
}
public void setMsg(String msg) {
mMsg = msg;
}
public void setCiphers(byte[][] ciphers) {
mCipers = ciphers;
}
public byte[][] decrypt() {
byte[][] plains = new
byte[mCipers.length][GROUP_MSG_SIZE];
byte[][] = new byte[mCipers.length][GROUP_SIZE]; for (int i = 0; i
byte[] plain = new byte[GROUP_SIZE];
try {
mCipher.init(Cipher.DECRYPT_MODE, mDesKey); plain = mCipher.doFinal(mCipers[i]);
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
// Verify the signature
byte[] signs = new byte[plain[OFFSET_SIGN_SIZE]]; byte[] digest = new byte[DIGEST_SIZE];
// Retrieve the digest
for (int d = 0; d
digest[d] = plain[d];
}
// Retrieve the signs
for (int s = 0; s
signs[s] = plain[OFFSET_SIGN_START + s];
}
try {
mSignature.initVerify(mPublicKey);
mSignature.update(digest);
if (mSignature.verify(signs)) {
// Verify the integrity
mMsgDigest.update(plain, OFFSET_MSG_START, GROUP_MSG_SIZE);
if(MessageDigest.isEqual(digest,
mMsgDigest.digest())) {
// Get current group offset
byte[] curGroup = new byte[2];
curGroup[0] = plain[OFFSET_CUR_GROUP]; curGroup[1] = plain[OFFSET_CUR_GROUP + 1]; int curPos = toInt(curGroup);
for (int j = 0; j
plain[OFFSET_MSG_START + j];
}
}
};
} catch (SignatureException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
}
}
return plains;
}
public static void print(byte plains[][]){
byte[] b = new
byte[(plains.length-1)*GROUP_MSG_SIZE+plains[plains.length-1].length];
int j=0;
int k=0;
for(int i=0;i
b[i] = plains[k][j];
j++;
if(j==plains[0].length){
k++;
j=0;
}
}
System.out.println(new String(b));
}
public int toInt(byte[] b){
int value;
value = (int) ((b[0] & 0xFF)
| ((b[1] & 0xFF)>>8)
);
return value;
}
public static void main(String[] args) {
EncryptionAndDecryption test = new
EncryptionAndDecryption();
test.setMsg("白晨-2121601027-软件学院-软件22-网安实验-加密与解密");
testtest.encrypt());
print(test.decrypt());
}
}
1.3 运行结果与分析
实验所用加密算法为 DES, 签名算法为:DSA, 消息摘要的生成用的为SHA-1,分组为28字节一组,内容结构为:摘要 + 分组信息 + 消息 + 签名长度 + 签名
由于加密是对每一组进行加密的。在组中先填充消息摘要等消息。所以可以看到第二段(第一次加密Group1结束)中 在密文第一个字节(-56)前有一段消息摘要等其他消息。解密后生成摘要与签名的摘要进行比对,没有问题。
RC4流密码加密实现
2.1 实验环境
语言 : Java IDE
: Eclipse绿色版
2.2 源代码
import java.lang.Integer;
class HomeWork {
public static String MyRC4(String aInput,String aKey) {
int[] iS = new int[256];
byte[] iK = new byte[256];
for (int i=0;i
for (short i= 0;i
iK[i]=(byte)aKey.charAt((i % aKey.length())); }
j=0;
for (int i=0;i
j=(j+iS[i]+iK[i]) % 256; int temp = iS[i]; iS[i]=iS[j]; iS[j]=temp; }
int i=0; j=0;
char[] iInputChar = aInput.toCharArray();
2
char[] iOutputChar = new char[iInputChar.length]; for(short x = 0;x
i = (i+1) % 256; j = (j+iS[i]) % 256; int temp = iS[i]; iS[i]=iS[j]; iS[j]=temp;
int t = (iS[i]+(iS[j] % 256)) % 256; int iY = iS[t]; char iCY = (char)iY;
iOutputChar[x] =(char)( iInputChar[x] ^ iCY) ; }
return new String(iOutputChar); }
public static String StrToBinstr(String str) {
char[] strChar=str.toCharArray();
String result="";
for(int i=0;i
result +=Integer.toBinaryString(strChar[i])+ " ";
} return result; }
public static void main(String[] args) {
String inputStr = "软件学院-白晨-软件22 2121601027"; String key = "loveforever"; String MwB = StrToBinstr(inputStr); System.out.println("明文二进制流: " + MwB); // String change = MwB.substring(4, 5); //String NewMwB=change.replace("1", "0");
String str = MyRC4(inputStr,key);
System.out.println("密文: " + str);
System.out.println("明文: " + MyRC4(str,key));
String str1 = MyRC4("软件学院-白晨-软件22 2122601027", key);
System.out.println("将学号里的“1”改成“2”后的密文:" + str1);
System.out.println("原始密文二进制序列为:" + StrToBinstr(str));
System.out.println("修改后密文二进制序列为:" + StrToBinstr(str1)); } }
2.3运行结果与分析
通过实验可以发现,改变明文中的一个字节的数据,只会导致部分密文发生变化,对其他部分没有影响,说明RC4没有雪崩效应。
3 大于3人实现证书生成、签发、通信
3.1 实验环境
平台:Windows 7
实验工具:PGP Desktop 10.0.3
实验人员:李灵杰(lilingjie)、朱鹏宇(zhupengyu)、白晨(baichen)
3.2 实验过程与分析
首先点击 文件—新建PGP密钥 进入下图界面 输入用户名,密码,口令后生成密钥。
导出公钥,使用双方可信任的第三方zhupengyu,给公钥签名并发送给彼此。
将文件lilingjie.txt,用lilingjie的私钥签名,并用baichen的公钥加密,生成lilingjie.txt.pgp文件,传给baichen。
Baichen收到文件后,用自己的私钥解密文件,并用lilingjie的公钥验证签名。
未导入lilingjie的公钥前的仅解密的界面:
导入lilingjie的公钥,解密并验证签名后的界面:
相关文章
- 06医疗机构临床实验室管理办法
- 食品质量与安全专业食品分析课程实验报告分析
- 1-实训中心规章制度汇编
- 微生物实验室生物安全风险评估报告的具体要求
- 各种实验室管理制度
- 实验室管理学
- 健康体检报告中常见质量问题分析论文
- [信息安全技术]实验报告
- 实验室生物安全管理细则
- 检验科工作制度
医疗机构临床实验室管理办法 目录 第一章 总 则 第二章 临床实验室准入管理 第三章 临床实验室质量管理 第四章 临床实验室生物安全管理 第五章 监督管理 第六章 附则 第一章 总 则 第一条 为加强我省医疗机构临床实验室的建设与管理,提高 ...
食品质量与安全专业食品分析课程实验报告分析 关键词:食品质量与安全专业:食品分析:实验报告分析 食品分析作为一门实践性很强的学科,是培养分析检验工作者的一门课程.实验报告既是实验课程的重要内容,又是科学研究的一个重要部分.实验课程的实验报告 ...
江苏省宝应职业教育中心校 实 验 实 习 规 章 制 度 汇 编 (2007年9月修订) 实训中心 2007.9 目 录 教师篇 1 实践教学管理规定„„„„„„„„„„„„„„„„„„ 2 实验实习室精神文明公约„„„„„„„„„„„„„ ...
微生物实验室生物安全风险评估报告的具体要求 这两天忙于准备迎接卫生部"质量万里行"检查.其中有内容要求有:微生物实验室生物风险评估报告内容,这很是让我头晕.好在我以前看过疾病预防控制专业人员培训教材相关内容.并找到这样一 ...
各实验室管理制度 组织胚胎实验室管理制度 一.进入实验室须穿白大衣, 保持实验室安静, 不准随地吐痰, 遵守课堂秩序, 不得迟到.早退. 二.实验前, 应认真复习有关基础理论, 明确实验目的. 三.爱护实验室的一切设施,爱护显微镜,如发现异 ...
第二章 名解 1.质量:"一组固有特性满足要求的程度" 包括在提供服务过程所涉及的要素中,是各环节质量的总和.(有明示的要求:规定. 隐含期望:惯例. 必须履行的要求:国家或地方法律法规要 求和其它强制规定) 2.质量管 ...
主堡壁星笪堡堂苤查!Q!兰生兰旦笙!鲞箜!塑垦坐!!旦!!!尘丛!!!壁!垒四!!Q!兰!∑!!:!!盟!:兰 .经验与信息交流. 健康体检报告中常见质量问题分析 董志远杨晓静郑明春张辉 吕彤辉杨春光胡安梅王志凯陶晓春 近2年来,我们发现北 ...
实验序号: 2 实验名称:姓 名:学 院:专 业:班 级:学 号:指导教师:实验地址:实验日期: 身份验证 戴立 计算机科学与工程学院 物联网工程 2 092312205 乐德广 N6-207 2015-4-10 <信息安全技术> ...
实验室生物安全管理细则 第一章 总 则 第一条 根据<病原微生物实验室生物安全管理条例>(国务院令第424号).<病原微生物实验室生物安全环境管理办法>(国家环保总局令第32号).<实验动物管理条例>(中 ...
一.检验科工作制度 2012-11-07 22:32:39 作者:佚名 来源:本站整理 一份完整的检验科管理工作制度 (一)必须把检验质量放在工作首位,普及提高质量管理和质量控制理论知识,使之成为每个检验人员的自学行动.同时,按照上级卫生行 ...