杭电密码学DES密码实验报告

杭电密码学DES密码实验报告
杭电密码学DES密码实验报告

课程实验报告

课程密码学实验

学院通信工程学院

专业信息安全

班级14083611

学号14084125

学生姓名刘博

实验名称DES密码实验

授课教师胡丽琴

DES密码实验

一、实验要求:

1、了解分组密码的起源与涵义。

2、掌握DES密码的加解密原理。

3、用Visual C++实现DES密码程序并输出结果。

二、实验内容:

1、1949年,Shannon发表了《保密系统的通信理论》,奠定了现代密码学的基础。他还指出混淆和扩散是设计密码体制的两种基本方法。扩散指的是让明文中的每一位影响密文中的许多位,混淆指的是将密文与密钥之间的统计关系变得尽可能复杂。而分组密码的设计基础正是扩散和混淆。在分组密码中,明文序列被分成长度为n的元组,每组分别在密钥的控制下经过一系列复杂的变换,生成长度也是n的密文元组,再通过一定的方式连接成密文序列。

2、DES是美国联邦信息处理标准(FIPS)于1977年公开的分组密码算法,它的设计基于Feistel对称网络以及精心设计的S盒,在提出前已经进行了大量的密码分析,足以保证在当时计算条件下的安全性。不过,随着计算能力的飞速发展,现如今DES已经能用密钥穷举方式破解。虽然现在主流的分组密码是AES,但DES的设计原理仍有重要参考价值。在本实验中,为简便起见,就限定DES 密码的明文、密文、密钥均为64bit,具体描述如下:

明文m是64bit序列。

初始密钥K是64 bit序列(含8个奇偶校验bit)。

子密钥K1, K2…K16均是48 bit序列。

轮变换函数f(A,J):输入A(32 bit序列), J(48 bit序列),输出32 bit序列。

密文c是64 bit序列。

1)子密钥生成:

输入初始密钥,生成16轮子密钥K1, K2 (16)

初始密钥(64bit)经过置换PC-1,去掉了8个奇偶校验位,留下56 bit,接着分成两个28 bit的分组C0与D0,再分别经过一个循环左移函数LS1,得到C1与D1,连成56 bit数据,然后经过置换PC-2,输出子密钥K1,以此类推产生K2至K16。

注意:置换PC-1、PC-2会在下文中会具体给出; 函数LS i 为向左循环移动 1个位置(i=1,2,9,16)

2个位置(i=3,4,5,6,7,8,10,11,12,13,14,15)。详见下图:

2) 轮变换函数f :

f 是DES 加解密中每一轮的核心运算,输入A(32 bit), J(48 bit),输出32 bit 。 将A 做一个扩展运算E ,变成48 bit ,记为E(A)。计算B=E(A)⊕J ,将B 分为8组B 1…B 8,每组B i 为6 bit ,通过相应的S 盒S i ,输出C i 为4 bit ,将所有C i 连成C(32 bit),再通过置换P ,得到最后的输出f(A,J),为32 bit 。在加密或解密的第i 轮,A = R i-1,J = K i 。

注意:每个S 盒S i 是4×16的矩阵,输入b 0b 1b 2b 3b 4b 5 (6 bit),令L 是b 0b 5对应的十进制数,n 是b 1b 2b 3b 4对应的十进制数,输出矩阵中第L 行n 列所对应数的二进制表示。 详见下图:

初始密钥(64bit)

置换PC-1

C 1

D 1 D 0(28bit) C 0(28bit) 置换PC-2

K 1

LS 1 LS 1 LS 2

LS 2

LS 1LS 16 C 16

D 16

置换PC-2

K 16

3) 加/解密:

DES 的加密和解密几乎一样,不同之处在于加密时输入是明文,子密钥使 用顺序为K 1K 2…K 16;解密时输入是密文,子密钥使用顺序为K 16K 15…K 1。 以加密为例,输入明文分组64 bit ,先进行一次初始置换IP ,对置换后的数据X 0分成左右两半L 0与R 0,根据第一个子密钥K 1对R 0实行轮变换f(R 0, K 1),将结果与L 0作逐位异或运算,得到的结果成为下一轮的R 1,R 0则成为下一轮的L 1。如此循环16次,最后得到L 16与R 16。可用下列公式简洁地表示:

16

21,

),(111,,,i R L K R f L R i i i i i i ==⊕=---

最后对64 bit 数据R 16, L 16实行IP 的逆置换IP -1,即得密文分组。

注意:第16轮变换后并未交换L 16与R 16,而直接将R 16, L 16作为IP -1的输入。 详见下图:

A (32bit)

E(A) (48bit)

B 1 B 2 B 3 B 4 B 5 B 6 B 7 B 8 J (48bit)

E

S 1

S

S 8

S

S

S 5

S 4

S 3

C 1 C 2 C 3 C 4 C 5 C 6 C 7 C 8

P f(A,J) (32bit)

6 bit 4 bit

3、使用Visual C++编写程序,实现DES 密码及输出界面, 主要步骤:

1) 新建一个空项目,取名des 。

2) 在左边的解决方案资源管理器中添加cpp 文件,取名为des.cpp 。 3) 在des.cpp 中先写入

#include using namespace std;

static bool SubKey[16][48]; //定义子密钥,使得所有函数都能调用

static const unsigned char IP_Table[64] = { //定义IP 置换表

58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4,

L 0

输入 初始置换IP

R 0

f

K 1

R 1=L 0⊕f(R 0,K 1)

L 1=R 0

f

K i

L 15=R 14

R 15=L 14⊕f(R 14,K 15)

f

R 16=L 15⊕f(R 15,K 16

K 16

L 16=R 15

逆初始置换IP -1

输出

62,54,46,38,30,22,14,6,64,56,48,40,32,24,16,8,

57,49,41,33,25,17,9,1,59,51,43,35,27,19,11,3,

61,53,45,37,29,21,13,5,63,55,47,39,31,23,15,7};

static const unsigned char IPInv_Table[64] = { //定义IP逆置换表40,8,48,16,56,24,64,32,

39,7,47,15,55,23,63,31,

38,6,46,14,54,22,62,30,

37,5,45,13,53,21,61,29,

36,4,44,12,52,20,60,28,

35,3,43,11,51,19,59,27,

34,2,42,10,50,18,58,26,

33,1,41,9,49,17,57,25};

static const unsigned char E_Table[48] = { //定义E扩展表32,1,2,3,4,5,4,5,6,7,8,9,

8,9,10,11,12,13,12,13,14,15,16,17,

16,17,18,19,20,21,20,21,22,23,24,25,

24,25,26,27,28,29,28,29,30,31,32,1};

static const unsigned char P_Table[32] = { //定义P置换表16,7,20,21,29,12,28,17,1,15,23,26,5,18,31,10,

2,8,24,14,32,27,3,9,19,13,30,6,22,11,4,25};

static const unsigned char PC1_Table[56] = { //定义PC1置换表57,49,41,33,25,17,9,1,58,50,42,34,26,18,

10,2,59,51,43,35,27,19,11,3,60,52,44,36,

63,55,47,39,31,23,15,7,62,54,46,38,30,22,

14,6,61,53,45,37,29,21,13,5,28,20,12,4};

static const unsigned char PC2_Table[48] = { //定义PC2置换表14,17,11,24,1,5,3,28,15,6,21,10,

23,19,12,4,26,8,16,7,27,20,13,2,

41,52,31,37,47,55,30,40,51,45,33,48,

44,49,39,56,34,53,46,42,50,36,29,32};

static const unsigned char LS_Table[16] = { //定义左移位数表1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};

static unsigned char S_Box[8][4][16] = { //S盒//S1

14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7,

0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8,

4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0,

15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13,

//S2

15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10,

3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5,

0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15,

13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9,

//S3

10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8,

13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1,

13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7,

1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12,

//S4

7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15,

13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9,

10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4,

3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14,

//S5

2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9,

14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6,

4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14,

11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3,

//S6

12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11,

10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8,

9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6,

4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13,

//S7

4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1,

13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6,

1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2,

6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12,

//S8

13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7,

1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2,

7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8,

2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11};

4) 编写各个模块函数,例如:

void ByteToBit(bool* Out, const unsigned char* In, int bits);

//将字符数组In转化为bool数组Out,bits控制转换bit数void HalfByteToBit(bool* Out, const unsigned char* In, int bits);

//将半字符数组In(4 bit)转化为bool数组Out

void BitToByte(unsigned char* Out, const bool* In, int bits);

//将bool数组In转化为字符数组Out

void Transform(bool* Out, bool* In, const unsigned char* Table, int len);

//利用置换表Table将bool数组In转换成长度为len的bool数组Out void RotateL(bool* In, int len, int loop);

//对长度为len的bool数组In循环左移loop位

void Des_SetSubKey(unsigned char Key[8]);

//利用初始密钥Key生成16轮子密钥SubKey,

注意前文已定义static bool SubKey[16][48];

void Xor(bool* InA, bool* InB, int len);

//将bool数组InB与InA逐位做异或,结果存入InA

void S_Func(bool Out[32], bool In[48]);

//利用S盒S_Box将bool数组In转换为bool数组Out void F_Func(bool In[32], bool Ki[48]);

//利用子密钥Ki对bool数组In做轮变换函数,结果仍存入In void Des_Run(unsigned char Out[8], unsigned char In[8], bool flag);

//Des加解密:输入字符数组In,输出字符数组Out,

flag=1时代表加密,flag=0时代表解密。

5) 编写主函数,主要步骤有

