密码学应用与实践课程设计报告

时间:2024.4.20

哈尔滨工业大学(威海)课程设计报告

Harbin Institute of Technology at Weihai

密码学应用与实践

课程设计报告

专 业:班 级:学 号:姓 名:

密码学应用与实践课程设计报告

密码学应用与实践课程设计报告

1

哈尔滨工业大学(威海)课程设计报告

伪随机数发生器LFSR ..................... 错误!未定义书签。

1.LFSR原理 ................................................................... 3

2.设计思想 ...................................................................... 5

3.设计流程图 .................................................................. 5

4.功能实现 ...................................................................... 5

1.生成随机数 ............................................................ 5

2.生成序列 ................................................................. 6

3.游程检测 ................................................................. 7

5.总结 .............................................................................. 8

RC4加密与解密 .................................................................. 9

1.RC4密码算法原理 ..................................................... 9

2.设计思想 .................................................................... 10

3.设计流程图 ................................................................ 10

4.功能实现 ..................................................................... 11

1.打开文件 ................................................................ 11

2.加密文件 ................................................................ 11

3.解密文件 ............................................................... 13

5.总结 ............................................................................ 15

源代码 ................................................................................ 15 2

哈尔滨工业大学(威海)课程设计报告

伪随机数发生器LFSR

1.LFSR原理

密码学应用与实践课程设计报告

在流密码加密中通常使用伪随机数发生器来产生密钥流,从而进行加密与解密,其结构如下图所示,而线性反馈移位寄存器(LFSR)即是一个产生二进制位序列(可作为密钥流)的机制。

图1 流密码结构图

密码学应用与实践课程设计报告

LFSR的详细设计原理如下:

1.设计n位移位寄存器并且设计各个寄存器的反馈系数Cn,如下图所示:

图2 LFSR寄存器设计

3

哈尔滨工业大学(威海)课程设计报告

密码学应用与实践课程设计报告

密码学应用与实践课程设计报告

2.移位寄存器

图3 序列产生方法

若想输出二进制序列,不但需要设计移位寄存器以及反馈系数,而且还需输入种子(seeds)来启动发生器,例如下左图所示LFSR,下右图即为输入种子(1000)后寄存器的移位及输出状态:

图4 LFSR实例

由上例还可看出LFSR具有周期性,若要尽可能输出较多的随机数即产生m-序列(T=2<n>-1),则需合理的设计寄存器的反馈系数,不同的反馈系数产生随机序列的周期不同。

4

哈尔滨工业大学(威海)课程设计报告

2.设计思想

本实验旨在实现使用反馈移位寄存器产生随机序列,以用做流密码加密时的密钥流。其主要设计原理见上。

3.设计流程图

密码学应用与实践课程设计报告

图5 LFSR流程图

4.功能实现

1.生成随机数

随机数的生成考虑以下两个函数

5

哈尔滨工业大学(威海)课程设计报告

函数一:int rand(void);

从rand (seed)中指定的seed开始,返回一个[seed, RAND_MAX(0x7fff))间的随机整数。

函数二:void srand(unsigned seed);

参数seed是srand()的种子,用来初始化rand()的起始值。可以认为rand()在每次被调用的时候,它会查看:

1) 如果用户在此之前调用过srand(seed),给seed指定了一个值,那么它会自动调用srand(seed)一次来初始化它的起始值。

2) 如果用户在此之前没有调用过srand(seed),它会自动调用srand(1)一次。 在这里我使用系统时间作为种子来初始化srand()的起始值,使用time函数来获得系统时间,它的返回值为从 00:00:00 GMT, January 1, 1970到现在所持续的秒数,然后将time_t型数据转化为(unsigned)型在传给srand函数。

void CRC4Dlg::OnButtonCreatrn() //生成随机数

{

int t,i,k; m_BRandNumber=""; CString LastNo;

srand(time(0)); //使用系统时间作为seed来初始化

t=1+rand()%1023;

m_RandNumber=t; for(i=0;i<10;i++) //转换成二进制 { } IsCreatRN=TRUE; UpdateData(FALSE);

} k=t%2; t=t/2; RandNumber[i]=k;//注意顺序问题 LastNo.Format("%d",k); m_BRandNumber=LastNo+m_BRandNumber;

