2023年7月31日发(作者:)

课程名称: 密码学课程设计报告

专业班级: 信息安全1101

学 号: U*********

* 名: ***

指导教师: **

报告日期:___ 2014/3/2 _

计算机科学与技术学院

目 录

1 密码学课程实验的意义.................................................................................... 1

2 实验的目的与要求............................................................................................ 1

2.1SPN——代换置换网络 ........................................................................... 1

2.2 公钥密码RSA ........................................................................................ 1

3 SPN设计 ............................................................................................................ 2

3.1 实验原理 ................................................................................................ 2

3.2 实验环境 ................................................................................................ 2

3.3 实验设计 ................................................................................................ 2

3.3.1 S、P盒子设计 ............................................................... 2

3.3.2 密钥算法设计 ............................................................... 3

3.3.3 线性密码分析 ............................................................... 4

3.3.4 差分密码分析 ............................................................... 5

3.3.5 穷举密钥 ...................................................................... 7

3.3.6 文件操作 ...................................................................... 9

3.4 实验结果 ................................................................................................ 9

4 RSA设计 .......................................................................................................... 14

4.1 实验原理 .............................................................................................. 14

4.2 实验环境 .............................................................................................. 14

4.3 实验设计 .............................................................................................. 15

4.3.1 大素数生成 ................................................................. 15

4.3.2 生成文件 .................................................................... 15

4.3.3 文件加密 .................................................................... 16

4.3.4 文件解密 .................................................................... 18

4.3.5 快速加解密 ................................................................. 22

4.4 实验结果 .............................................................................................. 23

5 实验尝试.......................................................................................................... 28

6 实验体会.......................................................................................................... 30

1 密码学课程实验的意义

当前,重视实验与实践教育是各国高等教育界的发展潮流,实验与实践教学与理论教学是相辅相成的,具有同等重要的地位。它是在开放教育的基础上,为配合理论教学、培养学生分析问题和解决问题的能力以及加强训练学生专业实践能力而设置的教学环节;对于完成教学计划、落实教学大纲,确保教学质量,培养学生分析问题、解决问题的能力和实践操作技能更具有特别重要的意义。

密码学是信息安全与保密技术的核心,是一门实践性非常强的课程,实践教学是培养密码技术应用性人才的重要途径,实践教学质量的好环,实际上也决定了应用型人才培养质量的高低。因此,加强密码学课程实践教学环节,提高实践教学质量,对培养高质量的应用型人才至关重要。

2 实验的目的与要求

2.1SPN——代换置换网络

1、深入理解S盒子P盒子的加密原理。

2、熟悉S、P盒子在加解密过程中的使用方式。

3、对加解密的过程有自己的思考并自主发挥。

2.2 公钥密码RSA

通过实际编程掌握非对称密码算法RSA的加密和解密以及快速加、解密过程,加深对非对称密码算法的认识。

1

3 SPN设计

3.1 实验原理

将输入以16bit分段,作为加密的一个单位;初始密钥根据密钥编排算法得到多个以16bit为单位的轮密钥。在加密过程中,通过与轮密钥的亦或操作得到u,再经过S盒子的代换操作得到v,v经过P盒子的置换操作得到下一轮的输入,在倒数第二轮加密过程中,不需要经过P盒子进行置换,在最后一轮仅仅进行与密钥的与操作,加密结束。

值得注意的是,该SPN的第一个和最后一个操作都是亦或轮密钥,这叫做白化。白化可使一个不知道密钥的攻击者无法开始进行一个加密或解密操作。

3.2 实验环境

操作系统:Windows7系统

编程语言:MFC程序设计

编译器:VS2013

字符编码方式:Unicode编码

3.3 实验设计

3.3.1 S、P盒子设计

S、P盒子分别通过两个一维数组实现。按照书上的S、P盒子进行输入,嵌入程序,如下表1:

表1 S、P盒子

S

P

0

E

1

1

1

4

2

5

2

D

3

3

1

4

4

2

5

5

F

6

6

B

7

7

8

8

8

3

9

A

A

6

B

C

C

5

D

9

