网络安全实验报告书

网络安全实验报告

姓名:

班级: 白晨 软件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的公钥,解密并验证签名后的界面:


© 2024 实用范文网 | 联系我们: webmaster# 6400.net.cn