2.生成序列

此试验中产生了1024位二进制随机序列。

void CRC4Dlg::OnButtonS() //生成序列

{

6

哈尔滨工业大学(威海)课程设计报告

if(IsCreatRN==FALSE) { } int i,j,m,n; CString MyNumber; for(i=0;i<1023;i++) { } UpdateData(FALSE); IsCreatList=TRUE; m_SeqRandNumber="";

} m=RandNumber[0]; SeqRandNumber[i]=m; MyNumber.Format("%d",m); m_SeqRandNumber=m_SeqRandNumber+MyNumber; n=(RandNumber[9]+RandNumber[8]+RandNumber[5]+RandNumber[0])%2;//模加 for(j=0;j<9;j++) { RandNumber[j]=RandNumber[j+1]; }//移位 RandNumber[j]=n;//移位寄存器的最高位根据特征多项式求出 AfxMessageBox("请先生成随机数!!!"); return;

3.游程检测

void CRC4Dlg::OnButtonTest() //检测游程 {

if(IsCreatList==FALSE) { } int i,j,k,count; int AllCount=0; float precent; CString CountList; 7 AfxMessageBox("请先生成随机序列!!!"); return;

哈尔滨工业大学(威海)课程设计报告

CountList=""; CString PrecentList; for(i=0;i<2;i++) { if(SeqRandNumber[i]==0) { } { } k=0; while(SeqRandNumber[++i]==1) { } YC[1][k]++; AllCount++; k++; k=0; while(SeqRandNumber[++i]==0) { } YC[0][k]++; AllCount++; k++; for(j=0;j<10;j++) YC[i][j]=0;//初始化 for(i=0;i<1023;) if(SeqRandNumber[i]==1)

}//游程统计

5.总结

此次设计中首先考虑随机数的生成,方法是使用srand()函数,以time(0)产生的系统时间为种子,产生1024位二进制随机数。再者有了seed如何利用移位寄存器生成序列也是一个难点,在经过上网查资料等学习后终于完满解决。

8

哈尔滨工业大学(威海)课程设计报告

RC4加密与解密

1.RC4密码算法原理

1.初始化及伪随机密码生成 初始化S-盒很容易。首先,进行线性填充:S[0]=1,S[1]=1,...,S[255]=255。然后用密钥填充另一个256字节数组,不断重复密钥直至填充到整个数组中:K[0],K[1],...,K[255]。

将指针J设为0。然后:

对于I=0至255

J=(J+S[I]+K[I]) mod 256

交换S[I]和S[J] 在初始化的过程中,密钥的主要功能是将S-box搅乱,i确保S-box的每个元素都得到处理,j保证S-box的搅乱是随机的。而不同的S-box在经过伪随机子密码生成算法的处理后可以得到不同的子密钥序列,并且,该序列是随机的:

while (明文未结束) { ++i%=n; j=(j+s)%n; swap(s, s[j]); sub_k=s((s+s[j])%n); }

2.加密或解密

8*8的S-盒:S[0],S[1],...,S[255]。所有项都是数字0到数字255的置换,并且这个置换是一个可变长度密钥的函数。它有两个计数器:I和J,初值为0。要产生一个随机字节,需要按下列步骤进行:

I=(I+1) mod 256

J=(J+S[I]) mod 256

交换S[I]和S[J]

T=(S[I]+S[J]) mod 256

9

哈尔滨工业大学(威海)课程设计报告

K=S[T]

字节K与明文异或产生密文或者与密文异或产生明文。

2.设计思想

根据算法原理,首先初始化S-BOX,产生伪随机序列密钥流,选择所加密文件 与密钥流异或生成密文。

3.设计流程图

密码学应用与实践课程设计报告

图6 RC4流程图

10

哈尔滨工业大学(威海)课程设计报告

4.功能实现

1.打开文件