E

0

F

7

9 10 11 12 13 14 15 16

7 11 15 4 8 12 16 9 13 2 6 10 14 3

在使用中,S盒子的每一位对应数组中的每一位,P盒子中对应的位置应减一。

程序中预先装入S、P盒子,在图形界面初始化过程中进行S、P盒子的求逆操作用于解密,减少解密时间。求逆代码如下:

2

for (unsigned short int i = 0; i < 16; i++)

{

}

USbox[i] = U_sbox(i);

UPbox[i] = U_pbox(i + 1) + 1;

unsigned short int CSPNDlg::U_sbox(unsigned short int x)

{

}

unsigned short int CSPNDlg::U_pbox(unsigned short int x)

{

for (unsigned short int i = 0; i < 16; i++)

{

}

}

if (Pbox[i] == x)

return i;

for (unsigned short int i = 0; i < 16; i++)

{

}

if (Sbox[i] == x)

return i;

因为在P盒子中的代换是对称的,所以P盒子的求逆操作是多余的。

在得到逆向的盒子之后便可以根据加密的顺序进行解密操作。

3.3.2 密钥算法设计

设计中,密钥以16进制输入,输入长度可以自定义,但是最短长度为8,小于8时会有提示。

轮密钥的多少决定加密的轮数,而轮密钥多少根据输入长度而定。在设计中,轮密钥的数量是密钥位数减三。即在生成密钥时,每16个bit为一轮密钥,每次往后移动一个4bit,以此得到所有密钥。

根据输入的字符串密钥,轮密钥算法代码如下:

BOOL CSPNDlg::PasswordJudge(CString J_password)

{

unsigned short int J_singlep[100];

unsigned int J_passwordlength = J_gth();

if (J_passwordlength != Plen)

{

CString forlengtherr;

3

}

(_T("密钥长度应为 %d,请重新输入!"), Plen);

MessageBox(forlengtherr);

return FALSE;

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

{

}

for (int j = 0; j < Plen - 3; j++)

{

}

return TRUE;

}

J_passwordus[j] = J_singlep[j];

J_passwordus[j] = (J_passwordus[j] << 4) | J_singlep[j + 1];

J_passwordus[j] = (J_passwordus[j] << 4) | J_singlep[j + 2];

J_passwordus[j] = (J_passwordus[j] << 4) | J_singlep[j + 3];

if ((J_password[i] >= '0') && (J_password[i] <= '9'))

{

}

MessageBox(_T("密钥输入有误,请重新输入!"));

return FALSE;

J_singlep[i] = J_password[i] - '0';

J_singlep[i] = J_password[i] - 'a' + 10;

J_singlep[i] = J_password[i] - 'A' + 10;

else if ((J_password[i] >= 'a') && (J_password[i] <= 'f'))

else if ((J_password[i] >= 'A') && (J_password[i] <= 'F'))

else

3.3.3 线性密码分析

根据S盒子的输入输出可以得到相应的偏差,将具有较高偏差值的S盒子用来串行进行分析,可以得到明文与加密过程中与上第四轮密钥后得到的结果之间的一个联系,即输入明文16bit中的第11、9、8位和u4的第10、8、2、1位之间的亦或值与得到它们的过程中的量没有关系。总共生成8000个明密文对,每当这几个bit位的异或值为零时进行一次计数,最终通过比较得到最高计数值进而得到理论上可能的8bit密钥finalkey。分析代码如下:

//攻击代码

long t3 = GetTickCount();

int J_Count[0xff + 1];

for (unsigned short int LL = 0; LL < 0xff+1; LL++)

J_Count[LL] = 0;

4

8);

unsigned short int J_clrper, J_cryper;

unsigned short int v,u,w;

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

{

}

for (unsigned short int key = 0; key < 0xff + 1; key++)

{

}

int max = -1;

unsigned int finalkey = 0;

for (unsigned short int key = 0; key < 0xff+1; key++)

{

}

if (J_Count[key]>max)

{

}

max = J_Count[key];

finalkey = key;

J_Count[key] = J_Count[key] - length/2;

