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

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

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

相关推荐