void CRC4Dlg::OnButton1() {

} UpdateData ( true ) ; CFileDialog fileDlg ( TRUE ) ; fileDlg.m_ofn.lpstrTitle = " Select which you want to encryption" ; fileDlg.m_ofn.lpstrFilter = "0All Files(*.*)\0*.*\0\0" ; if ( IDOK == fileDlg.DoModal()) { CFile file(fileDlg.GetFileName() , CFile::modeRead ) ; char *pBuf ; DWORD dwFileLen ; dwFileLen = file.GetLength() ; pBuf = new char[dwFileLen+1] ; pBuf[dwFileLen] = 0 ; file.Read ( pBuf , dwFileLen ) ; file.Close () ; m_mingwen = pBuf ; } UpdateData ( false ) ;

2.加密文件

void CRC4Dlg::OnButton2() {

int S[260],T[260]; int i,j=0,kenlen; 11 m_miwen=""; UpdateData ( true ) ;

哈尔滨工业大学(威海)课程设计报告

a=strlen ( m_mingwen);

12 while(l<a) { } for(i=0;i<=255;i++) { } i=0; j=0; j=(j+S[i]+T[i])%256; n=S[i]; S[i]=S[j]; S[j]=n; S[i]=i; T[i]=m_key[i%kenlen]; for(i=0;i<=255;i++) kenlen=strlen ( m_key); if(kenlen>256) { } AfxMessageBox("Please input the key from 1 to 256 bytes!"); return; int a,n,t,l=0; char k; if(m_key==""||m_mingwen=="") { } MessageBox("请选择解密文件以及输入密钥!"); return;

哈尔滨工业大学(威海)课程设计报告

} { i=(i+1)%256; } UpdateData ( false ) ; j=(j+S[i])%256; n=S[i]; S[i]=S[j]; S[j]=n; t=(S[i]+S[j])%256; k=S[t]; R.Format("%c",( k^m_mingwen[l])) ; m_miwen+=R; l++;

3.解密文件

void CRC4Dlg::OnButton3() {

UpdateData ( true ) ;

13 if(m_key2==""||m_miwen2=="") { } MessageBox("请选择解密文件以及输入密钥!"); return; int S[260],T[260]; int i,j,kenlen; int a,n,t,l=0; char k; m_shuchu="";

哈尔滨工业大学(威海)课程设计报告

if(kenlen>256) { AfxMessageBox("Please input the key from 1 to 256 bytes!"); kenlen=strlen ( m_key2);

return;

}

a=strlen ( m_miwen2);

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

{

S[i]=i;

T[i]=m_key2[i%kenlen];

}

j=0;

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

{

j=(j+S[i]+T[i])%256;

n=S[i];

S[i]=S[j];

S[j]=n;

}

i=0;

j=0;

while(l<a)

{

i=(i+1)%256;

j=(j+S[i])%256;

n=S[i];

S[i]=S[j];

14

哈尔滨工业大学(威海)课程设计报告

} } UpdateData ( false ) ; S[j]=n; t=(S[i]+S[j])%256; k=S[t]; R.Format("%c",( k^m_miwen2[l])) ; m_shuchu+=R; l++;

5.总结

此次设计过程中遇到了很多困难,虽然RC4算法看起来很简单,但是实际编写 起来却非常有难度,因此此次设计时参考了网络上大量的代码以加深对RC4算法的了解。

由于此次课程设计时间很短,所以编写出的程序也很简单,大量功能没有实现,也算是一点小小的遗憾。选择题目时,有很多加密算法,但是有些加密算法在实验课上已经实现了,而有些题目如邮件加密,因为较为复杂而时间紧迫无法完成,所以选择了RC4算法。

虽然课程设计时间较短但还是收获颇丰的。

源代码

void CRC4Dlg::OnButton1()

{

// TODO: Add your control notification handler code here UpdateData ( true ) ; CFileDialog fileDlg ( TRUE ) ; fileDlg.m_ofn.lpstrTitle = " Select which you want to encryption" ; fileDlg.m_ofn.lpstrFilter = "0All Files(*.*)\0*.*\0\0" ; if ( IDOK == fileDlg.DoModal()) { CFile file(fileDlg.GetFileName() , CFile::modeRead ) ; 15 char *pBuf ;

哈尔滨工业大学(威海)课程设计报告

}