if (J_Count[key] < 0)

J_Count[key] = -J_Count[key];

J_clrper = J_cleartext[i];

J_cryper = J_cryptograph[i];

w = ((J_clrper & 0x0800) >> 11) ^ ((J_clrper & 0x0200) >> 9) ^ ((J_clrper & 0x0100) >>

for (unsigned short int key = 0; key < 0xff + 1; key++)

{

}

v = ((key & 0xf) | ((key << 4) & 0xf00)) ^ J_cryper;

u = USboxrtn(v);

w = w ^ ((u & 0x0400) >> 10) ^ ((u & 0x0100) >> 8) ^ ((u & 0x0004) >> 2) ^ (u

if (w == 0)

J_Count[key]++;

& 0x0001);

3.3.4 差分密码分析

差分密码分析是一个选择明文攻击。与线性密码分析不同的是,差分密码分析包含了将两个输入的亦或与其对应的两个输出的亦或相比较。固定明文的异或值,用同一个密钥对两个明文进行加密得到两个结果,在用过滤操作,去掉特定5

bit位不同的4元组。在本次课程设计实验中,明文的异或值为0xb00,对应密文的第零个和第二个4bit值必须相同。最后计数加一的条件是u4的第零个和第二个4bit是否为0110,最终筛选出100对明密文对。算法如下:

long t1 = GetTickCount();

srand((unsigned)time(NULL));

CString tostring;

unsigned short int ya, yb,y,yx;

TCHAR J_tctostring[2] = { 0, 0 };

for (int i = 0; i < 100;)//生成明文后筛选得到y和y*存储在J_cryptograph中

{

ya = rand();

yb = 0x0b00 ^ ya;

J_tctostring[0] = ya;

tostring = J_tctostring;

y = CryPart(tostring)[0];

J_tctostring[0] = yb;

tostring = J_tctostring;

yx = CryPart(tostring)[0];

if (((y & 0xf000) == (yx & 0xf000)) && ((y & 0xf0) == (yx & 0xf0)))

{

TCHAR ustostring[3] = { 0, 0, 0 };

ustostring[0] = y;

ustostring[1] = yx;

J_cryptograph += ustostring;

ustostring[0] = ya;

ustostring[1] = yb;

J_cleartext += ustostring;

i++;

}

}

long t2 = GetTickCount();

unsigned short int v,u,vx,ux;

for (int i = 0; i < 100*2; i+=2)

{

ya = J_cryptograph[i];//y

yb = J_cryptograph[i + 1];//y*

for (int key = 0; key < 0xff + 1; key++)

{

v = ((key & 0xf) | ((key << 4) & 0xf00)) ^ ya;

6

}

}

u = USboxrtn(v);

vx = ((key & 0xf) | ((key << 4) & 0xf00)) ^ yb;

ux = USboxrtn(vx);

y = u^ux;

if (((y&0xf00) == 0x600) && ((y&0xf) == 6))

J_Count[key]++;

int max = -1;

unsigned short int finalkey;

for (int key = 0; key < 0xff + 1; key++)

{

}

if (J_Count[key]>max)

{

}

max = J_Count[key];

finalkey = key;

3.3.5 穷举密钥

穷举密钥没有什么技术含量可言,仅仅是通过分析得到的8bit穷举剩下的24bit,针对每一轮得到的待确定密钥,用一个明文进行加密操作,再进行密文的比对,相同,则记为一个密钥。针对明文较短的情况会有不同的多个密钥,并且都能对相应的明文进行加解密。为了得到所有可能的密钥,在算法中始终遍历2的24次方次,记录所有的密钥。算法如下:

void CSPNDlg::HolePassW(unsigned int finalkey)

{

CFile mFile;

CString J_cleartext;

CString J_cryptograph;

if ((_T(""), CFile::modeRead) == 0)

{

}

7

MessageBox(_T("文件读取出错!"));

return;

CArchive arr1(&mFile, CArchive::load);

arr1 >> J_cleartext;

();

();

if ((_T(""), CFile::modeRead) == 0)

{

}

CArchive arr2(&mFile, CArchive::load);

arr2 >> J_cryptograph;

();

();

long t1 = GetTickCount();

CString Outprint;

unsigned int part0 = finalkey & 0xf;

unsigned int part2 = finalkey >> 4;

unsigned int part[4];

CString Cpassw=_T("");

int count = 0;

for (part[3] = 0; part[3] <= 0xff; part[3]++)

for (part[2] = 0; part[2] <= 0xff; part[2]++)

for (part[1] = 0; part[1] <= 0xf; part[1]++)

{

//part32 = (part[1] << 4) | part2;

for (part[0] = 0; part[0] <= 0xf; part[0]++)

{

//part10 = (part[0] << 4) | part0;

J_passwordus[0] = (part[3] << 8) + part[2];

J_passwordus[1] = ((part[3] & 0xf) << 12) + (part[2] << 4) + part[1];

J_passwordus[2] = (part[2] << 8) + (part[1] << 4) + part2;

J_passwordus[3] = ((part[2] & 0xf) << 12) + (part[1] << 8) + (part2

J_passwordus[4] = (part[1] << 12) + (part2 << 8) + (part[0] << 4) +

MessageBox(_T("文件读取出错!"));

return;

<< 4) + part[0];

part0;

if (CryPart(J_cleartext) == J_cryptograph)

{

8

long t2 = GetTickCount();

count++;

(_T("由子密钥得到的完整密钥为:0x%x%x%x%x%x%x%x%x ;所花时间为:%dms"), char(part[3] >> 4), char(part[3] & 0xf),

char(part[2] >> 4), char(part[2] & 0xf), part[1], part2, part[0], part0, t2 - t1);

}

}

}

}

Cpassw += Outprint + _T("n");

long t3 = GetTickCount();

(_T("完整密钥总量为:%dn暴力破解总时间:%dms"), count,t3 - t1);

MessageBox(Cpassw+Outprint);

3.3.6 文件操作

为了使用后面的随机性监测,我添加了一项文件操作,但是这个只是针对特定文件,没有什么新意,在进行加解密的过程中自动生成,保存在程序目录下。穷举密钥也是根据文件内的内容进行的。

3.4 实验结果

输入并设置秘钥位数为任意大于8的值x,输入任意长度不为x的密钥会有错误提示,如图1:

9

如图2:

图1 密钥长度出错提醒

对明文“12345678”进行加密解密,因为结果相同,故此只截了一张图,

图2 加解密操作

因为是根据书上的伪代码所编写的程序,所以分析过程中只能是针对5轮密钥的情况,如果将就上述实验的结果,会出现密钥位数过少的报告,如图3:

10

图3 线性分析密钥报错

将位数改变为8,点击线性分析得到分析结果和分析时间,如图4:

图4 线性分析结果

此时如果点击确定就是根据得到的8bit子密钥进行穷举分析,但是我们后面先进行差分分析的结果查看。点击取消,再点击差分分析,得到如图5所示的结果:

11

你”为例,如图6:

图5 差分分析结果

重新用8位密钥进行加密,然后便可以进行正常的分析操作。在此以“123

举密钥的结果如图7:

图6 重新加密

再点击线性分析,得到类似于图4的结果,点击确定即可进入穷举密钥,穷12

图7 穷举密钥结果 1

只将明文长度变为“12”,按照上述操作,将得到多个密钥,如图9:

两个密钥均能通过测试。

图9 穷举密钥结果2

选择较长字符串进行加密生成文件,得到的密文的随机性能检测结果如图10:

13

图10 随机性测试结果

4 RSA设计

4.1 实验原理

RSA算法描述如下:

1、公钥

选择两个互异的大素数p和q,n是二者的乘积,即n=pq,使(n)(p1)(q1),(n)为欧拉函数。随机选取正整数e,使其满足gcd(e,(n))1,即e和(n)互质,则将(n,e)作为公钥。

2、私钥

求出正数d,使其满足ed1mod(n),则将(n,d)作为私钥。

3、加密算法

对于明文M,由CMemodn,得到密文C。

4、解密算法

对于密文C,由M=

2023年7月31日发(作者:)

课程名称: 密码学课程设计报告

专业班级: 信息安全1101

学 号: U*********

* 名: ***

指导教师: **

报告日期:___ 2014/3/2 _

计算机科学与技术学院

目 录

1 密码学课程实验的意义.................................................................................... 1

2 实验的目的与要求............................................................................................ 1

2.1SPN——代换置换网络 ........................................................................... 1

2.2 公钥密码RSA ........................................................................................ 1

3 SPN设计 ............................................................................................................ 2

3.1 实验原理 ................................................................................................ 2

3.2 实验环境 ................................................................................................ 2

3.3 实验设计 ................................................................................................ 2

3.3.1 S、P盒子设计 ............................................................... 2

3.3.2 密钥算法设计 ............................................................... 3

3.3.3 线性密码分析 ............................................................... 4

3.3.4 差分密码分析 ............................................................... 5

3.3.5 穷举密钥 ...................................................................... 7

3.3.6 文件操作 ...................................................................... 9

3.4 实验结果 ................................................................................................ 9

4 RSA设计 .......................................................................................................... 14

4.1 实验原理 .............................................................................................. 14

4.2 实验环境 .............................................................................................. 14

4.3 实验设计 .............................................................................................. 15

4.3.1 大素数生成 ................................................................. 15

4.3.2 生成文件 .................................................................... 15

4.3.3 文件加密 .................................................................... 16

4.3.4 文件解密 .................................................................... 18

4.3.5 快速加解密 ................................................................. 22

4.4 实验结果 .............................................................................................. 23

5 实验尝试.......................................................................................................... 28

6 实验体会.......................................................................................................... 30

1 密码学课程实验的意义

当前,重视实验与实践教育是各国高等教育界的发展潮流,实验与实践教学与理论教学是相辅相成的,具有同等重要的地位。它是在开放教育的基础上,为配合理论教学、培养学生分析问题和解决问题的能力以及加强训练学生专业实践能力而设置的教学环节;对于完成教学计划、落实教学大纲,确保教学质量,培养学生分析问题、解决问题的能力和实践操作技能更具有特别重要的意义。

密码学是信息安全与保密技术的核心,是一门实践性非常强的课程,实践教学是培养密码技术应用性人才的重要途径,实践教学质量的好环,实际上也决定了应用型人才培养质量的高低。因此,加强密码学课程实践教学环节,提高实践教学质量,对培养高质量的应用型人才至关重要。

2 实验的目的与要求

2.1SPN——代换置换网络

1、深入理解S盒子P盒子的加密原理。

2、熟悉S、P盒子在加解密过程中的使用方式。

3、对加解密的过程有自己的思考并自主发挥。

2.2 公钥密码RSA

通过实际编程掌握非对称密码算法RSA的加密和解密以及快速加、解密过程,加深对非对称密码算法的认识。

1

3 SPN设计

3.1 实验原理

将输入以16bit分段,作为加密的一个单位;初始密钥根据密钥编排算法得到多个以16bit为单位的轮密钥。在加密过程中,通过与轮密钥的亦或操作得到u,再经过S盒子的代换操作得到v,v经过P盒子的置换操作得到下一轮的输入,在倒数第二轮加密过程中,不需要经过P盒子进行置换,在最后一轮仅仅进行与密钥的与操作,加密结束。

值得注意的是,该SPN的第一个和最后一个操作都是亦或轮密钥,这叫做白化。白化可使一个不知道密钥的攻击者无法开始进行一个加密或解密操作。

3.2 实验环境

操作系统:Windows7系统

编程语言:MFC程序设计

编译器:VS2013

字符编码方式:Unicode编码

3.3 实验设计

3.3.1 S、P盒子设计

S、P盒子分别通过两个一维数组实现。按照书上的S、P盒子进行输入,嵌入程序,如下表1:

表1 S、P盒子

S

P

0

E

1

1

1

4

2

5

2

D

3

3

1

4

4

2

5

5

F

6

6

B

7

7

8

8

8

3

9

A

A

6

B

C

C

5

D

9

E

0

F

7

9 10 11 12 13 14 15 16

7 11 15 4 8 12 16 9 13 2 6 10 14 3

在使用中,S盒子的每一位对应数组中的每一位,P盒子中对应的位置应减一。

程序中预先装入S、P盒子,在图形界面初始化过程中进行S、P盒子的求逆操作用于解密,减少解密时间。求逆代码如下:

2

for (unsigned short int i = 0; i < 16; i++)

{

}

USbox[i] = U_sbox(i);

UPbox[i] = U_pbox(i + 1) + 1;

unsigned short int CSPNDlg::U_sbox(unsigned short int x)

{

}

unsigned short int CSPNDlg::U_pbox(unsigned short int x)

{

for (unsigned short int i = 0; i < 16; i++)

{

}

}

if (Pbox[i] == x)

return i;

for (unsigned short int i = 0; i < 16; i++)

{

}

if (Sbox[i] == x)

return i;

因为在P盒子中的代换是对称的,所以P盒子的求逆操作是多余的。

在得到逆向的盒子之后便可以根据加密的顺序进行解密操作。

3.3.2 密钥算法设计

设计中,密钥以16进制输入,输入长度可以自定义,但是最短长度为8,小于8时会有提示。

轮密钥的多少决定加密的轮数,而轮密钥多少根据输入长度而定。在设计中,轮密钥的数量是密钥位数减三。即在生成密钥时,每16个bit为一轮密钥,每次往后移动一个4bit,以此得到所有密钥。

根据输入的字符串密钥,轮密钥算法代码如下:

BOOL CSPNDlg::PasswordJudge(CString J_password)

{

unsigned short int J_singlep[100];

unsigned int J_passwordlength = J_gth();

if (J_passwordlength != Plen)

{

CString forlengtherr;

3

}

(_T("密钥长度应为 %d,请重新输入!"), Plen);

MessageBox(forlengtherr);

return FALSE;

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

{

}

for (int j = 0; j < Plen - 3; j++)

{

}

return TRUE;

}

J_passwordus[j] = J_singlep[j];

J_passwordus[j] = (J_passwordus[j] << 4) | J_singlep[j + 1];

J_passwordus[j] = (J_passwordus[j] << 4) | J_singlep[j + 2];

J_passwordus[j] = (J_passwordus[j] << 4) | J_singlep[j + 3];

if ((J_password[i] >= '0') && (J_password[i] <= '9'))

{

}

MessageBox(_T("密钥输入有误,请重新输入!"));

return FALSE;

J_singlep[i] = J_password[i] - '0';

J_singlep[i] = J_password[i] - 'a' + 10;

J_singlep[i] = J_password[i] - 'A' + 10;

else if ((J_password[i] >= 'a') && (J_password[i] <= 'f'))

else if ((J_password[i] >= 'A') && (J_password[i] <= 'F'))

else

3.3.3 线性密码分析

根据S盒子的输入输出可以得到相应的偏差,将具有较高偏差值的S盒子用来串行进行分析,可以得到明文与加密过程中与上第四轮密钥后得到的结果之间的一个联系,即输入明文16bit中的第11、9、8位和u4的第10、8、2、1位之间的亦或值与得到它们的过程中的量没有关系。总共生成8000个明密文对,每当这几个bit位的异或值为零时进行一次计数,最终通过比较得到最高计数值进而得到理论上可能的8bit密钥finalkey。分析代码如下:

//攻击代码

long t3 = GetTickCount();

int J_Count[0xff + 1];

for (unsigned short int LL = 0; LL < 0xff+1; LL++)

J_Count[LL] = 0;

4

8);