输入明文字符序列(8个字符);

输入密钥字符序列(8个字符);

生成16轮子密钥;

加密并输出密文;

解密并输出解密后的明文。

提示点:

1)输入输出尽量使用cin、cout这两个函数,编写函数时多输出中间变量查看结果。

2)函数memcpy(void *dest, const void *src, size_t n) 用于将源地址src处n

个单位数据拷贝至目的地址dest处, 适用于bool数组的拷贝。

3)部分函数参考代码

void Transform(bool* Out, bool* In, const unsigned char* Table, int len) {

bool Temp[256]; //临时数组长度定义成足够大的即可

for(int i=0;i

Temp[i] = In[Table[i]-1];

memcpy(Out, Temp, len);

}

void ByteToBit(bool* Out, const unsigned char* In, int bits)

{ for (int i=0;i

Out[i] = (In[i/8]>>(7-i%8)) & 1; }

void HalfByteToBit(bool* Out, const unsigned char* In, int bits)

{ for (int i=0;i

Out[i] = (In[i/4]>>(3-i%4)) & 1; }

void BitToByte(unsigned char* Out, const bool* In, int bits)

{ for(int i=0;i

Out[i/8] = (In[i]<<(7-i%8)) + Out[i/8]; }

DES密码程序代码如下:(置换表, S盒等已有的代码不用写) #include "stdafx.h"

#include "13113424_yf.h"

#include "13113424_yfDlg.h"

#include

#include

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

const char IP_Table[64]=

{

58,50,42,34,26,18,10, 2,60,52,44,36,28,20,12, 4, //置换IP

62,54,46,38,30,22,14, 6,64,56,48,40,32,24,16, 8,

57,49,41,33,25,17, 9, 1,59,51,43,35,27,19,11, 3,

61,53,45,37,29,21,13, 5,63,55,47,39,31,23,15, 7

};

const char IPR_Table[64]=

{

40, 8,48,16,56,24,64,32,39, 7,47,15,55,23,63,31, //逆置换IP

38, 6,46,14,54,22,62,30,37, 5,45,13,53,21,61,29,

36, 4,44,12,52,20,60,28,35, 3,43,11,51,19,59,27,

34, 2,42,10,50,18,58,26,33, 1,41, 9,49,17,57,25

};

static char E_Table[48]=

{ //扩展E变换

32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9,

8, 9,10,11,12,13,12,13,14,15,16,17,

16,17,18,19,20,21,20,21,22,23,24,25,

24,25,26,27,28,29,28,29,30,31,32, 1

};

static char PC1_Table[56]=

{

57,49,41,33,25,17, 9, 1,58,50,42,34,26,18, //拣选变换PC-1

63,55,47,39,31,23,15, 7,62,54,46,38,30,22,

14, 6,61,53,45,37,29,21,13, 5,28,20,12, 4

};

static char Move_Table[16]=

{ //变换左移LS

1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1

};

static char PC2_Table[48]=

{

14,17,11,24, 1, 5, 3,28,15, 6,21,10, //拣选变换PC-2 23,19,12, 4,26, 8,16, 7,27,20,13, 2,

41,52,31,37,47,55,30,40,51,34,33,48,

44,49,39,56,34,53,46,42,50,36,29,32

};

static char S_Box[8][4][16]=

{ //8个S-盒置换表

14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7,

0,15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8,

4, 1,14, 8,13, 6, 2,11,15,12, 9, 7, 3,10, 5, 0,

15,12, 8, 2, 4, 9, 1, 7, 5,11, 3,14,10, 0, 6,13,

15, 1, 8,14, 6,11, 3, 4, 9, 7, 2,13,12, 0, 5,10,

3,13, 4, 7,15, 2, 8,14,12, 0, 1,10, 6, 9,11, 5,

0,14, 7,11,10, 4,13, 1, 5, 8,12, 6, 9, 3, 2,15,

13, 8,10, 1, 3,15, 4, 2,11, 6, 7,12, 0, 5,14, 9,

10, 0, 9,14, 6, 3,15, 5, 1,13,12, 7,11, 4, 2, 8,

13, 7, 0, 9, 3, 4, 6,10, 2, 8, 5,14,12,11,15, 1,

13, 6, 4, 9, 8,15, 3, 0,11, 1, 2,12, 5,10,14, 7,

1,10,13, 0, 6, 9, 8, 7, 4,15,14, 3,11, 5, 2,12,

7,13,14, 3, 0, 6, 9,10, 1, 2, 8, 5,11,12, 4,15,

13, 8,11, 5, 6,15, 0, 3, 4, 7, 2,12, 1,10,14, 9,

10, 6, 9, 0,12,11, 7,13,15, 1, 3,14, 5, 2, 8, 4,

3,15, 0, 6,10, 1,13, 8, 9, 4, 5,11,12, 7, 2,14,

2,12, 4, 1, 7,10,11, 6, 8, 5, 3,15,13, 0,14, 9,

14,11, 2,12, 4, 7,13, 1, 5, 0,15,10, 3, 9, 8, 6,

4, 2, 1,11,10,13, 7, 8,15, 9,12, 5, 6, 3, 0,14,

11, 8,12, 7, 1,14, 2,13, 6,15, 0, 9,10, 4, 5, 3,

12, 1,10,15, 9, 2, 6, 8, 0,13, 3, 4,14, 7, 5,11,

9,14,15, 5, 2, 8,12, 3, 7, 0, 4,10, 1,13,11, 6,

4, 3, 2,12, 9, 5,15,10,11,14, 1, 7, 6, 0, 8,13,

4,11, 2,14,15, 0, 8,13, 3,12, 9, 7, 5,10, 6, 1,

13, 0,11, 7, 4, 0, 1,10,14, 3, 5,12, 2,15, 8, 6,

1, 4,11,13,12, 3, 7,14,10,15, 6, 8, 0, 5, 9, 2,

6,11,13, 8, 1, 4,10, 7, 9, 5, 0,15,14, 2, 3,12,

13, 2, 8, 4, 6,15,11, 1,10, 9, 3,14, 5, 0,12, 7,

1,15,13, 8,10, 3, 7, 4,12, 5, 6,11, 0,14, 9, 2,

7,11, 4, 1, 9,12,14, 2, 0, 6,10,13,15, 3, 5, 8,

2, 1,14, 7, 4,10, 8,13,15,12, 9, 0, 3, 5, 6,11

};

static char P_Table[32]=

{ //P-盒矩阵16, 7,20,21,29,12,28,17, 1,15,23,26, 5,18,31,10,

2, 8,24,14,32,27, 3, 9,19,13,30, 6,22,11, 4,25

};

static bool SubKey[16][48]={0};

void BitsCopy(bool *DatOut,bool *DatIn,int Len)

{

int i=0;

for(i=0;i

{

DatOut[i]=DatIn[i];

}

}

void ByteToBit(bool *DatOut,char *DatIn,int Num)

{

int i=0;

for(i=0;i

{

DatOut[i]=(DatIn[i/8]>>(i%8))&0x01;

}

}

void BitToByte(char *DatOut,bool *DatIn,int Num)

{

int i=0;

for(i=0;i<(Num/8);i++)

{

DatOut[i]=0;

}

for(i=0;i

{

DatOut[i/8]|=DatIn[i]<<(i%8);

}

}

//初始置换IP

void TablePermute(bool *DatOut,bool *DatIn,const char *Table,int Num)

{

int i=0;

static bool Temp[256]={0};

for(i=0;i

{

Temp[i]=DatIn[Table[i]-1]; // 原来的数据按对应的表上的位置排列}

BitsCopy(DatOut,Temp,Num); // 把缓存Temp的值输出

}

// 子密钥的移位

void LoopMove(bool *DatIn,int Len,int Num) // 循环左移Len数据长度Num移动位数

{

static bool Temp[256]={0}; // 缓存OK

BitsCopy(Temp,DatIn,Num); // 将数据最左边的Num位(被移出去的)存入Temp BitsCopy(DatIn,DatIn+Num,Len-Num); // 将数据左边开始的第Num移入原来的空间

BitsCopy(DatIn+Len-Num,Temp,Num); // 将缓存中移出去的数据加到最右边

}

// 按位异或

void Xor(bool *DatA,bool *DatB,int Num) // 异或函数

{

int i=0;

for(i=0;i

{

DatA[i]=DatA[i]^DatB[i]; // 异或

}

}

// 输入48位输出32位与Ri异或

void S_Change(bool DatOut[32],bool DatIn[48]) // S盒变换

{

int i,X,Y; // i为8个S盒

for(i=0,Y=0,X=0;i<8;i++,DatIn+=6,DatOut+=4) // 每执行一次,输入数据偏移6位

{ // 每执行一次,输出数据偏移4位Y=(DatIn[0]<<1)+DatIn[5]; // af代表第几行

X=(DatIn[1]<<3)+(DatIn[2]<<2)+(DatIn[3]<<1)+DatIn[4]; // bcde代表第几列

ByteToBit(DatOut,&S_Box[i][Y][X],4); // 把找到的点数据换为二进制}

}

// F函数

void F_Change(bool DatIn[32],bool DatKi[48]) // F函数

{

static bool MiR[48]={0}; // 输入32位通过E选位变为48位

TablePermute(MiR,DatIn,E_Table,48);

Xor(MiR,DatKi,48); // 和子密钥异或

S_Change(DatIn,MiR); // S盒变换

TablePermute(DatIn,DatIn,P_Table,32); // P置换后输出

}

void SetKey(char KeyIn[8]) // 获取子密钥Ki

{

int i=0;

static bool KeyBit[64]={0}; // 密钥二进制存储空间

static bool *KiL=&KeyBit[0],*KiR=&KeyBit[28]; // 前28,后28共56

ByteToBit(KeyBit,KeyIn,64); // 把密钥转为二进制存入KeyBit TablePermute(KeyBit,KeyBit,PC1_Table,56); // PC1表置换

for(i=0;i<16;i++)

{

LoopMove(KiL,28,Move_Table[i]); // 左移

LoopMove(KiR,28,Move_Table[i]);

TablePermute(SubKey[i],KeyBit,PC2_Table,48);

// 二维数组SubKey[i]为每一行起始地址

// 每移一次位进行PC2置换得Ki 48位

}

}

void PlayDes(bool MesOut[64],char MesIn[8]) // DES加密

{

int i=0;

static bool MesBit[64]={0}; // 明文二进制存储空间64位

static bool Temp[32]={0};

static bool *MiL=&MesBit[0],*MiR=&MesBit[32];

ByteToBit(MesBit,MesIn,64); // 把明文换成二进制存入MesBit TablePermute(MesBit,MesBit,IP_Table,64);

for(i=0;i<16;i++) // 迭代16次

{

BitsCopy(Temp,MiR,32); // 临时存储

F_Change(MiR,SubKey[i]); // F函数变换

Xor(MiR,MiL,32); // 得到Ri

BitsCopy(MiL,Temp,32); // 得到Li

}

TablePermute(MesOut,MesBit,IPR_Table,64);

}

void KickDes(char MesOut[8],bool MesBit[64]) // DES解密

{

int i=0;

static bool Temp[32]={0};

static bool *MiL=&MesBit[0],*MiR=&MesBit[32]; // 指针分开前32位和后32位TablePermute(MesBit,MesBit,IP_Table,64);

for(i=15;i>=0;i--)

{

BitsCopy(Temp,MiL,32);

F_Change(MiL,SubKey[i]);

Xor(MiL,MiR,32);

BitsCopy(MiR,Temp,32);

}

TablePermute(MesBit,MesBit,IPR_Table,64);

BitToByte(MesOut,MesBit,64);

}

char MyKey[200]={0}; //密钥

char MyMessage[200]={0}; //明文

bool MesHex[64]={0}; //用来储存密文的64位2进制代码

void CMy13113424_yfDlg::OnButton1()

{

UpdateData(TRUE);

int i,j;

for(i = 0;i < m_key.GetLength();i++)

MyKey[i] = m_key.GetAt(i);

SetKey(MyKey);

char str[9];

m_miwen = m_mingwen;

int m=m_mingwen.GetLength();

int t=0;

for(i = 0;i < m_mingwen.GetLength();i+=8)

{

memset(str,0,sizeof(str));

for (j=i;j

str[j-i]=m_mingwen.GetAt(j);

PlayDes(MesHex,str);

for (int i=0;i<64;i++)

m_miwen+=MesHex[i]+'0';

}

UpdateData(FALSE);

}

void CMy13113424_yfDlg::OnButton2()

{

UpdateData(TRUE);

int i,j;

// KickDes(MyMessage,MesHex); //解密到Mymessage中int m=m_miwen.GetLength();

char str[9];

bool ss[64];

for(i = 0;i

{

memset(str,0,sizeof(str));

for (j=i;j

ss[j-i]=m_miwen.GetAt(j)-'0';

KickDes(str,ss);

for (int j=0;j<8;j++)

m_mingwen_pro+=str[j];

}

UpdateData(FALSE);

}

DES密码输出界面截屏如下:

1密码学-DES实验报告

南京信息工程大学实验(实习)报告实验(实习)名称对称密码实验(实习)日期得分指导教师 系计软院专业网络工程年2011 班次 1 姓名学号20111346026 一.实验目的 1.理解对称加密算法的原理和特点 2.理解DES算法的加密原理 二.实验内容 第一阶段:初始置换IP。在第一轮迭代之前,需要加密的64位明文首先通过初始置换IP 的作用,对输入分组实施置换。最后,按照置换顺序,DES将64位的置换结果分为左右两部分,第1位到第32位记为L0,第33位到第64位记为R0。 第二阶段:16次迭代变换。DES采用了典型的Feistel结构,是一个乘积结构的迭代密码算法。其算法的核心是算法所规定的16次迭代变换。DES算法的16才迭代变换具有相同的结构,每一次迭代变换都以前一次迭代变换的结果和用户密钥扩展得到的子密钥Ki作为输入;每一次迭代变换只变换了一半数据,它们将输入数据的右半部分经过函数f后将其输出,与输入数据的左半部分进行异或运算,并将得到的结果作为新的有半部分,原来的有半部分变成了新的左半部分。用下面的规则来表示这一过程(假设第i次迭代所得到的结果为LiRi): Li = Ri-1; Ri = Li-1⊕f(Ri-1,Ki);在最后一轮左与右半部分并未变换,而是直接将R16 L16并在一起作为未置换的输入。 第三阶段:逆(初始)置换。他是初始置换IP的逆置换,记为IP-1。在对16次迭代的结果(R16 L16)再使用逆置换IP-1后,得到的结果即可作为DES加密的密文Y输出,即Y = IP-1 (R16 L16) 三.流程图&原理图

流程图

DES原理图

密码学实验报告

密码学实验报告 学院:计算机科学与技术 班级: 学号: 姓名: 指导老师:

密码学 实验日志 实验题目: DES (或AES )分组密码 实验目的: 熟悉分组密码加解密算法的基本原理,加深对所提供的部分源程序的理解; 分组密码将明文分成一组一组,在密钥的控制下,经过加密变换生成一组一组的密文。具体而言,分组密码就是将明文消息序列 ,,,,21i m m m 划分成等长的消息组 ),,,,(),,,,(22121n n n n m m m m m m ++在密钥t k k k k ,,,21 =的控制下按固定的加密算法一组一 组进行加密,输出一组一组密文 ),,,,(),,,,(22121l l l l c c c c c c ++。 下面的实验以DES 算法为例,DES 算法明文分组长为64bit ,加密后得到64bit 的密文,输入初始种子密钥为64bit ,第8、16、24、32、40、48、56、64为奇偶校验位,实际的密钥长为56bit 。DES 加密过程由三个阶段来完成: (1) 初始置换IP ,用于重排明文分组的64bit 数据; (2) 相同结构的16轮迭代,每轮中都有置换和代换运算,第16轮变换的输出分为左右两半,并交换次序。 (3) 逆初始置换IP -1 (为IP 的逆)后,产生64bit 的密文。 实验要求: (1) Windows 系列操作系统; (2) VC6.0编程环境。 (3) 提交完整的程序代码清单和详细的注释; (4) 要求有程序运行结果显示。当加密成功时,得到密文;输入相同的密钥,能将密文恢复成明文。 实验主要步骤: (1) 熟悉分组密码加解密算法的基本原理,加深对所提供的部分源程序的理解; (2) 分析源程序中密码算法的加解密和子密钥生成等典型模块的主要功能,并对源程序加上注释; (3) 在已提供的部分源程序的基础上,添加源程序省缺的部分; (4) 对给定的消息分组进行加解密运算和验证。 源代码: #include #include #include typedef bool (*PSubKey)[16][48]; enum {ENCRYPT,DECRYPT}; //选择:加密;解密 static bool SubKey[2][16][48]; // 16圈子密钥 static bool Is3DES; // 3次DES 标志 static char Tmp[256], deskey[16]; //暂存字符串,密钥串

实验报告_密码学

信息安全实验报告 学号: 学生姓名: 班级:

实验三密码学实验 一、古典密码算法实验 一、实验目的 通过编程实现替代密码算法和置换密码算法,加深对古典密码体制的了解,为深入学习密码学奠定基础。 二、编译环境 运行windows 或linux 操作系统的PC 机,具有gcc(linux)、VC (windows)等C语言编译环境。 三、实验原理 古典密码算法历史上曾被广泛应用,大都比较简单,使用手工和机械操作来实现加密和解密。它的主要应用对象是文字信息,利用密码算法实现文字信息的加密和解密。下面介绍两种常见的具有代表性的古典密码算法,以帮助读者对密码算法建立一个初步的印象。 1.替代密码 替代密码算法的原理是使用替代法进行加密,就是将明文中的字符用其它字符替代后形成密文。例如:明文字母a、b、c、d ,用D、E、F、G做对应替换后形成密文。 替代密码包括多种类型,如单表替代密码、多明码替代密码、多字母替代密码、多表替代密码等。下面我们介绍一种典型的单表替代密码,恺撒(caesar)密码,又叫循环移位密码。它的加密方法,就是将明文中的每个字母用此字符在字母表中后面第k个字母替代。它的加密过程可以表示为下面的函数:E(m)=(m+k) mod n 其中:m 为明文字母在字母表中的位置数;n 为字母表中的字母个数;k 为密钥;E(m)为密文字母在字母表中对应的位置数。例如,对于明文字母H,其在字母表中的位置数为8,设k=4,则按照上式计算出来的密文为L:E(8) = (m+k) mod n = (8+4) mod 26 = 12 = L

2.置换密码 置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改 变,从而实现明文信息的加密。置换密码有时又称为换位密码。 矩阵换位法是实现置换密码的一种常用方法。它将明文中的字母按照给的 顺序安排在一个矩阵中,然后用根据密钥提供的顺序重新组合矩阵中字母,从而 形成密文。例如,明文为attack begins at five,密钥为cipher,将明文按照每行 6 列的形式排在矩阵中,形成如下形式: a t t a c k b e g i n s a t f i v e 根据密钥cipher中各字母在字母表中出现的先后顺序,给定一个置换: 1 2 3 4 5 6 f = 1 4 5 3 2 6 根据上面的置换,将原有矩阵中的字母按照第 1 列,第 4 列,第 5 列,第 3 列, 第2列,第 6 列的顺序排列,则有下面形式: a a c t t k b i n g e s a I v f t e 从而得到密文:abatgftetcnvaiikse 其解密的过程是根据密钥的字母数作为列数,将密文按照列、行的顺序写出,再根据由密钥给出的矩阵置换产生新的矩阵,从而恢复明文。 四、实验内容和步骤 1、根据实验原理部分对替代密码算法的介绍,自己创建明文信息,并选择 一个密钥k,编写替代密码算法的实现程序,实现加密和解密操作。 2、根据实验原理部分对置换密码算法的介绍,自己创建明文信息,并选择一个密钥,编写置换密码算法的实现程序,实现加密和解密操作。 五、总结与思考 记录程序调试过程中出现的问题,分析其原因并找出解决方法。记录最终实现的程序执行结果。

密码学实验报告模板总结模板计划模板.doc

密码学应用与实践课程实验报告 实验 1:实现 DES密码体制 一、实验目的 1.编写程序实现 DES的加、解 密:1)编程构造 DES的密钥; 2)应用上述获得的密钥将一段英文或文件进行加、解密。 2.用 DES算法实现口令的安全 二、实验内容 1.DES原理 DES综合运用了置换,代换,移位多种密码技术,是一种乘积密码。在算法结构上采用迭代 结构,从而使其结构清晰,调理清楚,算法为对合运算,便于实现,运行速度快。DES使用了初始置换IP 和 IP-1 各一次(相应的置换看算法描述图表)置换P16 次,安排使用这 3 个置换的目的是把数据彻底打乱重排。选择置换 E 一方面把数据打乱重排,另一方面把32 位输入扩展为48 位,算法中除了S- 盒是非线性变换外,其余变换均为显示变换,所以保密 的关键是选择S- 盒。符合以下 3 条准则: (1)对任何一个 S- 盒而言,没有任何线性方程式等价于此S-盒的输出输入关系,即是S- 盒是非线性函数。 (2)改变 s- 盒的任何一位输入,都会导致两位以上的输出改变,即满足" 雪崩效应 " 。(3)当固定某一个位的输入时,S- 盒的 4 个出位之间,其中0 和 1 的个数之差小。这个准 则的本质是数据压缩,把四位输入压缩为 4 位输出。选择 S-盒函数的输入中任意改变数位, 其输出至少变化两位。因为算法中使用了16 次迭代,大大提高了保密性。 2.DES算法由加密、解密和子密钥的生成三部分组成 1)加密 DES算法处理的数据对象是一组64 比特的明文串。设该明文串为m=m1m2m64 (mi=0 或 1) 。明文串经过64 比特的密钥K 来加密,最后生成长度为64 比特的密文E。其加密过程图示如下:

密码学实验第三组实验报告

云南大学数学与统计学实验教学中心实验报告 课程名称:密码学实验学期:2013-2014学年第一学期成绩: 指导教师:陆正福学生姓名:卢富毓学生学号:20101910072 实验名称:零知识证明实验要求:必做实验学时:4学时 实验编号: No.3 实验日期:2013/9/28完成日期:2012/10/18 学院:数学与统计学院专业:信息与计算科学年级: 2010级 一、实验目的: 了解零知识证明,同时掌握FFS识别方案。 二、实验内容: 1. 理解零知识证明 2. 基于GMP实现FFS零知识证明方案 三、实验环境 Linux平台 Code::Block IDE https://www.360docs.net/doc/1c350795.html, 网络在线编程平台(本实验是在此平台中完成的,效果一样) 四、实验过程(请学生认真填写): 1. 预备知识: “零知识证明”它指的是证明者能够在不向验证者提供任何有用的信息的情况下,使验证者相信某个论断是正确的。零知识证明实质上是一种涉及两方或更多方的协议,即两方或更多方完成一项任务所需采取的一系列步骤。证明者向验证者证明并使其相信自己知道或拥有某一消息,但证明过程不能向验证者泄漏任何关于被证明消息的信息。 2. 实验过程 A、原理分析: Feige-Fait-Shamir是一种并行的认证形式。具体做法如下 首先:选择大素数q 和p, 计算n=pq ,Peggy 拥有密钥s1, s2, ...,sk 接着做如下UML图中的内容:

//缺点有:首先在编写好程序后才发现,无法模拟伪造者来进行。这个由结果就能看出来。 //同时,此程序仅仅模拟,做不到并行认证。 五、实验总结 1.遇到的问题、分析并的出方案(列出遇到的问题和解决办法,列出没有解决的问题):遇到问题: 主要是对于算法的不熟悉,不能清晰的认识整个算法运作。 分析并解决: 仔细揣摩,并且动手写了一下算法的UML图。得到了加深。 2.体会和收获。 收获: 加深了GMP中函数的运用。 在学习零知识证明的知识后,了解了什么是零知识证明,同时会了一点零知识证明的方法。这是比较大的收获——毕竟以前从没有想过这方面的东西,接触之后才恍然。 当然这个FFS算法也并不是一定的安全。也存在着一定的缺陷和漏洞,例如验证次数、对于vi的猜测等等。 六、参考文献 GMP_Document 《应用密码学》林岱岳 《密码学概论》wade trape 七、教师评语:

密码学实验报告(AES,RSA)

华北电力大学 实验报告| | 实验名称现代密码学课程设计 课程名称现代密码学 | | 专业班级:学生姓名: 学号:成绩: 指导教师:实验日期:

[综合实验一] AES-128加密算法实现 一、实验目的及要求 (1)用C++实现; (2)具有16字节的加密演示; (3)完成4种工作模式下的文件加密与解密:ECB, CBC, CFB,OFB. 二、所用仪器、设备 计算机、Visual C++软件。 三. 实验原理 3.1、设计综述 AES 中的操作均是以字节作为基础的,用到的变量也都是以字节为基础。State 可以用4×4的矩阵表示。AES 算法结构对加密和解密的操作,算法由轮密钥开始,并用Nr 表示对一个数据分组加密的轮数(加密轮数与密钥长度的关系如表2所示)。AES 算法的主循环State 矩阵执行1 r N 轮迭代运算,每轮都包括所有 4个阶段的代换,分别是在规范中被称为 SubBytes(字节替换)、ShiftRows(行位移变换)、MixColumns(列混合变换) 和AddRoundKey ,(由于外部输入的加密密钥K 长度有限,所以在算法中要用一个密钥扩展程序(Keyexpansion)把外部密钥 K 扩展成更长的比特串,以生成各轮的加密和解密密钥。最后执行只包括 3个阶段 (省略 MixColumns 变换)的最后一轮运算。 表2 AES 参数 比特。

3.2、字节代替(SubBytes ) AES 定义了一个S 盒,State 中每个字节按照如下方式映射为一个新的字节:把该字节的高4位作为行值,低4位作为列值,然后取出S 盒中对应行和列的元素作为输出。例如,十六进制数{84}。对应S 盒的行是8列是4,S 盒中该位置对应的值是{5F}。 S 盒是一个由16x16字节组成的矩阵,包含了8位值所能表达的256种可能的变换。S 盒按照以下方式构造: (1) 逐行按照升序排列的字节值初始化S 盒。第一行是{00},{01},{02},…,{OF}; 第二行是{10},{l1},…,{1F}等。在行X 和列Y 的字节值是{xy}。 (2) 把S 盒中的每个字节映射为它在有限域GF(k 2)中的逆。GF 代表伽罗瓦域,GF(82) 由一组从0x00到0xff 的256个值组成,加上加法和乘法。 ) 1(] [2)2(3488++++= x x x x X Z GF 。{00}被映射为它自身{00}。 (3) 把S 盒中的每个字节记成),,,,,,,,(012345678b b b b b b b b b 。对S 盒中每个字节的每位 做如下变换: i i i i i i c b b b b b i b ⊕⊕⊕⊕⊕='++++8mod )7(8mod )6(8mod )5(8mod )4( 上式中i c 是指值为{63}字节C 第i 位,即)01100011(),,,,,,,,(012345678=c c c c c c c c c 。符号(')表示更新后的变量的值。AES 用以下的矩阵方式描述了这个变换: ?? ? ?? ? ? ? ? ? ??? ? ????????????+???????????????????????????????????????? ????????????=??????????????????????????0110001111111000011111000011111000011111100011111100011111100011111100017654321076543210b b b b b b b b b b b b b b b b 最后完成的效果如图:

密码学实验讲义及实验报告2014

密码学基础 实验指导书 黑龙江大学计算机科学技术学院 2013年3月

目录 前言........................................................................................................................... - 2 -要求与评分标准....................................................................................................... - 3 -1要求. (3) 2评分标准 (3) 实验1 古典密码的实现(3学时) .................................................................... - 4 -实验2 对称密钥密码体制的实现(6学时) .................................................... - 4 -实验3 公开密钥密码算法的实现(6学时) .................................................... - 5 -实验4 数字签名算法的实现(3学时) ............................................................ - 5 -附录1:实验报告格式 ........................................................................................... - 7 -

密码学实验报告总结

密码学实验报告(本文档为Word版本,下载后可自由编辑) 项目名称:××××××××× 项目负责人:××× 联系电话:××××× 编制日期:×××××

密码学实验报告 实验目的:掌握Caesar密码加密解密原理,并利用VC++编程实现。 实验内容:Caesar密码的加密原理是对明文加上一个密钥(偏移值)而得到密文。假设密钥为3,那么字母“a”对应的ASCII码为97,加上3得100正好是字母“d”的ASCII码值, 实验说明:加密实现的两种方式,只限定英文字母(区分大小写),加密时,根据明文字符是小(大)写字母,采用加密运算: 密文字符=“a”或“A”+(明文字符-“a”或“A”+password%26+26)%26 如果输入其他字符,则直接原样输出,不作处理 可以是任意字符 加密时,我们不做任何区分,直接利用Caesar密码算法 密文字符=明文字符+password 解密反之。 实验结果: void CCaesarDlg::OnButton1() //加密按钮 { UpdateData(TRUE); //从界面上的输入的值传入成员变量 m_crypt=m_plaintxt; //密文进行初始化,它与明文的长度是相同的 for(int i=0;i=48&&m_plaintxt.GetAt(i)<=57) //如果输入的字符是数字 { m_crypt.SetAt(i,'0'+(m_plaintxt.GetAt(i)-'0'+m_password%10 +10)%10);

现代密码学-古典密码实验报告

现代密码学 实 验 报 告 院系:理学院 班级:信安二班 姓名: 学号:

前言 密码学(Cryptology)是研究秘密通信的原理和破译秘密信息的方法的一门学科。密码学的基本技术就是对数据进行一组可逆的数学变换,使未授权者不能理解它的真实含义。密码学包括密码编码学(Cryptography)和密码分析学(Cryptanalyst)两个既对立又统一的主要分支学科。研究密码变化的规律并用之于编制密码以保护信息安全的科学,称为密码编码学。研究密码变化的规律并用之于密码以获取信息情报的科学,称为密码分析学,也叫密码破译学。 密码学在信息安全中占有非常重要的地位,能够为信息安全提供关键理论与技术。密码学是一门古老而深奥的学问,按其发展进程,经历了古典密码和现代密码学两个阶段。现代密码学(Modern Cryptology)通常被归类为理论数学的一个分支学科,主要以可靠的数学方法和理论为基础,为保证信息的机密性、完整性、可认证性、可控性、不可抵赖性等提供关键理论与技术。

古典密码算法实验 在密码编码体制中有两种基本也是古老的编码体制一直沿用至今,它们是代替密码和置换密码,其历史悠久并且是现代密码体制的基本组成部分,在密码学中占有重要地位。古典密码是密码学发展的一个阶段,也是近代密码学产生的渊源,一般把Shannon 在1949 年发表“保密系统的通信理论”之前的时期称为古典密码时期。尽管古典密码大多比较简单,一般可用手工或机械方式实现,且都可用统计分析方法破译,目前已很少采用。但是,古典密码所采用的代替技术和置换技术仍然是现代分组密码算法设计的基础,了解它们的设计原理,有助于理解、设计和分析现代密码。 一、实验目的 通过编程实现经典的代替密码算法和置换密码,包括移位密码、维吉尼亚密码、周期置换密码、列置换密码,加深对代替技术的了解,为现代分组密码实验奠定基础。 二、实验原理 代替(Substitution)是古典密码中基本的处理技巧,就是将明文字母由其他字母表中

《现代密码学》实验报告

现代密码学实验报告 学生姓名骆秀娟 学号0909121906 专业班级计科1204班 指导教师段桂华 学院信息科学与工程学院 完成时间2014年4月25日

实验一对称密码算法实验 [实验目的] 1.掌握密码学中经典的对称密码算法DES、AES、RC4的算法原理。 2.掌握DES、AES、RC4的算法流程和实现方法。 [实验预备] 1.DES算法有什么特点?算法中的哪些结构保证了其混淆和扩散的特性? 2.AES算法的基本原理和特点。 3.流密码RC4的密钥流生成以及S盒初始化过程。 [实验内容] 1.分析DES、AES、RC4、SHA的实现过程。 2. 用程序设计语言将算法过程编程实现。 3. 完成字符串数据的加密运算和解密运算 输入明文:Idolikethisbook 输入密钥:cryption [实验步骤] 1. 预习DES、AES、RC4算法。 2. 写算法流程,用程序设计语言将算法过程编程实现。 3. 输入指定的明文、密钥进行实验,验证结果。 4. 自己选择不同的输入,记录输出结果。 写出所编写程序的流程图和运行界面、运行结果。

DES程序流程图: DES运行结果:

AES程序流程图: AES运行结果:

RC4流程图:

RC4运行结果: [问题讨论] 1. 在DES算法中有哪些是弱密钥?哪些是半弱密钥? 2. 改变明文或密钥中的一个比特值可能影响AES值中的多少比特? 3.分析实验中在编辑、编译、运行等各环节中所出现的问题及解决方法。 回答问题 解:1>弱密钥有以下几种情况:全0;全1;一半为0,一半为1; 半弱密钥如下:E01F E01F E01F E01F FE01 FE01 FE01 FE01 E001 E001 F101 F101 FE1F FE1F FE01 FE01 2>改变一个比特值最多改变4个AES值。 3>在RC4实验中,为了将输入的char型密钥分个存储进数组中,刚开始我想把它转化为string型,再存储,但是string型数据不能直接从键盘输入,且最后

密码学实验报告

《—现代密码学—》 实验指导书 适用专业:计算机科学与技术 江苏科技大学计算机科学学院 2011年11 月 实验一古典密码 实验学时:2学时 实验类型:验证 实验要求:必修 一、实验目的

编程实现古典密码的加解密方法。 二、实验内容 (1)移位密码的加密和解密函数。 (2)仿射密码的加密和解密函数。 (3)维吉尼亚密码的加密和解密函数。 三、实验原理、方法和手段 (1)移位密码 对于明文字符x ,加密密钥k ,加密方法为 ,1,2,,25y x k k =+= 解密方法为 ,1,2,,25x y k k =-= (2)仿射密码 对于明文字符x ,加密密钥(,)a b ,加密方法为 ,gcd(,26)1,1,2,,25y ax b a b =+== 解密方法为 1()x a y b -=- (3)维吉尼亚密码 选取密钥字Key ,将明文按照密钥字长度分组,将明文与密钥字对应字符相加并对26求余,即为密文字符。 i i i y x k =+ 解密过程为 i i i x y k =- 四、实验组织运行要求 本实验采用集中授课形式,每个同学独立完成上述实验要求。 五、实验条件 每人一台计算机独立完成实验,有如下条件: (1)硬件:微机;

(2)软件:VC++6.0、VC++.Net 2005。 六、实验步骤 (1)将各函数编写完成; (2)在主函数中调用各函数,实现加密和解密。 七、实验报告 实验报告主要包括实验目的、实验内容、实验原理、源程序及结果。移位密码加密: #include #define n 3 //移位位数 void change(char string[]) { int i; for(i=0;string[i]!='\0';i++) { if(string[i]>='a'&&string[i]<='z') string[i]=(string[i]+n>='z'?string[i]+n-26:string[i]+n); } } void main() { char str[100]; printf("请输入一段明文"); gets(str); change(str); printf("密文为:\n"); puts(str); }

密码学实验报告

江苏大学 学院计算机学院 专业信息安全0902 姓名*** 学号3090604035 小组成员*******

AES对称加密算法实现 一.AES对称加密算法实现原理 AES(The Advanced Encryption Standard)接受一个128位的明文,并且在一个128、192或者256位秘密密钥的控制下产生一个128位的密文。它是一个替代-置换网络的设计,并且带有一个称作轮(rand)的步骤的集合,其中轮数可以是9、11或者13(取决于密钥的长度),这样可以将明文映射为密文。 AES实际上能定义为在域GF(2)的元素上的一系列标量的运算。它实质上是在整数模2所组成的域,但是它扩展到了多项式域GF(2)[x]中。为了构造一个域,需要使用一个能够不被任何一个具有相同底GF(2)的度数更小的多项式整除的多项式,在AES中选择了v (x)= x^8 + x^4 + x^3 + x + 1。用整数存储时,它表示值0x11B。域中的加法是一个简单异或(xor)操作。乘法就是乘以其他的多项式。一个单元a的乘法逆元是另一个单元b,使得ab模AES的多项式和多项式p(x)=1是同余的。a(x)=0的逆是它本身。 二.AES对称加密算法实现过程 AES 算法是分组密码算法,它的输入分组、输出分组以及加/ 解密过程中的中间分组都是128比特。(对称密码算法根据对明文消息加密方式的不同可分为两大类,即分组密码和流密码。分组密码将消息分为固定长度的分组,输出的密文分组通常与输入的明文分组长度相同。) 1、AES 的加密与解密框图如图所示 (1) 加密变换

设X是AES 的128 比特明文输入,Y是128 比特的密文输出,则AES 密文Y可以用下面的复合变换表示: Y= Ak(r + 1)·R·S·Akr·C·R·S·Ak(r21)·?·C·R·S·Ak1 (X)其中“·”表示复合运算。这里Aki :表示对X 的一个变换Aki (X) = XY Ki (Ki 为第i 轮的子密钥,为比特串的异或运算) 。S:S 盒置换。即对每一个字节用S2Box 做一个置换。S2Box 是一个给定的转换表。R: 行置换。C: 列置换。 s′(x) = a (x) á s (x) 这里á 是特殊的乘法运算 (2) 解密变换 解密变换是加密变换的逆变换。 2、AES(128bits密钥)加密解密流程如下图所示

密码学实验----

《密码学与信息安全》实验报告 专业 班级 姓名 学号 2015年 6 月 5 日

实验一古典密码实验 1实验目的 1.理解代替密码学加密过程 2.理解置换密码学加密过程 2实验内容 1.手动完成Caesar密码 2.Caesar加密 3.Caesar密码分析 4.单表置换密码 5.单表置换密码分析 3实验过程 本练习主机A、B为一组,C、D为一组,E、F为一组。 首先使用“快照X”恢复Windows系统环境。 1.手动完成Caesar密码 (1)在实验原理部分我们已经了解了Caesar密码的基本原理,那么请同学们写出当 密钥k=3时,对应明文:data security has evolved rapidly的密文:data security has evolved rapidly 。 (2)进入实验平台,单击工具栏中的“密码工具”按钮,启动密码工具,在向导区点 击“Caesar密码”。在明文输入区输入明文:data security has evolved rapidly。 将密钥k调节到3,查看相应的密文,并与你手动加密的密文进行比较。 请根据密钥验证密文与明文对应关系是否正确。 2.Caesar加密 (1)进入“加密解密”|“Caesar密码”视图,在明文输入区输入明文(明文应为英 文),单击“加密”按钮进行加密。 请将明文记录在这里:I am a stident 。 (2)调节密钥k的微调按钮或者对照表的移位按钮,选择合适的密钥k值,并记下该密钥k值用于同组主机的解密。加密工作完成后,单击“导出”按钮将密文默认导出到Caesar共享文件夹(D:\Work\Encryption\Caesar\)中,默认文件名为Caesar密文.txt。 (3)通知同组主机接收密文,并将密钥k通告给同组主机。 6 (4)单击“导入”按钮,进入同组主机Work\Encryption\Caesar目录(同组主机IP\Work\Encryption\Caesar),打开Caesar密文.txt。 (5)调节密钥k的微调按钮或对照表的移位按钮,将k设为同组主机加密时的密钥k 值,这时解密已经成功。请将明文写出:I am a stident 。 (6)将解密后的明文与同组主机记录的明文比较,请对比明文是否相同。 3.Caesar密码分析 (1)本机进入“密码工具”|“加密解密”|“Caesar密码”,在明文输入区输入明文(要求明文有一定的意义以便让同组主机分析)。 请将明文记录在这里:I am a stident 。 (2)调节密钥k的微调按钮或者对照表的移位按钮,选择合适的密钥k值完成Caesar 加密,单击“导出”按钮,将密文默认导出到Caesar共享文件夹中。 (3)通告同组主机(不要通告密钥值k)密文已经放在共享文件夹中,让同组主机获 取密文。 (4)单击“导入”按钮将同组主机Caesar密文导入。

密码学实验(MD5实验)

密码学实验 ——计算文件MD5值 姓名: 班级: 学号: 教师: 助教:

【1】Hash算法实验 (1)MD5\SHA1\SHA-256算法比较 A.【相同点】MD5,SHA1,SHA-256属于密码级散列函数,算法相对比较复杂,参与加密算法的过程中时也 比较安全,三者都是属于哈希算法一类,都是任意长 度的消息压缩到某一固定长度的消息摘要的函数B.【不同点】 MD5输出128bit SHA1输出160bit SHA256输出256bit ①普通密码可以用MD5,但数字证书和数字签名就法 定必须用SHA256 ②MD5比SHA1快,SHA1比MD5强度高 C.截图

(2)相同与相似字符串MD5差异比较

【2】Hash算法过程与填充方式

【常见Hash算法的数据填充方式】 1.首位填充1,后面填满0位;【即:先补一个1,然后再补 0,直到长度满足对512取模后余数是448。】 2.补长度;【通常用一个64位的数据来表示原始消息的长度。 如果消息长度不大于2^64,那么第一个字就是0;如果原始的消息长度超过了512,我们需要将它补成512的倍数。 然后我们把整个消息分成一个一个512位的数据块,分别处理每一个数据块,从而得到消息摘要】 【3】计算文件MD5值 1.源代码【hello.exe\erase.exe文件放在其中的src文件夹中】package com.topcheer; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Scanner; publicclass EXEMD5 { /*设置MD5值输出为16进制(从0到F)*/

AES——密码学实验报告

实验报告 【实验名称】AES加密解密实验 姓名:学号:班级:日期:10月20日 【实验目的】 1.掌握AES算法的基本原理 2.了解AES算法的详细步骤 【实验环境】 1.本试验需要密码教学实验系统的支持 2.操作系统为Windows 2000或者Windows XP 【实验内容】 1.掌握AES算法的原理及过程 2.完成AES密钥扩展运算 3.完成AES数据加密运算 【实验步骤】 1.打开“AES理论学习”,掌握DES算法的加解密原理; 2.打开“AES算法流程”,开始DES单步加密实验,如图10-1; 3.选择密钥输入为ASCII码或十六进制码模式,输入密钥;若为ASCII码模式,则输入 8个字符的ASCII码;若为十六进制码模式,则输入16个字符的十六进制码(0~9,a~f,A~F); 4.点击“字节矩阵”按钮,将输入的密钥转化为密钥字节矩阵,从左至右每一列依次 为W0, W1, W2, W3; 5.依次点击“RotWord”、“SubWord”、“轮常量异或”,对W3依次进行“循环移 位”、“S盒”、“轮常量异或”操作并与W0异或得到W4,; 6.点击“异或”按钮,使得W1与W4进行异或得到W5 7.点击“生成W6和W7”按钮,生成W6和W7 8.点击“生成所有轮密钥”按钮,生成1~10轮轮密钥

9.进入第二部分——加密,选择加密输入为ASCII码或十六进制码模式,输入明文;若 为ASCII码模式,则输入8个字符的ASCII码;若为十六进制码模式,则输入16个字符的十六进制码(0~9,a~f,A~F); 10.点击“字节矩阵”按钮,将输入明文转化为明文字节矩阵; 11.点击“AddRoundKey”按钮,使明文字节矩阵与密文字节矩阵进行逐比特异或; 12.接下来进行第一轮操作,依次点击“SubBytes”、“ShiftRows”、“MixColumns”、

密码学-DES实验报告

南京信息工程大学实验(实习)报告实验(实习)名称实验(实习)日期得分指导教师------ 系计算机专业软件工程年2011 班次 3 姓名唐一鑫学号24 一.实验目的 1.理解对称加密算法的原理和特点 2.理解DES算法的加密原理 二.实验内容 第一阶段:初始置换IP。在第一轮迭代之前,需要加密的64位明文首先通过初始置换IP 的作用,对输入分组实施置换。最后,按照置换顺序,DES将64位的置换结果分为左右两部分,第1位到第32位记为L0,第33位到第64位记为R0。 第二阶段:16次迭代变换。DES采用了典型的Feistel结构,是一个乘积结构的迭代密码算法。其算法的核心是算法所规定的16次迭代变换。DES算法的16才迭代变换具有相同的结构,每一次迭代变换都以前一次迭代变换的结果和用户密钥扩展得到的子密钥Ki作为输入;每一次迭代变换只变换了一半数据,它们将输入数据的右半部分经过函数f后将其输出,与输入数据的左半部分进行异或运算,并将得到的结果作为新的有半部分,原来的有半部分变成了新的左半部分。用下面的规则来表示这一过程(假设第i次迭代所得到的结果为LiRi): Li = Ri-1; Ri = Li-1⊕f(Ri-1,Ki);在最后一轮左与右半部分并未变换,而是直接将R16 L16并在一起作为未置换的输入。 第三阶段:逆(初始)置换。他是初始置换IP的逆置换,记为IP-1。在对16次迭代的结果(R16 L16)再使用逆置换IP-1后,得到的结果即可作为DES加密的密文Y输出,即Y = IP-1 (R16 L16)

三.流程图&原理图 流程图

DES原理图

3DES——密码学实验报告

实验报告 【实验名称】DES单步加密实验 姓名:学号:班级:日期:9月29日 【实验目的】 1.掌握DES算法的基本原理 2.了解DES算法的详细步骤 【实验环境】 1.本试验需要密码教学实验系统的支持 2.操作系统为Windows 2000或者Windows XP 【实验内容】 1.掌握DES算法的原理及过程 2.完成DES密钥扩展运算 3.完成DES数据加密运算 【实验步骤】 1.打开“DES理论学习”,掌握DES算法的加解密原理; 2.打开“DES算法流程”,开始DES单步加密实验,如图10-1; 3.选择密钥输入为ASCII码或十六进制码模式,输入密钥;若为ASCII码模式,则输入 8个字符的ASCII码;若为十六进制码模式,则输入16个字符的十六进制码(0~9,a~f,A~F); 4.点击“比特流”按钮,将输入的密钥转化为64位比特流; 5.点击“置换选择I”按钮,完成置换选择I运算,得到56bit有效密钥位,并分为左 右两部分,各28bit; 6.点击C0下的“循环左移”按钮,对C0进行循环左移运算; 7.点击D0下的“循环左移”按钮,对D0进行循环左移运算; 8.点击“选择置换II”按钮,得到扩展子密钥K1;

9.进入第二部分——加密,选择加密输入为ASCII码或十六进制码模式,输入明文; 若为ASCII码模式,则输入8个字符的ASCII码;若为十六进制码模式,则输入16个字符的十六进制码(0~9,a~f,A~F); 10.点击“比特流”按钮,将输入明文转化为64位比特流; 11.点击“初始IP置换”按钮,将64bit明文进行IP置换运算,得到左右两部分,各 32bit; 12.点击“选择运算E”按钮,将右32bit扩展为48bit; 13.点击“异或运算”按钮,将扩展的48bit与子密钥K1进行按位异或; 14.依次点击“S1”、“S2”、“S3”、“S4”、“S5”、“S6”、“S7”、“S8”按 钮,对中间结果分组后进行S盒运算; 15.点击“置换运算P”按钮,对S盒运算结果进行P置换运算; 16.点击“异或运算”按钮,将P置换运算结果与L0进行按位异或,得到R1;

现代密码学实验报告

现代密码学实验报告 学生姓名 学号 专业班级 指导教师 学院信息科学与工程学院 完成时间2014年5月

实验一对称密码算法实验 [实验目的] 1.掌握密码学中经典的对称密码算法DES、AES、RC4的算法原理。 2.掌握DES、AES、RC4的算法流程和实现方法。 [实验预备] 1.DES算法有什么特点?算法中的哪些结构保证了其混淆和扩散的特性? 答:分组比较短、密钥太短、密码生命周期短、运算速度较慢。采用替代和置换的方法简单有效地遵循了香农定理,替代操作通过S盒达到了混淆效果,置换操作通过P盒扩散效果。 2.AES算法的基本原理和特点。 答:AES加密数据块分组长度必须为128比特,密钥长度可以是128比特、192比特、256比特中的任意一个(如果数据块及密钥长度不足时,会补齐)。AES加密有很多轮的重复和变换。大致步骤如下:1、密钥扩展(KeyExpansion),2、初始轮(Initial Round),3、重复轮(Rounds),每一轮又包括:SubBytes、ShiftRows、MixColumns、AddRoundKey,4、最终轮(Final Round),最终轮没有MixColumns。 3.流密码RC4的密钥流生成以及S盒初始化过程。 答:RC4由伪随机数生成器和异或运算组成。RC4的密钥长度可变,围是[1,255]。RC4一个字节一个字节地加解密。给定一个密钥,伪随机数生成器接受密钥并产生一个S盒。S盒用来加密数据,而且在加密过程中S盒会变化。初始化长度为256的S盒。第一个for循环将0到255的互不重复的元素装入S盒。第二个for循环根据密钥打乱S盒。下面i,j是两个指针。每收到一个字节,就进行while循环。通过一定的算法((a),(b))定位S盒中的一个元素,并与输入字节异或,得到k。循环中还改变了S盒((c))。如果输入的是明文,输出的就是密文;如果输入的是密文,输出的就是明文。 [实验容] 1.分析DES、AES、RC4、SHA的实现过程。 2. 用程序设计语言将算法过程编程实现。 3. 完成字符串数据的加密运算和解密运算 输入明文:Idolikethisbook 输入密钥:cryption [实验步骤] 1. 预习DES、AES、RC4算法。 2. 写出算法流程,用程序设计语言将算法过程编程实现。

密码学基础实验报告模板课件.doc

实验总成绩: 报 告 份 数 : 西安邮电大学 通信与信息工程学院 ————————————————————密——码——学 —— 报告 装 订 线 专业班级: 学生姓名: 学号( 班内序号): 2015 年 12 月 25 日

————————————————————————————————

实验一棋盘密码 一.实验目的 编写实现棋盘密码体制的程序并进行验证 二.实验要求 1.能对明文中出现的26 个英文字母(包括大小写)及标点符号等加密。2.从键盘输入密钥并输出棋盘进行验证。 3.能对给定的明文或密文进行正确的加密和解密。 三.实验原理 古代最早的棋盘密码体制是这样的:将26 个字母排列在一个5*5 的方格里,其中i 和j 填在同一个里,每个字母对应一数,其中分别是该字母所在的行、列标号。这样就可以将明文的字母集合转换成密文的数字集合。 四.实验步骤 1. 编写实现棋盘密码体制的程序,包括加密和解密。 2. 运行程序,输入棋盘密钥。 3. 选择加密,并输入明文,根据棋盘验证加密结果是否正确。 4. 选择解密,并输入密文,根据棋盘验证解密结果是否正确。 5.流程图: 五.实验结果

二仿射密码 实验 验目的 一.实 行验 证 。 体制的程序并进 现仿射密码 实 编 写 验要求 二、实 1给出仿射密码的的加密程序。 2 要求密钥从键盘输入。 3 掌握仿射密码的密码译制,弄清其加密过程。 验原理 三、实 令P = C = Z26 , K = { (a,b) ∈Z26 * Z26 },对任意的(a , b) ∈K,定义:加密:y = e k(x) = (a * x + b) mod 26, 解密:d k(y) = a -1 ( y - b) mod 26 . a , b为密钥,密钥空间为26 ×26。 足 a 与26 互素。这是在加密的过程中,要使所加密有唯一的解,必须 满 由下面的定理得出。 a∈Z m , a为任意的,b ∈Z m ,同余方程: 定理:设 a * x ≡ b mod m 有唯一解的充要条件是: a 与m 互素。 验流程 四、实

相关文档
最新文档