void CRC4Dlg::OnButton2() {

kenlen=strlen ( m_key); if(kenlen>256) { } 16 AfxMessageBox("Please input the key from 1 to 256 bytes!"); return; int S[260],T[260]; int i,j=0,kenlen; int a,n,t,l=0; char k; if(m_key==""||m_mingwen=="") { } MessageBox("请选择解密文件以及输入密钥!"); return; m_miwen=""; // TODO: Add your control notification handler code here UpdateData ( true ) ; DWORD dwFileLen ; dwFileLen = file.GetLength() ; pBuf = new char[dwFileLen+1] ; pBuf[dwFileLen] = 0 ; file.Read ( pBuf , dwFileLen ) ; file.Close () ; m_mingwen = pBuf ; } UpdateData ( false ) ;

哈尔滨工业大学(威海)课程设计报告

a=strlen ( m_mingwen);

{ i=(i+1)%256; } UpdateData ( false ) ; 17 j=(j+S[i])%256; n=S[i]; S[i]=S[j]; S[j]=n; t=(S[i]+S[j])%256; k=S[t]; R.Format("%c",( k^m_mingwen[l])) ; m_miwen+=R; l++; while(l<a) { } for(i=0;i<=255;i++) { } i=0; j=0; j=(j+S[i]+T[i])%256; n=S[i]; S[i]=S[j]; S[j]=n; S[i]=i; T[i]=m_key[i%kenlen]; for(i=0;i<=255;i++)

哈尔滨工业大学(威海)课程设计报告

}

