当前位置:文档之家› 密码学课程设计论文

密码学课程设计论文

密码学课程设计论文
密码学课程设计论文

课程设计

一、课程设计的内容

运用C语言、C++面向对象、数据结构以及刚学习的密码学等知识,在认真学习古典密码的理论知识之后,通过编程进行各类古典密码的算法的实现,并产生界面友好。

二、课程设计的要求与数据

论文摘要包括,摘要正文和关键词,课程设计正文(绪论(说明做这个课题的意义)、理论部分(相关的理论)、代码的实现部分、总结)三、课程设计应完成的工作

各类古典密码算法的编写

程序MFC的关联

论文的撰写(目录的自动生成)

四、应收集的资料及主要参考文献

论文摘要:

本文主要对古典密码中的移位密码(凯撒密码),仿射密码,维吉利亚(Vigenere)密码以,单表代换密码,置换密码和周期置换密码进行算法设计,最后用C++方法实现友好界面。通过对这几个古典密码的算法分析,更加系统的掌握其中的原理和应用。

关键词凯撒密码、置换密码、算法、MFC关联、代码

目录

第1章绪论 (3)

第2章理论部分 (3)

2.1:移位密码 (4)

2.2:仿射密码 (4)

2.3:维吉利亚密码 (4)

2.4:一般的单表代换密码 (4)

2.5:列置换密码 (4)

2.6:周期置换密码 (4)

第3章代码的实现 (5)

3.1:程序主界面: (5)

3.2 移位密码: (5)

3.3 仿射密码 (6)

3.4 维吉利亚密码 (9)

3.5 单表代换密码 (12)

3.6 置换密码 (15)

3.7 周期置换密码 (16)

第4章总结 (18)

第5章参考文献 (19)

第1章绪论

密码学包括两部分,即密码编码学和密码分析学,这两个部分即对立又统一,正是由于其对立性才促进了密码学的发展。一个密码系统的安全性只有通过对该系统抵抗当前各类攻击能力的考查和全面分析才能做出定论。密码体制的安全性分析是一个相当复杂的问题,但有一点是清楚的,那就是掌握现有的分析方法并使用这些方法对相应的体制进行分析以考察其安全强度。

在密码编码体制中,有两种最基本也是最古老的编码体制一直沿用至今,它们是代换密码和置换密码,由于历史悠久并且是现代密码体制的基本组成部分,因而在密码学中占有重要的地位。古典密码是密码学发展的一个阶段,也是近代密码学产生的渊源,尽管古典密码大多比较简单,一般可用手工或机械方式实现其加密和解密过程,破译也比较简单,目前已经很少采用,但了解它们的设计原理,有助于理解、设计和分析现代密码。

日常生活中,在大多数的情况下,我们不用担心别人偷听,因为即使被人偷听到了他也无法用偷听到的信息做什么坏事。但当我们谈论某些比较敏感的话题时,被别人偷听到的话可能会产生一些负面的影响,对当事人很不利。在文字交流中,一些重要的信息,比如重要决定,人事变动和秘密情报等,当事人是不希望别人看到的,但如何进行交流呢?一个简单的办法就是采用文字编码。

例如,将英文中的每个字母固定地换成它后面第5个字母,A换成F,B换成G,…,V换成A,W换成B,…,最后Z换成E。字母编码如下表所示:

原文 A B C D …V W X Y Z

密文 F G H I … A B C D E 因此,消息I love you就变成了n qtaj dtz,消息有明确的信息,而编码后的字符串却是一串乱码,信息隐藏在其中,达到了保密的效果。

对于古典密码体制而言,我们有如下的约定:加密解密时忽略空格和标点符号,这可能让人不太适应,但是经过解密后,几乎总是可以正确的还原明文中的这些空缺。如果保留这些空缺,密文会保持明文的结构特点,为攻击者提供便利。

本文主要是通过对各类型的古典密码进行算法设计,通过编写程序来深层掌握古典密码的算法技术,通过对各类型古典密码进行详细的分析,分工讨论,在实现系统掌握这些密码算法的同时,也对C语言和C++面向对象进行了复习,有效的巩固了以前的知识,也培养了对专业密码学的学习兴趣。

第2章理论部分

代换是古典密码中用到的最基本的处理技巧,它在现代密码学中得到了广泛的应用,内容非常的丰富,人们采用代换密码进行加密时并没有固定的模式。按照一个明文字母是否总是被一个固定的字母代换进行划分时,代换密码可以分为两大类:(1)单表代换密码:对明文消息中出现的同一个字母,在加密时都用同一个固定的字母来代换,不管它出现在什么地方。移位密码和仿射密码都属于单表代换密码。

(2)多表代换密码:明文消息中出现的同一个字母,在加密时不是完全被同一个

固定的字母代换,而是根据其出现的位置次序,用不同的字母代换,如维吉利亚密码和Playfair密码。

2.1:移位密码

明文空间P与密文空间C都是26个英文字母的集合,密钥空间K={0,1,2,…,25}。在实际进行加密解密运算时,把26个字母依次与0,1,2,…,25对应。因而也可以说P=C=K={0,1,…,25}=Z。E={e:Z->Z,e(x)=x+k(mod 26)},即对每个K∈Z,相应的加密变换为ek(m)=m+k(mod 26),其中m∈Z为明文。D={d:Z->Z,d(x)=x-k(mod 26)},即对密钥k,解密变换为dk(y)=y-k(mod 26),其中y∈Z为密文。解密之后要把Z中的元素再变换为英文字母。

2.2:仿射密码

明、密文空间与移位密码相同,密钥空间为K={(k1,k2)|k1,k2∈Z,其中gcd(k1,26=1)} gcd表示两个数的最大公因子,gcd(k1,26)=1,即表示k1还 26互素。对任意的k=(k1,k2)∈K,加密变换为e(m)=k1*m+k2*(mod 26).相应的解密变化为d(c)=k1^(-1)*(c-k2)(mod 26),其中:k1*k1^(-1)=1(mod 26).

2.3:维吉利亚密码

该密码有一个参数n。在加解密时同样把英文字母用数字代替进行运算,并按n 个字母一组进行变换。明、密文空间及密钥空间都是n长的字母串的集合,因此可以表示P=C=K=Z^(26).加密变换如下:

设密钥k=(k1,k2,…,kn),明文P=(m1,m2,…,mn),加密函数为e(p)=(c1,c2,…,cn),其中Ci=(mi+ki)(mod 26),i=1,2,…,n。

对密文c=(m1,m2,…,mn),密钥k=(k1,k2,…,kn),解密变换为:e(c)=(m1,m2,…,mn),其中m1=(c1-k1)(mod 26),i=1,2,…,n。

其中mi=(ci-ki)(mod 26),i=1,2,…,n。

2.4:一般的单表代换密码

单表代换密码的原理是:以26个字母的集合上的一个置换∏为密钥对明文消息中的每个字母依次进行变换,变换的方法是把明文中的每个字母用它在置换∏下的像去替换。解密时用∏的逆置换进行替换。可描述为P=C={0,1,2,…,25}=Z,K={∏:Z->Z|∏是置换}。密钥∏对应的加密变换e(x)= ∏(x),解密变换为d(y)= ∏^(-1)(y).前面描述的移位密码和仿射密码都是单表代换密码,而维吉利亚密码不是单表代换密码。

2.5:列置换密码

置换密码是把明文中各字符的位置次序重新排列来得到密文的一种密码体制。列置换密码的加密方法如下:把明文字符以固定的宽度m(分组长度)水平地(按行)写在一张纸上,按1,2,3,…,m的一个置换∏交换列的次序位置,再按垂直方向(按列)读出即得密文。解密就是就是将密文按照相同的宽度m垂直的写在纸上,按置换∏的逆置换交换列的位置次序,然后水平的读出得到明文,置换∏就是密钥。

2.6:周期置换密码