unsigned short int J_clrper, J_cryper;

unsigned short int v,u,w;

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

{

}

for (unsigned short int key = 0; key < 0xff + 1; key++)

{

}

int max = -1;

unsigned int finalkey = 0;

for (unsigned short int key = 0; key < 0xff+1; key++)

{

}

if (J_Count[key]>max)

{

}

max = J_Count[key];

finalkey = key;

J_Count[key] = J_Count[key] - length/2;

if (J_Count[key] < 0)

J_Count[key] = -J_Count[key];

J_clrper = J_cleartext[i];

J_cryper = J_cryptograph[i];

w = ((J_clrper & 0x0800) >> 11) ^ ((J_clrper & 0x0200) >> 9) ^ ((J_clrper & 0x0100) >>

for (unsigned short int key = 0; key < 0xff + 1; key++)

{

}

v = ((key & 0xf) | ((key << 4) & 0xf00)) ^ J_cryper;

u = USboxrtn(v);

w = w ^ ((u & 0x0400) >> 10) ^ ((u & 0x0100) >> 8) ^ ((u & 0x0004) >> 2) ^ (u

if (w == 0)

J_Count[key]++;

& 0x0001);

3.3.4 差分密码分析

差分密码分析是一个选择明文攻击。与线性密码分析不同的是,差分密码分析包含了将两个输入的亦或与其对应的两个输出的亦或相比较。固定明文的异或值,用同一个密钥对两个明文进行加密得到两个结果,在用过滤操作,去掉特定5

bit位不同的4元组。在本次课程设计实验中,明文的异或值为0xb00,对应密文的第零个和第二个4bit值必须相同。最后计数加一的条件是u4的第零个和第二个4bit是否为0110,最终筛选出100对明密文对。算法如下:

long t1 = GetTickCount();

srand((unsigned)time(NULL));

CString tostring;

unsigned short int ya, yb,y,yx;

TCHAR J_tctostring[2] = { 0, 0 };

for (int i = 0; i < 100;)//生成明文后筛选得到y和y*存储在J_cryptograph中

{

ya = rand();

yb = 0x0b00 ^ ya;

J_tctostring[0] = ya;

tostring = J_tctostring;

y = CryPart(tostring)[0];

J_tctostring[0] = yb;

tostring = J_tctostring;

yx = CryPart(tostring)[0];

if (((y & 0xf000) == (yx & 0xf000)) && ((y & 0xf0) == (yx & 0xf0)))

{

TCHAR ustostring[3] = { 0, 0, 0 };

ustostring[0] = y;

ustostring[1] = yx;

J_cryptograph += ustostring;

ustostring[0] = ya;

ustostring[1] = yb;

J_cleartext += ustostring;

i++;

}

}

long t2 = GetTickCount();

unsigned short int v,u,vx,ux;

for (int i = 0; i < 100*2; i+=2)

{

ya = J_cryptograph[i];//y

yb = J_cryptograph[i + 1];//y*

for (int key = 0; key < 0xff + 1; key++)

{

v = ((key & 0xf) | ((key << 4) & 0xf00)) ^ ya;

6

}

}

u = USboxrtn(v);

vx = ((key & 0xf) | ((key << 4) & 0xf00)) ^ yb;

ux = USboxrtn(vx);

y = u^ux;

if (((y&0xf00) == 0x600) && ((y&0xf) == 6))

J_Count[key]++;

int max = -1;

unsigned short int finalkey;

for (int key = 0; key < 0xff + 1; key++)

{

}

if (J_Count[key]>max)

{

}

max = J_Count[key];

finalkey = key;

3.3.5 穷举密钥

穷举密钥没有什么技术含量可言,仅仅是通过分析得到的8bit穷举剩下的24bit,针对每一轮得到的待确定密钥,用一个明文进行加密操作,再进行密文的比对,相同,则记为一个密钥。针对明文较短的情况会有不同的多个密钥,并且都能对相应的明文进行加解密。为了得到所有可能的密钥,在算法中始终遍历2的24次方次,记录所有的密钥。算法如下:

void CSPNDlg::HolePassW(unsigned int finalkey)

{

CFile mFile;

CString J_cleartext;

CString J_cryptograph;

if ((_T(""), CFile::modeRead) == 0)

{

}

7

MessageBox(_T("文件读取出错!"));

return;

CArchive arr1(&mFile, CArchive::load);

arr1 >> J_cleartext;

();

();

if ((_T(""), CFile::modeRead) == 0)

{

}

CArchive arr2(&mFile, CArchive::load);

arr2 >> J_cryptograph;

();

();

long t1 = GetTickCount();

CString Outprint;

unsigned int part0 = finalkey & 0xf;

unsigned int part2 = finalkey >> 4;

unsigned int part[4];

CString Cpassw=_T("");

int count = 0;

for (part[3] = 0; part[3] <= 0xff; part[3]++)

for (part[2] = 0; part[2] <= 0xff; part[2]++)

for (part[1] = 0; part[1] <= 0xf; part[1]++)

{

//part32 = (part[1] << 4) | part2;

for (part[0] = 0; part[0] <= 0xf; part[0]++)

{

//part10 = (part[0] << 4) | part0;

J_passwordus[0] = (part[3] << 8) + part[2];

J_passwordus[1] = ((part[3] & 0xf) << 12) + (part[2] << 4) + part[1];

J_passwordus[2] = (part[2] << 8) + (part[1] << 4) + part2;

J_passwordus[3] = ((part[2] & 0xf) << 12) + (part[1] << 8) + (part2

J_passwordus[4] = (part[1] << 12) + (part2 << 8) + (part[0] << 4) +

MessageBox(_T("文件读取出错!"));

return;

<< 4) + part[0];

part0;

if (CryPart(J_cleartext) == J_cryptograph)

{

8

long t2 = GetTickCount();

count++;

(_T("由子密钥得到的完整密钥为:0x%x%x%x%x%x%x%x%x ;所花时间为:%dms"), char(part[3] >> 4), char(part[3] & 0xf),

char(part[2] >> 4), char(part[2] & 0xf), part[1], part2, part[0], part0, t2 - t1);

}

}

}

}

Cpassw += Outprint + _T("n");

long t3 = GetTickCount();

(_T("完整密钥总量为:%dn暴力破解总时间:%dms"), count,t3 - t1);

MessageBox(Cpassw+Outprint);

3.3.6 文件操作

为了使用后面的随机性监测,我添加了一项文件操作,但是这个只是针对特定文件,没有什么新意,在进行加解密的过程中自动生成,保存在程序目录下。穷举密钥也是根据文件内的内容进行的。

3.4 实验结果

输入并设置秘钥位数为任意大于8的值x,输入任意长度不为x的密钥会有错误提示,如图1:

9

如图2:

图1 密钥长度出错提醒

对明文“12345678”进行加密解密,因为结果相同,故此只截了一张图,

图2 加解密操作

因为是根据书上的伪代码所编写的程序,所以分析过程中只能是针对5轮密钥的情况,如果将就上述实验的结果,会出现密钥位数过少的报告,如图3:

10

图3 线性分析密钥报错

将位数改变为8,点击线性分析得到分析结果和分析时间,如图4:

图4 线性分析结果

此时如果点击确定就是根据得到的8bit子密钥进行穷举分析,但是我们后面先进行差分分析的结果查看。点击取消,再点击差分分析,得到如图5所示的结果:

11

你”为例,如图6:

图5 差分分析结果

重新用8位密钥进行加密,然后便可以进行正常的分析操作。在此以“123

举密钥的结果如图7:

图6 重新加密

再点击线性分析,得到类似于图4的结果,点击确定即可进入穷举密钥,穷12

图7 穷举密钥结果 1

只将明文长度变为“12”,按照上述操作,将得到多个密钥,如图9:

两个密钥均能通过测试。

图9 穷举密钥结果2

选择较长字符串进行加密生成文件,得到的密文的随机性能检测结果如图10:

13

图10 随机性测试结果

4 RSA设计

4.1 实验原理

RSA算法描述如下:

1、公钥

选择两个互异的大素数p和q,n是二者的乘积,即n=pq,使(n)(p1)(q1),(n)为欧拉函数。随机选取正整数e,使其满足gcd(e,(n))1,即e和(n)互质,则将(n,e)作为公钥。

2、私钥

求出正数d,使其满足ed1mod(n),则将(n,d)作为私钥。

3、加密算法

对于明文M,由CMemodn,得到密文C。

4、解密算法

对于密文C,由M=