void CRC4Dlg::OnButton3() {

UpdateData ( true ) ;

a=strlen ( m_miwen2);

{ S[i]=i; T[i]=m_key2[i%kenlen]; 18 for(i=0;i<=255;i++) if(kenlen>256) { } AfxMessageBox("Please input the key from 1 to 256 bytes!"); return; kenlen=strlen ( m_key2); if(m_key2==""||m_miwen2=="") { } MessageBox("请选择解密文件以及输入密钥!"); return; int S[260],T[260]; int i,j,kenlen; int a,n,t,l=0; char k; m_shuchu=""; // TODO: Add your control notification handler code here

哈尔滨工业大学(威海)课程设计报告

}

void CRC4Dlg::OnButton4() {

19 // TODO: Add your control notification handler code here { i=(i+1)%256; } UpdateData ( false ) ; j=(j+S[i])%256; n=S[i]; S[i]=S[j]; S[j]=n; t=(S[i]+S[j])%256; k=S[t]; R.Format("%c",( k^m_miwen2[l])) ; m_shuchu+=R; l++; while(l<a) j=0; for(i=0;i<=255;i++) { } i=0; j=0; j=(j+S[i]+T[i])%256; n=S[i]; S[i]=S[j]; S[j]=n; }

哈尔滨工业大学(威海)课程设计报告

}

void CRC4Dlg::OnButtonCreatrn() //生成随机数

{

int t,i,k; m_BRandNumber=""; CString LastNo; UpdateData ( true ) ; CFileDialog fileDlg ( TRUE ) ; fileDlg.m_ofn.lpstrTitle = " Select which you want to encryption" ; fileDlg.m_ofn.lpstrFilter = "0All Files(*.*)\0*.*\0\0" ; if ( IDOK == fileDlg.DoModal()) { CFile file(fileDlg.GetFileName() , CFile::modeRead ) ; char *pBuf ; DWORD dwFileLen ; dwFileLen = file.GetLength() ; pBuf = new char[dwFileLen+1] ; pBuf[dwFileLen] = 0 ; file.Read ( pBuf , dwFileLen ) ; file.Close () ; m_miwen2 = pBuf ; } UpdateData ( false ) ;

srand(time(0)); //使用系统时间来作为seed初始化 t=1+rand()%1023;

}

void CRC4Dlg::OnButtonS() //生成序列

20 m_RandNumber=t; for(i=0;i<10;i++) //转换成二进制 { } IsCreatRN=TRUE; UpdateData(FALSE); k=t%2; t=t/2; RandNumber[i]=k;//注意顺序问题 LastNo.Format("%d",k); m_BRandNumber=LastNo+m_BRandNumber;

哈尔滨工业大学(威海)课程设计报告

{

}

void CRC4Dlg::OnButtonTest() //检测游程 {

if(IsCreatList==FALSE) { } int i,j,k,count; int AllCount=0; float precent; CString CountList; CountList=""; CString PrecentList; 21 AfxMessageBox("请先生成随机序列!!!"); return; if(IsCreatRN==FALSE) { } int i,j,m,n; CString MyNumber; for(i=0;i<1023;i++) { } UpdateData(FALSE); IsCreatList=TRUE; m_SeqRandNumber=""; m=RandNumber[0]; SeqRandNumber[i]=m; MyNumber.Format("%d",m); m_SeqRandNumber=m_SeqRandNumber+MyNumber; n=(RandNumber[9]+RandNumber[8]+RandNumber[5]+RandNumber[0])%2;//模加 for(j=0;j<9;j++) { RandNumber[j]=RandNumber[j+1]; }//移位 RandNumber[j]=n;//移位寄存器的最高位根据特征多项式求出 AfxMessageBox("请先生成随机数!!!"); return;

哈尔滨工业大学(威海)课程设计报告

for(i=0;i<2;i++) { if(SeqRandNumber[i]==0) { } { } k=0; while(SeqRandNumber[++i]==1) { } YC[1][k]++; AllCount++; k++; k=0; while(SeqRandNumber[++i]==0) { } YC[0][k]++; AllCount++; k++; for(j=0;j<10;j++) YC[i][j]=0;//初始化 for(i=0;i<1023;) if(SeqRandNumber[i]==1) }//游程统计 //利用列表控件将游程统计输出 YouChengDlg *MyYouChengDlg; MyYouChengDlg=new YouChengDlg(this); if(MyYouChengDlg->Create(IDD_DIALOG1)) { DWORD NewStyle = LVS_EX_GRIDLINES; MyYouChengDlg->m_ListYouCheng.SetExtendedStyle(NewStyle); MyYouChengDlg->m_ListYouCheng.InsertColumn(0, "", LVCFMT_LEFT, 25 ); MyYouChengDlg->m_ListYouCheng.InsertColumn(1, "0的游程", LVCFMT_LEFT, 80 ); MyYouChengDlg->m_ListYouCheng.InsertColumn(2, "百分比", LVCFMT_LEFT, 80 ); MyYouChengDlg->m_ListYouCheng.InsertColumn(3, "1的游程", LVCFMT_LEFT, 80 ); MyYouChengDlg->m_ListYouCheng.InsertColumn(4, "百分比", LVCFMT_LEFT, 80 );//添加列标题

22

哈尔滨工业大学(威海)课程设计报告

} } MyYouChengDlg->m_ListYouCheng.InsertItem(0, "1"); MyYouChengDlg->m_ListYouCheng.InsertItem(1, "2"); MyYouChengDlg->m_ListYouCheng.InsertItem(2, "3"); MyYouChengDlg->m_ListYouCheng.InsertItem(3, "4"); MyYouChengDlg->m_ListYouCheng.InsertItem(4, "5"); MyYouChengDlg->m_ListYouCheng.InsertItem(5, "6"); MyYouChengDlg->m_ListYouCheng.InsertItem(6, "7"); MyYouChengDlg->m_ListYouCheng.InsertItem(7, "8"); MyYouChengDlg->m_ListYouCheng.InsertItem(8, "9"); MyYouChengDlg->m_ListYouCheng.InsertItem(9, "10"); //添加行 for(i=0;i<2;i++) for(j=0;j<10;j++) { count=YC[i][j]; precent=(float)count/AllCount; CountList.Format("%d",count); PrecentList.Format("%f",precent); if(i==0) { } else { } MyYouChengDlg->m_ListYouCheng.SetItemText(j,i+2,CountList); MyYouChengDlg->m_ListYouCheng.SetItemText(j,i+3,PrecentList); MyYouChengDlg->m_ListYouCheng.SetItemText(j,i+1,CountList); MyYouChengDlg->m_ListYouCheng.SetItemText(j,i+2,PrecentList); }//列表中添加数据 MyYouChengDlg->ShowWindow(SW_SHOW); MyYouChengDlg->UpdateData(FALSE);