周期置换密码是将明文字符按照一定长度m分组,把每组中的字符按1,2,…,m 的一个置换∏重排位置次序来得到密文的一种加密方法。其中的密钥就是置换∏,在∏的描述中包含了分组长度的信息。解密时,对密文字符按长度m分组,并按∏的逆置换∏^(-1)把每组字符重排位置次序来得到明文。

第3章代码的实现

3.1:程序主界面:

3.2 移位密码:

部分代码实现:

void kaisa::Onjiami()

{

// TODO: Add your control notification handler code here

int i;

char b;

this->UpdateData();

if (m_mingwen.IsEmpty())

MessageBox("要加密的文字不能为空!");

m_jiami=m_mingwen;

int n=m_jiami.GetLength();

for( i=0;i

{

b=m_jiami.GetAt(i);

if('a' <= b && b <= 'z')

m_jiami.SetAt(i,'a'+(b-'a'+m_k)%26);

else

if('A' <= b && b <= 'Z')

m_jiami.SetAt(i,'A'+(b-'A'+m_k)%26);

else

{

m_jiami="";

this->MessageBox("输入明文只能为大、小写字母或空格!");

}

}

this->UpdateData(false);

}

void kaisa::Onjiemi()

{

// TODO: Add your control notification handler code here this->UpdateData();

int i;

m_jiemi=m_jiami;

int n=m_jiemi.GetLength();

for(i=0;i

{

char b=m_jiemi.GetAt(i);

if('a' <= m_jiami.GetAt(i) && m_jiami.GetAt(i) <= 'z') m_jiemi.SetAt(i,'a'+(b-'a'-m_k+26)%26);

if('A' <= b && b <= 'Z')

m_jiemi.SetAt(i,'A'+(b-'A'-m_k+26)%26);

}

this->UpdateData(false);

}

void kaisa::Onclose()

{

// TODO: Add your control notification handler code here CDialog::OnOK();

}

3.3 仿射密码

部分代码如下:

fangshe::fangshe(CWnd* pParent /*=NULL*/)

: CDialog(fangshe::IDD, pParent)

{

//{{AFX_DATA_INIT(fangshe)

m_mingwen = _T("");

m_k1 = 0;

m_k2 = 0;

m_jiami = _T("");

m_jiemi = _T("");

//}}AFX_DATA_INIT

}

void fangshe::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(fangshe)

DDX_Text(pDX, IDC_EDIT1, m_mingwen);

DDX_Text(pDX, IDC_EDIT2, m_k1);

DDX_Text(pDX, IDC_EDIT3, m_k2);

DDX_Text(pDX, IDC_EDIT4, m_jiami);

DDX_Text(pDX, IDC_EDIT5, m_jiemi);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(fangshe, CDialog)

//{{AFX_MSG_MAP(fangshe)

ON_BN_CLICKED(IDCANCEL, Onjiami)

ON_BN_CLICKED(IDOK, Onjiemi)

ON_BN_CLICKED(IDC_BUTTON1, Onclose)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

//////////////////////////////////////////////////////////////////////// /////

// fangshe message handlers

int gcd(int a, int b) /*辗转相除法求a,b的最大公因数*/

{

int k = 0;

do

{

k = a%b;

a = b;

b = k;

}while(k!=0);

return a;

}

int Ni(int a, int b) /*求a相对于b的逆*/

{

int i = 0;

while(a*(++i)%b!=1);

return i;

}

void fangshe::Onjiami()

{

// TODO: Add your control notification handler code here

int i;

this->UpdateData();

if (m_mingwen.IsEmpty())

MessageBox("要加密的文字不能为空!");

m_jiami=m_mingwen;

int n=m_jiami.GetLength();

char b;

for( i=0;i

{

b=m_jiami.GetAt(i);

// if('a' <= b && b <= 'z')

if(gcd(m_k1,26)==1)

{

if('a' <= b && b <= 'z')

m_jiami.SetAt(i,'a'+(m_k1*(b-'a')+m_k2)%26);

else

if('A' <= b && b <= 'Z')

m_jiami.SetAt(i,'A'+(m_k1*(b-'A')+m_k2)%26);

else

if(b==' ')

{m_jiami.SetAt(i,NULL);}

else

{

m_jiami="";

this->MessageBox("输入明文只能为大、字母或空格!");

}

}

else

{

m_jiami="";

this->MessageBox("请输入一个和26互素的正整数作为密钥!");

}

}

this->UpdateData(false);

}

void fangshe::Onjiemi()

{

// TODO: Add your control notification handler code here

this->UpdateData();

int i;

m_jiemi=m_jiami;

int n=m_jiemi.GetLength();

for(i=0;i

{

char b=m_jiemi.GetAt(i);

if('a' <= b && b <= 'z')

m_jiemi.SetAt(i,'a'+(Ni(m_k1,26)*(b-'a'-m_k2+26))%26);

if('A' <= b && b <= 'Z')

m_jiemi.SetAt(i,'A'+(Ni(m_k1,26)*(b-'A'-m_k2+26))%26);

}

this->UpdateData(false);

}

void fangshe::Onclose()

{

// TODO: Add your control notification handler code here

CDialog::OnOK();

3.4 维吉利亚密码

部分代码:

void Vigenere::OnButton1()

{

// TODO: Add your control notification handler code here

CDialog::OnOK();

}

void Vigenere::Onjiami()

{

// TODO: Add your control notification handler code here

int i,j,k;

int pos=0,tag;

this->UpdateData();

if (m_mingwen.IsEmpty())

MessageBox("要加密的文字不能为空!");

if (m_k.IsEmpty())

MessageBox("密钥不能为空!");

int n=m_mingwen.GetLength();//求输入内容的长度

int m=m_k.GetLength();//密钥长度

m_jiami=m_mingwen;

for( i=0,j=0;i

{

if(m_jiami.GetAt(i)!=' ')

{

B[j++]=m_jiami.GetAt(i);

tag=0;

S[pos++]=tag;//遇到空格,S中该位置的元素为0;

}

else

{

tag=1;

S[pos++]=tag;//遇到非空格,S中该位置的元素为1;

}

}

// m_jiami.Remove(' ');

//j=m_jiami.GetLength();

for( k=0;k

{//B[k]=m_jiami.GetAt(k);

A[k%m]=m_k.GetAt(k%m);

if('a' <=B[k] && B[k] <= 'z')

{

if('a' <=A[k%m] && A[k%m] <= 'z')

m_jiami.SetAt(k,'a'+(B[k]-'a'+A[k%m]-'a')%26);

else

if('A' <=B[k%m] && A[k%m] <= 'Z')

m_jiami.SetAt(k,'a'+(B[k]-'a'+A[k%m]-'A')%26);

}

else

if('A' <= B[k] && B[k]<= 'Z')

{

if('A' <=A[k%m] && A[k%m] <= 'Z')

m_jiami.SetAt(k,'A'+(B[k]-'A'+A[k%m]-'A')%26);

else

if('a' <=A[k%m] && A[k%m] <= 'z')

m_jiami.SetAt(k,'A'+(B[k]-'A'+A[k%m]-'a')%26);

}

else

{

m_jiami="";

this->MessageBox("输入明文只能为大、小写字母或空格!");

}

}

for(k=j;k

m_jiami.SetAt(k,' ');

this->UpdateData(false);

}

void Vigenere::Onjiemi()

{

// TODO: Add your control notification handler code here

int i;

this->UpdateData();

int n=m_jiami.GetLength();

m_jiemi=m_jiami;

int m=m_k.GetLength();

for( i=0;i

{

B[i]=m_jiemi.GetAt(i);

A[i%m]=m_k.GetAt(i%m);

if('a'<=B[i] && A[i] <= 'z')

{

if('a' <=A[i%m] && A[i%m] <= 'z')

m_jiemi.SetAt(i,'a'+(B[i]-'a'-A[i%m]+'a'+26)%26);

else

if('A' <=B[i%m] && A[i%m] <= 'Z')

m_jiemi.SetAt(i,'a'+(B[i]-'a'-A[i%m]+'A'+26)%26);

}

else

if('A' <= B[i] && B[i]<= 'Z')

{

if('A' <=A[i%m] && A[i%m] <= 'Z')

m_jiemi.SetAt(i,'A'+(B[i]-'A'-A[i%m]+'A'+26)%26);

else

if('a' <=A[i%m] && A[i%m] <= 'z')

m_jiemi.SetAt(i,'A'+(B[i]-'A'-A[i%m]+'a'+26)%26);

}

}

for(int t=0;t

{

if(S[t]==1)//数组S中第t个元素为1,则在前面解密后的内容中的该位置插入空格,已恢复明文中的空格。

{

for(int r=n-2;r>=t;r--)

m_jiemi.SetAt(r+1,m_jiemi.GetAt(r));

m_jiemi.SetAt(t,' ');

}

}

this->UpdateData(false);

}

3.5 单表代换密码

部分代码:

char str1[]="abcdefghijklmnopqrstuvwxyz"; //原字母表。

char T[27];

void single::OnButton1()

{

// TODO: Add your control notification handler code here CDialog::OnOK();

}

void single::Ondhb()

{

// TODO: Add your control notification handler code here int i,j;

this->UpdateData();

m_yb=str1;

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

m_yb.Insert(2*i,' ');

int n=m_mingwen.GetLength();

int m=m_k.GetLength();

int pos=0;

int tag=1;

if('a' <=m_k[0] && m_k[0] <= 'z')

T[0]=m_k[0];//填充第0个位置

else

this->MessageBox("输入只能为大、小写字母");

for( i=1;i

{

if('a' <=m_k[i] && m_k[i] <= 'z')

{

tag=1;

for( j=0;j<=pos;j++)

{

if(T[j]==m_k[i])//不是表中已经存在字母。

{

tag=0;

}

}

if(tag==1)//不是表中已经存在字母,填充到代换表的下一个位置。

T[++pos]=m_k[i];

}

}

for( i=0;i<26;i++)//把没有在代换表中出现的字母顺序填充到代换表中。

{

tag=1;

for(j=0;j<=pos;j++)

{

if(T[j]==str1[i])

tag=0;

}

if(tag==1)

T[++pos]=str1[i];

}

m_dhb=T;//代换表。

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

m_dhb.Insert(2*i,' ');

this->UpdateData(false);

}

void single::Onjiami()

{

// TODO: Add your control notification handler code here

int i,j;

this->UpdateData();

m_jiami.Empty();

if (m_mingwen.IsEmpty())

MessageBox("要加密的文字不能为空!");

if (m_k.IsEmpty())

MessageBox("密钥不能为空!");

int n=m_mingwen.GetLength();

int m=m_k.GetLength();

for( i=0;i

{

if('a' <=m_mingwen[i] && m_mingwen[i] <= 'z')

{

int pos=m_mingwen[i]-'a';

m_jiami+=T[pos];

}

else if('A' <=m_mingwen[i] && m_mingwen[i] <= 'Z')

{

int pos=m_mingwen[i]-'A';

m_jiami+=T[pos]-32;//大写字母的ASCLL码比小写字母小32.

}

else//不符合要求的不原样复制。

{

m_jiami="";

this->MessageBox("输入明文只能为大、小写字母或空格!");

}

}

this->UpdateData(false);

}

void single::Onjiemi()

{

// TODO: Add your control notification handler code here

int i,j;

this->UpdateData();

if (m_jiami.IsEmpty())

MessageBox("请在'加密'对应的方框中输入要加密的内容!");

m_jiemi.Empty();

int n=m_jiami.GetLength();

int m=m_k.GetLength();

for( i=0;i

{

if('a'<=m_jiami[i] && m_jiami[i] <= 'z')

{

for(j=0;j<26;j++)

{

if(m_jiami[i]==T[j])//比较密文的第i位对应代换表的哪个字母。

m_jiemi+=str1[j];//把代换表中相应的字母换成原字母表的字母作为解密的结果。

}

else

if('A' <=m_jiami[i] && m_jiami[i] <= 'Z')

{

for(j=0;j<26;j++)

{

if(m_jiami[i]==T[j]-32)

m_jiemi+=str1[j]-32;

}

}

}

this->UpdateData(false);

}

3.6 置换密码

部分代码:

void zhi::Onjiami()

{

// TODO: Add your control notification handler code here

{

UpdateData();

m_jiami.Empty();//加密前为空

int keylen=m_key.GetLength();//密钥长度

int len=m_mingwen.GetLength();//明文长度

int i=len/keylen; //分组长度

int j=len%keylen;

if (0!=j)//明文长度不是密钥长度的整数倍。

{

for(int m=0; m

{

m_mingwen+=' ';

}

i++;

}

int n, m;

for (n = 0; n

{

for (m = 0; m

m_jiami+=m_mingwen[m*keylen+m_key[n]-1-'0'];

UpdateData(FALSE);

}

}

void zhi::Onjiemi()

{

// TODO: Add your control notification handler code here UpdateData();

m_jiemi.Empty();//解密前为空

int keylen=m_key.GetLength();//密钥长度

int len=m_jiami.GetLength();//密文长度

int i=len/keylen; //行数

int j=len%keylen;

int n, m, k;

for (n=0; n

{

for (m=1; m<=keylen; m++)

{

for(k=0;k

if(m_key[k]=='0'+m)

m_jiemi+=m_jiami[k*i+n];

}

}

UpdateData(FALSE);

}

void zhi::Onguanbi()

{

// TODO: Add your control notification handler code here CDialog::OnOK();

}

3.7 周期置换密码

部分代码如下:

void zhouqi::Onjiami()

{

// TODO: Add your control notification handler code here UpdateData();

m_jiami.Empty();

int keylen=m_key.GetLength();//密钥长度

int len=m_mingwen.GetLength();//明文长度

int i=len/keylen; //分组长度

int j=len%keylen;

if (0!=j)

{

for(int m=0; m

{

m_mingwen+=' ';

}

i++;

}

int n, m,k;

for (n= 0; n

{

for (m = 0; m<=keylen; ++m)

{

for(k=0;k

if(m_key[k]==m+'0')

m_jiami+=m_mingwen[n*keylen+m_key[(k-1+keylen)%keylen]-1-'0'];

}

}

UpdateData(FALSE);

}

void zhouqi::Onjiemi()

{

// TODO: Add your control notification handler code here

UpdateData();

m_jiemi.Empty();

int keylen=m_key.GetLength();//密钥长度

int len=m_jiami.GetLength();//明文长度

int i=len/keylen;

int j=len%keylen;

int n, m,k;

for (n= 0; n

{

for (m = 0; m<=keylen; ++m)

{

for(k=0;k

if(m_key[k]==m+'0')

m_jiemi+=m_jiami[n*keylen+m_key[(k+1)%keylen]-1-'0'];

}

}

UpdateData(FALSE);

}

第4章总结

。在做课程设计的过程中,自己也大量地翻阅了相关的课本,这样不仅把之前的知识比如数论里的知识巩固了,同时也巩固了自己C,C++的相关知识,对MFC的关联得到了加强,把之前很多没有弄懂的知识学会了,让我比较系统的掌握了各类古典密码的原理与程序实现。在做课程设计的过程中,不仅要用到课本,还要到图书馆借阅到其他相关的书籍,这样让我大大扩充自己的视野,同时也更多熟练掌握基于MFC的程序设计,培养解决实际问题的能力。经常运用到了Visual C++软件开发工具,大大提高了自己的编程能力和动手能力。其实作为密码学的基础,各类型的古典密码的原理是很简单的,难的就是你要怎么样把那些看起来简单的原理用计算机程序语言来进行实现,所以最重要的就是要动手,集思广益,想方设法的怎样才能更好的把自己的思想应用到程序中去,及时把所遇到的问题解决掉,这样不仅可以把我们学到的只是很好的运用到实际中去,让我们真实的感受到编程给我们所带来的乐趣,同时所锻炼的动手能力也为我们以后的工作打下了坚实的基础。与此同时,

在这次的课程设计中我也看到了自己所存在的不足之处。对于C++面向对象的界面友好很多知识都忘了,连MFC的函数关联都忘记了很多,一开始做起来有点苦难,我想主要还是因为没能够足够地掌握Visual C++软件开发工具中的各项功能,对MFC 的程序设计认识不够透彻。在算法的实现中,对于一些细节的问题考虑的还不到位,有时候遇到问题显得比较急躁,以至于程序中的一些空格没能很好的处理好。

学习展望:通过这次的课程设计,既让我更加系统的掌握了古典密码的相关原理和知识,为以后的学习打下坚实的基础,同时也让我认识到了自己的很多不足,这就在客观上要求自己在以后的学习过程中要更加努力。

第5章参考文献

【1】陈恭亮.信息安全数学基础【M】.北京:清华大学出版社,2004.6 【2】张福泰,李继国.密码学教程【M】.武汉:武汉大学出版社,2006.9 【3】康晓凤.Playfair算法及其C语言模拟实现【J】.电子学报,2006,21(12).

【4】李振华.替换密码算法在C++中的实现【J】.电子学报,2009,157-158.

【5】吕秋云,赵泽茂,刘顺兰.信息安全本科专业密码学实验课程的教学研究【D】.浙江:杭州电子科技大学,2009.

现代密码学论文

现代密码学论文 院(系)名称理学院 专业班级计算131班学号130901027 学生姓名王云英

摘要 现代密码学研究信息从发端到收端的安全传输和安全存储,是研究“知己知彼”的一门科学。其核心是密码编码学和密码分析学。前者致力于建立难以被敌方或对手攻破的安全密码体制,即“知己”,后者则力图破译敌方或对手已有的密码体制,即“知彼”。人类有记载的通信密码始于公元前400年。1881年世界上的第一个电话保密专利出现。电报、无线电的发明使密码学成为通信领域中不可回避的研究课题。 现有的密码体制千千万万各不相同。但是它们都可以分为私钥密码体制(如DES密码)和公钥密码(如公开密钥密码)。前者的加密过程和脱密过程相同,而且所用的密钥也相同;后者,每个用户都有公开和秘密钥。现代密码学是一门迅速发展的应用科学。随着因特网的迅速普及,人们依靠它传送大量的信息,但是这些信息在网络上的传输都是公开的。因此,对于关系到个人利益的信息必须经过加密之后才可以在网上传送,这将离不开现代密码技术。PKI是一个用公钥概念与技术来实施和提供安全服务的具有普适性的安全基础设施。PKI公钥基础设施的主要任务是在开放环境中为开放性业务提供数字签名服务。

现代密码学的算法研究 密码算法主要分为对称密码算法和非对称密码算法两大类。对称加密算法指加密密钥和解密密钥相同,或知道密钥之一很容易推导得到另一个密钥。通常情况下,对称密钥加密算法的加\解密速度非常快,因此,这类算法适用于大批量数据的场合。这类算法又分为分组密码和流密码两大类。 1.1 分组密码 分组密码算法实际上就是密钥控制下,通过某个置换来实现对明文分组的加密变换。为了保证密码算法的安全强度,对密码算法的要求如下。 1.分组长度足够大:当分组长度较小时,分组密码类似于古典的代替密码,它仍然保留了明文的统计信息,这种统计信息将给攻击者留下可乘之机,攻击者可以有效地穷举明文空间,得到密码变换本身。 2.密钥量足够大:分组密码的密钥所确定密码变换只是所有置换中极小一部分。如果这一部分足够小,攻击者可以有效地穷举明文空间所确定所有的置换。这时,攻击者就可以对密文进行解密,以得到有意义的明文。 3.密码变换足够复杂:使攻击者除了穷举法以外,找不到其他快捷的破译方法。 分组密码的优点:明文信息良好的扩展性,对插入的敏感性,不需要密钥同步,较强的适用性,适合作为加密标准。 分组密码的缺点:加密速度慢,错误扩散和传播。 分组密码将定长的明文块转换成等长的密文,这一过程在秘钥的控制之下。使用逆向变换和同一密钥来实现解密。对于当前的许多分组密码,分组大小是 64 位,但这很可能会增加。明文消息通常要比特定的分组大小长得多,而且使用不同的技术或操作方式。 1.2流密码 流密码(也叫序列密码)的理论基础是一次一密算法,它是对称密码算法的一种,它的主要原理是:生成与明文信息流同样长度的随机密钥序列(如 Z=Z1Z2Z3…),使用此密钥流依次对明文(如X=X0X1X2...)进行加密,得到密文序列,解密变换是加密变换的逆过程。根据Shannon的研究,这样的算法可以达到完全保密的要求。但是,在现实生活中,生成完全随机的密钥序列是不可行的,因此只能生成一些类似随机的密钥序列,称之为伪随机序列。 流密码具有实现简单、便于硬件实施、加解密处理速度快、没有或只有有限的错误传播等特点,因此在实际应用中,特别是专用或机密机构中保持着优势,典型的应用领域包括无线通信、外交通信。如果序列密码所使用的是真正随机方式的、与消息流长度相同的密钥流,则此时的序列密码就是一次一密的密码体制。若能以一种方式产生一随机序列(密钥流),这一序列由密钥所确定,则利用这样的序列就可以进行加密,即将密钥、明文表示成连续的符号或二进制,对应地进行加密,加解密时一次处理明文中的一个或几个比特。 流密码研究内容集中在如下两方面: (1)衡量密钥流序列好坏的标准:通常,密钥序列的检验标准采用Golomb的3点随机性公设,除此之外,还需做进一步局部随机性检验,包括频率检验、序列

密码学基础课程设计指导书

《现代密码学基础》课程设计指导书 杨柳编 湖南科技大学计算机科学与工程学院 2014年12月

一、概述 本课程在简要复习数学基础知识之后,探讨了密码学研究的基本问题:通过不安全的通信媒介如何进行安全通信。也可以理解为关心任何希望限制不诚实者达到目的的问题,把度量和评价一个密码体制(协议)的安全性作为一个重点。就目前来说,密码学的研究领域已从消息加密扩大到了数字签名、消息认证、身份识别、抗欺骗协议等。无疑,在整个教学过程中非常重视密码学的基础,当然包括数学基础。并针对实际的密码体制(协议)强调设计与分析(攻击),对现代密码学的主要研究问题都进行了介绍。 对于密码学这样的课程,同学们一定要从理论、技术、应用三个方面进行学习与思考。密码体制(协议)无疑是我们的学习重点,密码体制(协议)也可以单纯地理解为计算机算法,从而有设计、分析、证明、实现的问题。实现密码体制(协议)就是我们经常讲的八个字:模型、算法、程序、测试。 二、课程设计步骤 课程设计步骤要求如下: 1.模型 从数学的角度看,解决任何问题都要建立一个数学模型,对于密码学来说更是如此。我们还可以认为,数据结构中的存储结构也是模型。于是这一部分的任务就是建立起问题的逻辑结构和存储结构,为算法设计和编码实现打下基础。 2.算法 这一部分对同学们的要求是能看懂书上的常用算法,并对其中的参数可以进行调整和设置,能实现和应用它们。 3.程序 编码实现得到程序。 4. 测试 5. 提交课程设计报告

三、课程设计报告编写要求 课程设计报告开头标明课程设计题目、设计者的班级、姓名、学号和完成日期,内容包括:模型、算法、程序、测试四个部分。 四、设计要求 可以只做第7题,不做第7题的要做第1题-第6题。 五、课程设计题目 大整数运算包的设计与实现 1.问题描述 大整数运算是现代密码学算法实现的基础,重要性不言而喻。大整数我们指的是二进制位512、1024和2048的数,一般的语言不支持。 2.基本要求 以类库头文件的形式实现。 3.实现提示 在选择了大整数的存储结构之后,主要实现以下运算: ①模加; ②模减; ③模乘; ④模整除; ⑤模取余。这五种运算模拟手算实现。 ⑥幂模:利用“平方-乘法”算法实现。 ⑦GCD:利用欧几里得算法实现。 ⑧乘法逆: 利用扩展的欧几里得算法实现。 ⑨素数判定与生成:概率性素数产生方法产生的数仅仅是伪素数,其缺点在于,

密码学课程设计-刘欣凯

现代密码学实验 题目:2012现代密码学实验 姓名:刘欣凯学号:192102-21 院(系):计算机学院专业:信息安全指导教师:任伟职称:副教授 评阅人:职称: 2012 年12 月

现代密码学实验原创性声明 本人以信誉声明:所呈交的现代密码学实验是在导师指导下进行的研究工作及取得的研究成果,论文中引用他人的文献、数据、图件、资料均已明确标注出,论文中的结论和结果为本人独立完成,不包含他人成果及为获得中国地质大学或其他教育机构的学位或证书而使用过的材料。与我一同工作的同志对本研究所做的任何贡献均已在论文中作了明确的说明并表示了谢意。 毕业论文作者(签字):刘欣凯 签字日期:2012年12 月18 日 学校代码:10491 本科生学号:20101003356

现代密码学实验 本科生:刘欣凯 学科专业:信息安全 指导老师:任伟 二〇一二年十二月

目录 实验一古典密码算法 (5) 1.1 仿射密码 (5) 1.11 算法原理和设计思路 (5) 1.12 关键算法分析 (5) 1.13运行结果 (7) 1.2古典密码hill (8) 1.21古典密码hill概述 (8) 1.22 算法原理和设计思路 (8) 1.23 关键算法分析 (9) 1.24 运行结果 (10) 1.25 密码安全性分析 (10) 1.3古典密码Vegenere (12) 1.31古典密码Vegenere概述 (12) 1.32算法原理和设计思路 (12) 1.33 关键算法分析 (12) 1.34 运行结果 (13) 1.35密码安全性分析 (14) 1.4古典密码Playfair (15) 1.41古典密码Playfair概述 (15) 1.42算法原理和设计思路 (15) 1.43 运行结果 (17) 1.44 密码安全性分析 (17) 实验二ElGamal签名体制 (18) 2.1 ElGamal签名概述 (18) 2.2算法原理和设计思路 (18) 2.3关键算法分析 (20) 2.4运行结果 (20) 实验三 Rabin加密和签名 (21)

密码学论文

RSA加密算法解析 摘要:描述了RSA算法,给出了RSA加密解密的算法原理并用一个实例进行详细描述,以及它的抗攻击能力和常见攻击方式,还有RSA算法的优缺点,最后进行(在VS2013下)RSA算法实现以及演示结果。 关键词:RSA;加密解密;攻击能力;攻击方法;安全性;算法优缺点;RSA实现 简介: RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它。 RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名。RSA以它的三个发明者Ron Rivest, Adi Shamir, Leonard Adleman的名字首字母命名,这个算法经受住了多年深入的密码分析,虽然密码分析者既不能证明也不能否定RSA的安全性,但这恰恰说明该算法有一定的可信性,目前它已经成为最流行的公开密钥算法。 RSA的安全基于大数分解的难度。其公钥和私钥是一对大素数(100到200位十进制数或更大)的函数。从一个公钥和密文恢复出明文的难度,等价于分解两个大素数之积。 RSA的公钥、私钥的组成,以及加密、解密的公式可见于下表: 一、什么是“素数”? 素数是这样的整数,它除了能表示为它自己和1的乘积以外,不能表示为任何其它两个整数的乘积。例如,15=3*5,所以15不是素数;又如,12=6*2=4*3,所以12也不是素数。另一方面,13除了等于13*1以外,不能表示为其它任何两个整数的乘积,所以13是一个素数。素数也称为“质数”。 二、什么是“互质数”(或“互素数”)? 定义:“公约数只有1的两个数,叫做互质数。”这里所说的“两个数”是指自然数。 判别方法主要有以下几种: (1)两个质数一定是互质数。例如,2与7、13与19。 (2)一个质数如果不能整除另一个合数,这两个数为互质数。例如,3与10、5与 26。 (3)1不是质数也不是合数,它和任何一个自然数在一起都是互质数。如1和9908。 (4)相邻的两个自然数是互质数。如 15与 16。 (5)相邻的两个奇数是互质数。如 49与 51。

AES密码学课程设计(C语言实现)

成都信息工程学院课程设计报告 AES加密解密软件的实现 课程名称:应用密码算法程序设计 学生姓名:樊培 学生学号:2010121058 专业班级:信息对抗技术101 任课教师:陈俊 2012 年6月7日

课程设计成绩评价表

目录 1、选题背景 (4) 2、设计的目标 (4) 2.1基本目标: (4) 2.2较高目标: (5) 3、功能需求分析 (5) 4、模块划分 (6) 4.1、密钥调度 (6) 4.2、加密 (8) 4.2.1、字节代替(SubBytes) (8) 4.2.2、行移位(ShiftRows) (10) 4.2.3、列混合(MixColumn) (11) 4.2.4、轮密钥加(AddRoundKey) (13) 4.2.5、加密主函数 (14) 4.3、解密 (16) 4.3.1、逆字节替代(InvSubBytes) (16) 4.3.2、逆行移位(InvShiftRows) (17) 4.3.3、逆列混合(InvMixCloumns) (17) 4.3.4、轮密钥加(AddRoundKey) (18) 4.3.5、解密主函数 (18) 5.测试报告 (20) 5.1主界面 (20) 5.2测试键盘输入明文和密钥加密 (20) 5.3测试键盘输入密文和密钥加密 (21) 5.3测试文件输入明文和密钥加密 (22) 5.4测试文件输入密文和密钥加密 (22) 5.5软件说明 (23) 6.课程设计报告总结 (23) 7.参考文献 (24)

1、选题背景 高级加密标准(Advanced Encryption Standard,AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。该算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,结合两位作者的名字,以Rijndael 之命名之,投稿高级加密标准的甄选流程。(Rijndael的发音近于 "Rhine doll") 严格地说,AES和Rijndael加密法并不完全一样(虽然在实际应用中二者可以互换),因为Rijndael加密法可以支援更大范围的区块和密钥长度:AES的区块长度固定为128 位元,密钥长度则可以是128,192或256位元;而Rijndael使用的密钥和区块长度可以是32位元的整数倍,以128位元为下限,256位元为上限。加密过程中使用的密钥是由Rijndael 密钥生成方案产生。大多数AES计算是在一个特别的有限域完成的。 截至2006年,针对AES唯一的成功攻击是旁道攻击 旁道攻击不攻击密码本身,而是攻击那些实作于不安全系统(会在不经意间泄漏资讯)上的加密系统。2005年4月,D.J. Bernstein公布了一种缓存时序攻击法,他以此破解了一个装载OpenSSL AES加密系统的客户服务器[6]。为了设计使该服务器公布所有的时序资讯,攻击算法使用了2亿多条筛选过的明码。有人认为[谁?],对于需要多个跳跃的国际互联网而言,这样的攻击方法并不实用[7]。 Bruce Schneier称此攻击为“好的时序攻击法”[8]。2005年10月,Eran Tromer和另外两个研究员发表了一篇论文,展示了数种针对AES的缓存时序攻击法。其中一种攻击法只需要800个写入动作,费时65毫秒,就能得到一把完整的AES密钥。但攻击者必须在执行加密的系统上拥有执行程式的权限,方能以此法破解该密码系统。 虽然高级加密标准也有不足的一面,但是,它仍是一个相对新的协议。因此,安全研究人员还没有那么多的时间对这种加密方法进行破解试验。我们可能会随时发现一种全新的攻击手段会攻破这种高级加密标准。至少在理论上存在这种可能性。 2、设计的目标 2.1基本目标: (1)在深入理解AES加密/解密算法理论的基础上,能够设计一个AES加密/解密软件系统,采用控制台模式,使用VS2010进行开发,所用语言为C语言进行编程,实现加密解密; (2)能够完成只有一个明文分组的加解密,明文和密钥是ASCII码,长度都为16个字符(也就是固定明文和密钥为128比特),输入明文和密钥,输出密文,进行加密后,能够进

密码学课程设计设计

2009年密码学暑期课程设计说明 姓名:张志佳学号:072337 下面分别是AuthorityServer服务器端,ClientGUI客户端,以及ProviderGUI 提供者端得三张主界面的截图: 1.AuthorityServer服务器端: 2.ClientGUI客户端:

3.ProviderGUI提供者端:

本软件的总体介绍: 平时,我们在上网时,经常会从网上面下载一些资源,有时要注册为XX 网站的用户才能够下载网站的资源,本软件就是实现的这样一系列功能的演示软件,因为演示软件,因此讲很多东西都做到了软件的外面,看起来很繁琐,其实,你如果按照下面的操作说明,按步骤执行还是很简单的。 本软件,并没有做用户的注册这一模块,而是将预先将一张用户列表存在服务器端,用户必须用列表中的用户名,才能够登录服务器成功,并且如果你的用户密码不正确,也不能获得正确的资源密文。 资源的加密加密是采用现在还是很安全的DES加密算法实现,在传输过程中,对数据进行MAC认证,来确认数据是否,本修改过。 可能会遇到的问题: 问题1. 有可能你在按下某一个按钮时,会出现如下的提示信息,如图示: 解决方法:这是因为你将.exe 程序从根目录中拿到外面了,程序中需要在根目录下载入.txt 文件。因此建议测试者请不要将exe程序拿到外面测试,如果拿到外面测试,请将根目录中的“name.txt”和“密码学课程设计软件说明.chm”文件一起复制出来,从而使程序能够正常的运行。 问题 2.在执行客户端应用程序时,可能你在点击Client客户端界面上的“获取密钥”按钮时,界面会出现卡住的现象,

现代密码与信息安全论文

现代密码与信息安全论文 浅 谈 现 代 密 码 与 信 息 安 全 院系: 班级: 姓名: 学号:

[摘要] 简单谈一下对现代密码学与信息安全的一个认识,和信息安全的防范。 [关键词] 发展基础知识作用安全防范 一、密码学的发展历程 密码学在公元前400多年就早已经产生了,正如《破译者》一书中所说“人类使用密码的历史几乎与使用文字的时间一样长”。密码学的起源的确要追溯到人类刚刚出现,并且尝试去学习如何通信的时候,为了确保他们的通信的机密,最先是有意识的使用一些简单的方法来加密信息,通过一些(密码)象形文字相互传达信息。接着由于文字的出现和使用,确保通信的机密性就成为一种艺术,古代发明了不少加密信息和传达信息的方法。例如我国古代的烽火就是一种传递军情的方法,再如古代的兵符就是用来传达信息的密令。就连闯荡江湖的侠士,都有秘密的黑道行话,更何况是那些不堪忍受压迫义士在秘密起义前进行地下联络的暗语,这都促进了密码学的发展。 事实上,密码学真正成为科学是在19世纪末和20世纪初期,由于军事、数学、通讯等相关技术的发展,特别是两次世界大战中对军事信息保密传递和破获敌方信息的需求,密码学得到了空前的发展,并广泛的用于军事情报部门的决策。例如在希特勒一上台时,德国就试验并使用了一种命名为“谜”的密码机,“谜”型机能产生220亿种不同的密钥组合,假如一个人日夜不停地工作,每分钟测试一种密钥的话,需要约4.2万年才能将所有的密钥可能组合试完,希特勒完全相信了这种密码机的安全性。然而,英国获知了“谜”型机的密码原理,完成了一部针对“谜”型机的绰号叫“炸弹”的密码破译机,每秒钟可处理2000个字符,它几乎可以破译截获德国的所有情报。后来又研制出一种每秒钟可处理5000个字符的“巨人”型密码破译机并投入使用,至此同盟国几乎掌握了德国纳

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

密码学课程设计实验报告 专业:信息安全 班级:0903 姓名:付晓帆 学号:U200915328

一、 DES 的编程实现 1.实验目的 通过实际编程掌握DES 的加、脱密及密钥生成过程,加深对DES 算法的认识。 2.实验原理 a.加密过程 DES 是一个分组密码,使用长度为56比特的密钥加密长度为64比特的明文,获得长度为64比特的密文,其加密过程: (1) 给定一个明文X ,通过一个固定的初始置换IP 置换X 的比特,获得X0,X0=IP(X)=L0R0,L0R0分别是X0的前32比特和后32比特。 (2) 然后进行16轮完全相同的运算,有如下规则,其中0

实验报告_密码学

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

实验三密码学实验 一、古典密码算法实验 一、实验目的 通过编程实现替代密码算法和置换密码算法,加深对古典密码体制的了解,为深入学习密码学奠定基础。 二、编译环境 运行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、根据实验原理部分对置换密码算法的介绍,自己创建明文信息,并选择一个密钥,编写置换密码算法的实现程序,实现加密和解密操作。 五、总结与思考 记录程序调试过程中出现的问题,分析其原因并找出解决方法。记录最终实现的程序执行结果。

现代密码学小论文

目录 现代密码学的认识与应用 (1) 一、密码学的发展历程 (1) 二、应用场景 (1) 2.1 Hash函数 (1) 2.2应用场景分析 (2) 2.2.1 Base64 (2) 2.2.2 加“盐” (2) 2.2.3 MD5加密 (2) 2.3参照改进 (3) 2.3.1 MD5+“盐” (3) 2.3.2 MD5+HMAC (3) 2.3.3 MD5 +HMAC+“盐” (3) 三、总结 (4)

现代密码学的认识与应用 一、密码学的发展历程 密码学的起源的确要追溯到人类刚刚出现,并且尝试去学习如何通信的时候,为了确保他们的通信的机密,最先是有意识的使用一些简单的方法来加密信息,通过一些(密码)象形文字相互传达信息。接着由于文字的出现和使用,确保通信的机密性就成为一种艺术,古代发明了不少加密信息和传达信息的方法。 事实上,密码学真正成为科学是在19世纪末和20世纪初期,由于军事、数学、通讯等相关技术的发展,特别是两次世界大战中对军事信息保密传递和破获敌方信息的需求,密码学得到了空前的发展,并广泛的用于军事情报部门的决策。 20世纪60年代计算机与通信系统的迅猛发展,促使人们开始考虑如何通过计算机和通信网络安全地完成各项事务,从而使得密码技术开始广泛应用于民间,也进一步促进了密码技术的迅猛发展。 二、应用场景 2.1 Hash函数 Hash函数(也称杂凑函数、散列函数)就是把任意长的输入消息串变化成固定长度的输出“0”、“1”串的函数,输出“0”、“1”串被称为该消息的Hash值(或杂凑值)。一个比较安全的Hash函数应该至少满足以下几个条件: ●输出串长度至少为128比特,以抵抗攻击。对每一个给定的输入,计算 Hash值很容易(Hash算法的运行效率通常都很高)。 ●对给定的Hash函数,已知Hash值,得到相应的输入消息串(求逆)是计 算上不可行的。 ●对给定的Hash函数和一个随机选择的消息,找到另一个与该消息不同的 消息使得它们Hash值相同(第二原像攻击)是计算上不可行的。 ●对给定的Hash函数,找到两个不同的输入消息串使得它们的Hash值相同 (即碰撞攻击)实际计算上是不可行的Hash函数主要用于消息认证算法 构造、口令保护、比特承诺协议、随机数生成和数字签名算法中。 Hash函数算法有很多,最著名的主要有MD系列和SHA系列,一直以来,对于这些算法的安全性分析结果没有很大突破,这给了人们足够的信心相信它们是足够安全的,并被广泛应用于网络通信协议当中。

密码学课程设计

一、设计题目 随机数产生器应用系统 二、课题要求 系统功能要求: 1)模拟线性移位寄存器、线性同余发生器等产生伪随机数,并比较算法性能以及伪随机数的随机性; 2)利用该模拟随机数,应用到口令认证系统中,完成口令的生产、口令的加密保护、登陆验证等功能; 3)利用该模拟随机数,应用到密钥生成系统中,可以利用该密钥完成对称密钥的加密和解密功能。 三、系统设计和模块设计 1.总体设计思路 利用线性同余发生器(LCG)和线性反馈移位寄存器(LFSR)生成伪随机数M序列,并通过口令认证系统完成口令生成加密工作,同时完成对随机数的加密和解密功能。 2.模块设计思路 2.1原理 通过一定的算法对事先选定的随机种子(seed)做一定的运算可以得到一组人工生成的周期序列,在这组序列中以相同的概率选取其中一个数字,该数字称作伪随机数,由于所选数字并不具有完全的随机性,但是从实用的角度而言,其随机程度已足够了。这里的“伪”的含义是,由于该随机数是按照一定算法模拟产生的,

其结果是确定的,是可见的,因此并不是真正的随机数。伪随机数的选择是从随机种子开始的,所以为了保证每次得到的伪随机数都足够地“随机”,随机种子的选择就显得非常重要,如果随机种子一样,那么同一个随机数发生器产生的随机数也会一样。 2.2线性同余算法生成随机数 到目前为止,使用最为广泛的随机数产生技术是由Lehmer首先提出的称为线性同余算法,即使用下面的线性递推关系产生一个伪随机数列x1,x2,x3,… 这个算法有四个参数,分别是: a 乘数 0 ≤ a < m c 增量 0 ≤ c< m m 模数 m > 0 ≤ x0 < m x0 初始种子(秘密) 0 伪随机数序列{ xn}通过下列迭代方程得到: xn+1=(axn+c)modm 如果m、a、c和x0都是整数,那么通过这个迭代方程将产生一系列的整数,其中每个数都在0 ≤ xn < m的范围内。数值m、a和c的选择对于建立一个好的伪随机数产生器十分关键。为了形成一个很长的伪随机数序列,需要将m设置为一个很大的数。一个常用准则是将m选为几乎等于一个给定计算机所能表示的最大非负整数。因而,在一个32位计算机上,通常选择的m值是一个接近或等于231的整数。此外,为了使得随机数列不易被重现,可以使用当前时间的毫秒数作为初始种子的位置。 2.2 线性反馈移位寄存器生成随机数 LFSR是指给定前一状态的输出,将该输出的线性函数再用作输入的线性寄存器。异或运算是最常见的单比特线性函数:对寄存器的某些位进行异或操作后作为输入,再对寄存器中的各比特进行整体移位。赋给寄存器的初始值叫做“种子”,因为线性反馈移位寄存器的运算是确定性的,所以,由寄存器所生成的数据流完全决定于寄存器当时或者之前的状态。而且,由于寄存器的状态是有

密码学论文

通过这个学期对应用密码学的学习,我深刻地体会到应用密码学的魅力,也认识到随着科学的发展,密码学越来越成为一个国家不可缺少的一项科学技术。密码学是研究编制密码和破译密码的技术科学。研究密码变化的客观规律,应用于编制密码以保守通信秘密的,称为编码学;应用于破译密码以获取通信情报的,称为破译学,总称密码学。 密码是通信双方按约定的法则进行信息特殊变换的一种重要保密手段。依照这些法则,变明文为密文,称为加密变换;变密文为明文,称为脱密变换。密码在早期仅对文字或数码进行加、脱密变换,随着通信技术的发展,对语音、图像、数据等都可实施加、脱密变换。密码学是在编码与破译的斗争实践中逐步发展起来的,并随着先进科学技术的应用,已成为一门综合性的尖端技术科学。它与语言学、数学、电子学、声学、信息论、计算机科学等有着广泛而密切的联系。它的现实研究成果,特别是各国政府现用的密码编制及破译手段都具有高度的机密性。 密码学主要经历了三个阶段:古代加密方法、古代密码和近代密码。首先,古代加密方法处于手工阶段,其源于应用的无穷需求总是来推动技术发明和进步的直接动力。存于石刻或史书中的记载表明,许多古代文明,包括埃及人、希伯来人、亚述人都在实践中逐步发明了密码系统。从某种意义上说,战争是科学技术进步的催化剂。人类自从有了战争,就面临着通信安全的需求,密码技术源远流长。古代加密方法大约起源于公元前440年出现在古希腊战争中的隐写术。当时为了安全传送军事情报,奴隶主剃光奴隶的头发,将情报写在奴隶的光头上,待头发长长后将奴隶送到另一个部落,再次剃光头发,原有的信息复现出来,从而实现这两个部落之间的秘密通信。公元前 400 年,斯巴达人就发明了“塞塔式密码” ,即把长条纸螺旋形地斜绕在一个多棱棒上,将文字沿棒的水平方向从左到右书写,写一个字旋转一下,写完一行再另起一行从左到右写,直到写完。解下来后,纸条上的文字消息杂乱无章、无法理解,这就是密文,但将它绕在另一个同等尺寸的棒子上后,就能看到原始的消息。这是最早的密码技术。我国古代也早有以藏头诗、藏尾诗、漏格诗及绘画等形式,将要表达的真正意思或“密语” 隐藏在诗文或画卷中特定位置的记载,一般人只注意诗或画的表面意境,而不会去注意或很难发现隐藏其中的“话外之音” 。比如:我画蓝江水悠悠,爱晚亭枫叶愁。秋月溶溶照佛寺,香烟袅袅绕轻楼其次是古典密码(机械阶段),古典密码的加密方法一般是文字置换,使用手工或机械变换的方式实现。古典密码系统已经初步体现出近代密码系统的雏形,它比古代加密方法复杂,其变化较小。古典密码的代表密码体制主要有:单表代替密码、多表代替密码及转轮密码。最后是近代密码,这是计算机阶段,密码形成一门新的学科是在 20 世纪 70 年代,这是受计算机科学蓬勃发展刺激和推动的结果。快速电子计算机和现代数学方法一方面为加密技术提供了新的概念和工具,另一方面也给破译者提供了下伪装:加密者对需要进行伪装机密信息(明文)进行伪装进行变换(加密变换),得到另外一种看起来似乎与原有信息不相关的表示(密文),如果合法者(接收者)获得了伪装后的信息,那么他可以通过事先约定的密钥,从得到的信息中分析得到原有的机密信息(解密变换),而如果不合法的用户(密码分析者)试图从这种伪装后信息中分析得到原有的机密信息,那么,要么这种分析过程根本是不可能的,要么代价过于巨大,以至于无法进行。 在计算机出现以前,密码学的算法主要是通过字符之间代替或易位实现的,我们称这些密码体制为古典密码。其中包括:易位密码、代替密码(单表代替密码、多表代替密码等)。这些密码算法大都十分简单,现在已经很少在实际应用中使用了。由于密码学是涉及数学、通讯、计算机等相关学科的知识,就我们现有的知识水平而言,只能初步研究古典密码学的基本原理和方法。但是对古典密码学的研究,对于理解、构造和分析现代实用的密码都是很有帮助。然后是古典密码学的基础运用:从密码学发展历程来看,可分为古典密码(以字符为基本加密单元的密码)以及现代密码(以信息块为基本加密单元的密码)两类。凯

密码学实验报告(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 最后完成的效果如图:

密码学论文(1)

密码学论文 班级:统计学(金融数学方向) 姓名:鲁亚婷 学号:110444061

密码学论文 在我们的生活中有许多的秘密和隐私,我们不想让其他人知道,更不想让他们去广泛传播或者使用。对于我们来说,这些私密是至关重要的,它记载了我们个人的重要信息,其他人不需要知道,也没有必要知道。为了防止秘密泄露,我们当然就会设置密码,保护我们的信息安全。更有甚者去设置密保,以防密码丢失后能够及时找回。 我们要为信息添加安全锁,设置密码,那么密码到底是干什么的呢?其实,密码就是为了防止未被允许进入的陌生人进入你的“账户”、“系统”等读写你的文件和数据。很简单的理解,就和门要上锁一样,如果不上锁,那别人去你的家就和去自己的家一样了。有此可知,密码在生活中的重要性。 “密码”一词对人们来说并不陌生,人们可以举出许多有关使用密码的例子。如保密通信设备中使用“密码”,个人在银行取款使用“密码”,在计算机登录和屏幕保护中使用“密码”,开启保险箱使用“密码”,儿童玩电子游戏中使用“密码”等等。这里指的是一种特定的暗号或口令字。现代的密码已经比古代有了长远的发展,并逐渐形成一门科学,吸引着越来越多的人们为之奋斗。 从专业上来讲,密码是通信双方按约定的法则进行信息特殊变换的一种重要保密手段。依照这些法则,变明文为密文,称为加密变换;变密文为明文,称为脱密变换。密码在早期仅对文字或数码进行加、脱密变换,随着通信技术的发展,对语音、图像、数据等都可实施加、脱密变换。 为了研究密码所以就有了密码学。密码学是研究编制密码和破译密码的技术科学。研究密码变化的客观规律,应用于编制密码以保守通信秘密的,称为编码学;应用于破译密码以获取通信情报的,称为破译学,总称密码学。 密码学是在编码与破译的斗争实践中逐步发展起来的,并随着先进科学技术的应用,已成为一门综合性的尖端技术科学。它与语言学、数学、电子学、声学、信息论、计算机科学等有着广泛而密切的联系。它的现实研究成果,特别是各国政府现用的密码编制及破译手段都具有高度的机密性。 进行明密变换的法则,称为密码的体制。指示这种变换的参数,称为密钥。它们是密码编制的重要组成部分。密码体制的基本类型可以分为四种:错乱——按照规定的图形和线路,改变明文字母或数码等的位置成为密文;代替——用一

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

密码学课程报告《RSA加密解密算法》 专业:信息工程(信息安全) 班级:1132102 学号:201130210214 姓名:周林 指导老师:阳红星 时间:2014年1月10号

一、课程设计的目的 当前最著名、应用最广泛的公钥系统RSA是在1978年,由美国麻省理工学院(MIT)的Rivest、Shamir和Adleman在题为《获得数字签名和公开钥密码系统的方法》的论文中提出的。 RSA算法是第一个既能用于数据加密也能用于数字签名的算法,因此它为公用网络上信息的加密和鉴别提供了一种基本的方法。它通常是先生成一对RSA 密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册,人们用公钥加密文件发送给个人,个人就可以用私钥解密接受。为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。 公钥加密算法中使用最广的是RSA。RSA算法研制的最初理念与目标是努力使互联网安全可靠,旨在解决DES算法秘密密钥的利用公开信道传输分发的难题。而实际结果不但很好地解决了这个难题;还可利用RSA来完成对电文的数字签名以抗对电文的否认与抵赖;同时还可以利用数字签名较容易地发现攻击者对电文的非法篡改,以保护数据信息的完整性。此外,RSA加密系统还可应用于智能IC卡和网络安全产品。 二、RSA算法的编程思路 1.确定密钥的宽度。 2.随机选择两个不同的素数p与q,它们的宽度是密钥宽度的1/2。 3.计算出p和q的乘积n 。 4.在2和Φ(n)之间随机选择一个数e , e 必须和Φ(n)互素,整数e 用做加密密钥(其中Φ(n)=(p-1)*(q-1))。 5.从公式ed ≡ 1 mod Φ(n)中求出解密密钥d 。 6.得公钥(e ,n ), 私钥 (d , n) 。 7.公开公钥,但不公开私钥。 8.将明文P (假设P是一个小于n的整数)加密为密文C,计算方法为: C = Pe mod n 9.将密文C解密为明文P,计算方法为:P = Cd mod n 然而只根据n和e(不是p和q)要计算出d是不可能的。因此,任何人都可对明文进行加密,但只有授权用户(知道d)才可对密文解密 三、程序实现流程图: 1、密钥产生模块:

密码学课程设计

信息安全技术应用实践 课程设计报告 设计题目信息的安全传递 专业名称: 班级: 学号: 姓名: 指导教师: 2014年7月

目录 一、引言 (3) 二、设计方案 (3) 1.安全需求 (3) 2.概要设计 (3) 3.详细设计 (5) 三、安全性分析........................................................................................................... 错误!未定义书签。 四、运行结果 (8) 五、总结 (8) 参考文献 (11)

一、引言 对于信息安全问题,经常出现QQ被盗号骗取财物等案件的出现。信息的安全性十分重要,尤其是一些个人的隐私。 人们也越来越重视信息的安全传递,所以设计出一个安全传递信息的系统刻不容缓。所以在此次课程设计我设计了一个信息传递系统,此系统是基于JAVA应用程序开发的,结合密码学的加密算法实现。其主要特性是安全的完成信息的传递。 二、设计方案 1.安全需求 1).服务器端每一客户口令安全存储(口令保护) 2).对所有通信内容用分组密码以计数器模式进行加密 3).对所有的通信内容用认证码(MAC)进行完整性检验 4).服务器对每个客户进行身份认证 5).服务器端抗重放攻击 2概要设计 1. (BrokerGUI) 发送代理端代替发送者进行内部操作,它设置了与服务端的共享密钥、实现共享口令的加密密钥的加密、随机密钥的加密,、文件的加密、消息的验证。 工作进程:

假设口令“sharedPwd”为代理与授权服务器共享口令 1)用“sharedPwd”生成加密密钥“K-BC”,以及MAC密钥“K-MAC” 2)随机生成一个密钥“K”;并且用“K”生成一个新的加密密钥“K-temp” 和一个新的MAC密钥“K-MAC-temp”。 3)对输入文件内容进行加密和计算MAC E[ K-temp, file contents ] || MAC[ K-MAC-temp, E[ K-temp, file contents ] ] 4)对新的密钥“K”进行加密和计算MAC E[ K-BC, K ] || MAC[ K-MAC, E[ K-BC, K ] ] 5)输出所有上述信息 2.(BrokerClient) 接收代理端应该设置自己的用户名和密码,且要发防重放的随机数。与服务器端建立通信通道,向服务器端发送加密后的信息。对方接收来自服务器的信息。 相对服务器而言,接收端的任务主要就是保证消息的安全性、保密性、完整性等。 1)用“用户口令”生成加密密钥“K-BC-user”,以及MAC密钥“K-MAC-user1”; 2)接收端提供给服务器 R ||user1 || MAC[ K-MAC-user1, R || user1 ] 这里R是一个随机数,user1为用户名 3)接收端从服务器获得 E[ K-BC-user1, K ] || MAC[ K-MAC-user1, E[ K-BC-user1, K ] ] 解密得“K”,并计算出加密密钥“K-temp”和 一个新的MAC密钥“K-MAC-temp”。 解密和验证“file contents”。 3.AuthorityServer) 服务端实现发送代理端和接收代理端之间的连接,是一个中转站。服务器接受和发送的信息都是加密的,保证了消息的安全性。 服务端实现对了发送代理端的消息认证,实现接收代理端的用户身份认证,对密钥的解密和加密,实现了防重放攻击。 工作进程:

相关主题
文本预览
相关文档 最新文档