23

更多相关推荐:
密码学课程设计报告

沈阳工程学院课程设计设计题目院系信息学院班级信安本111学生姓名学号指导教师祝世东王素芬职称工程师副教授起止日期20xx年1月6日起至20xx年1月10日止沈阳工程学院课程设计任务书课程设计题目简单的保密通信系...

密码学课程设计报告

密码学课程设计报告班级:信安10-1班姓名:学号:指导老师:一、Hash算法的实现MD5算法1.1算法概述MD5算法是一种消息摘要算法,此算法以任意长度的信息作为输入进行计算,产生一个128-bit(16-by…

密码学-RSA加密解密算法的实现课程设计报告

密码学课程报告《RSA加密解密算法》专业:信息工程(信息安全)班级:1132102学号:****姓名:***时间:20××年1月10号一、课程设计的目的当前最著名、应用最广泛的公钥系统RSA是在1978年,由美…

密码学课程设计报告

XX大学密码学课程设计姓名学号学院指导老师完成日期20xx0106一实验任务及要求任务使用IDEA算法实现加解密过程要求1输入至少包括两个分组2核心功能是加解密过程可适当增加附加功能32人组二实现原理IDEA算...

密码学课程设计报告要求及模板

计算机与信息工程学院《密码学课程设计》报告(20××/20学年第二学期)题目:Diffie-Hellman密钥交换协议系别:计算机与信息工程学院专业:信息安全班级:学号:姓名:20年05月30日(一)题目Dif…

中国矿业大学密码学课程设计报告

密码学课程设计中国矿业大学密码学课程设计报告院系计算机学院专业信息安全班级姓名学号指导老师20xx年6月密码学课程设计摘要近些年来由于许多私密信息的泄漏信息安全成为全社会的需求所以也成为了整个社会的关注热点对于...

密码学课程设计实验报告

院系计算机科学与技术学院专业信息安全班级0703学号xxxxxxxxxx姓名指导教师xxxxxxxx月日1密码学课程设计实验报告目录第一部分一实验目的二实验环境及工具三实验内容四实验原理五实验过程651设计思路...

密码学课程设计

中国矿业大学密码学课程设计报告院系计算机学院专业信息安全班级信安083班姓名学号08083701指导老师20xx年6月1绪论密码技术是一门古老而十分有用的技术随着计算机通信技术的迅猛发展大量的敏感信息通过公共设...

密码学课程设计

密码学的重要性随着计算机网络技术和通讯技术的迅猛发展大量的敏感信息常常通过计算机网络进行交换在这些信息的传输与处理的过程中如何保护信息安全使之不被非法窃取或篡改成为人们关注的问题因此计算机密码学就成为信息安全中...

密码学课程设计大纲

密码学课程设计教学大纲课程编号089233设计周数3周学分数3应开学期5一课程设计的目的通过本课程实验使学生能运用应用密码学的基本概念基本原理协议和技术阐释一般安全网络环境中密码产品如何利用密码学理论工作的原理...

华科大密码学课程设计实验报告

密码学课程设计实验报告专业信息安全班级姓名付晓帆学号0903U20xx15328一DES的编程实现1实验目的通过实际编程掌握DES的加脱密及密钥生成过程加深对DES算法的认识2实验原理a加密过程DES是一个分组...

现代密码学课程设计任务书

重庆大学本科学生课程设计任务书1学院专业年级均填全称2本表除签名外均可采用计算机打印本表不够可另附页但应在页脚添加页码1

密码学课程设计报告(28篇)