密码学课程设计报告.docx
《密码学课程设计报告.docx》由会员分享,可在线阅读,更多相关《密码学课程设计报告.docx(20页珍藏版)》请在冰豆网上搜索。
密码学课程设计报告
XX大学
密码学课程设计
姓名:
学号:
学院:
指导老师:
完成日期:
2015.01.06
一:
实验任务及要求
任务:
使用IDEA算法实现加解密过程。
要求:
1、输入至少包括两个分组。
2、核心功能是加解密过程,可适当增加附加功能。
3、2人/组
二:
实现原理
IDEA算法是一个分组长度为64比特的分组密码算法,密钥长度为128比特,由8轮迭代操作实现。
每个迭代都由三种函数:
mod(216)加法、mod(216+1)乘法和逐位异或算法组成。
整个算法包括子密钥产生、数据加密过程、数据解密过程三部分。
该算法规定明文和密文块均为64比特,密钥长度为128
比特,加解密相同,只是密钥各异。
1、加密过程:
IDEA总共进行8轮迭代操作,每轮需要6个子密钥,另外还需要4个额外子密钥输出变换,所以总共需要52个子密钥,这52个子密钥都是从128比特密钥中扩展出来的。
输入的明文为8个字符(即64比特),将64比特数据块分成X1,,X2,,X,3,X,4四个子块,每一子块16比特。
这4个子块将作为第一轮迭代的输入,全部共8轮迭代。
在每一轮中,这4个子块相互异或、相加和相乘,且与6个16比特子密钥相异或、相加和相乘。
最后在输出变换中4个子块与4个子密钥进行运算。
见图一。
2、解密过程
和加密密钥一样,解密密钥也需要扩展,不同的是解密密钥是由加密密钥加法逆或乘法逆构成的,且两者一一对应。
IDEA算法的解密过程和加密过程一样,只是加密用加密密钥EK,解密用的是解密密钥DK。
输入的密文同样为8个字符(即64比特),将64比特数据块分成Y1,,Y2,,Y,3,Y,4四个子块,每一子块16比特。
这4个子块将作为第一轮迭代的输入,全部共8轮迭代。
见图二。
(IDEA加密算法轮结构)
三:
源代码:
/*c-programofblockcipherIDEA*/
#include
#include
#include
#include
#include
#include
#definemaxim65537L
#definefuyi65536L
#defineone65535L
#defineround8
#definebuf_size8
#defineSIZE8
#defineswap_byte(x,y)t=*(x);*(x)=*(y);*(y)=t
intWINAPIDLLEntryPoint(HINSTANCEhDLL,DWORDdwReason,LPVOIDReserved);
intdeideaFile(char*,char*,unsignedchar*);
intenideaFile(char*,char*,unsignedchar*);
voiddeideaString(unsignedchar*keysession,unsignedchar*inputdata,unsignedlonginlength,unsignedchar*outdata,unsignedlong*outlength);
voidenideaString(unsignedchar*keysession,unsignedchar*inputdata,unsignedlonginlength,unsignedchar*outdata,unsignedlong*outlength);
/*encryptionalgorithm*/
voidcip(unsigned[],unsigned[],unsignedZ[7][10]);
/*generateencryptionsubkeysZ's*/
voidkey(unsigneduskey[8],unsignedintZ[7][10]);
/*computedecryptionsubkeysDK's*/
voidde_key(unsignedintZ[7][10],unsignedintDK[7][10]);
/*computeinverseofxinbyEuclideangcdalg.*/
unsignedintinv(unsignedintxin);
/*multiplicationusingtheLow-Highalgorithm*/
unsignedintmul(unsignedinta,unsignedintb);
voidproduce_plaintext(unsignedchartext[],unsignedintXX[]);
voidproduce_miwen(unsignedchartext[8],unsignedintYY[4]);
typedefstructrc4_key
{
unsignedcharstate[256];
unsignedcharx;
unsignedchary;
}rc4_key;
voidprepare_key(unsignedcharkey_data_ptrp[256],intkey_data_len,rc4_key*key)
{
unsignedchart;
unsignedcharindex1;
unsignedcharindex2;
unsignedcharstate[256];
unsignedcharkey_data_ptr[256];
intcounter;
inti;
/*strcpy(key_data_ptr,key_data_ptrp);*/
for(i=0;i/*state[i]=key.state[i];*/
key_data_ptr[i]=key_data_ptrp[i];
for(i=0;i<256;i++)
state[i]=key->state[i];
for(counter=0;counter<256;counter++)
state[counter]=(char)counter;
key->x=0;
key->y=0;
index1=0;
index2=0;
for(counter=0;counter<256;counter++)
{
index2=(key_data_ptr[index1]+state[counter]+index2)%256;
swap_byte(state+counter,state+index2);
index1=(index1+1)%key_data_len;
}
for(i=0;i<256;i++)
key->state[i]=state[i];
}
voidrc4(unsignedcharbuffer_ptr[8],intbuffer_len,rc4_key*key)
{
unsignedchart;
unsignedcharx;
unsignedchary;
unsignedcharstate[256];
unsignedcharxorIndex;
shortcounter;
inti;
x=key->x;
y=key->y;
for(i=0;i<256;i++)
state[i]=key->state[i];
for(counter=0;counter{
x=(x+1)%256;
y=(state[x]+y)%256;
swap_byte(state+x,state+y);
xorIndex=(state[x]+state[y])%256;
buffer_ptr[counter]^=state[xorIndex];
}
for(i=0;i<256;i++)
key->state[i]=state[i];
key->x=x;
key->y=y;
}
voidRC4RC4(unsignedcharlSourcestr[],unsignedchar*lSessionkey)
{
unsignedcharseed[256];
unsignedchardata[256];
unsignedcharbuf[buf_size];
unsignedchardigit[5];
longhex;intrd;
inti;
intn;
rc4_keykey;
intabcd;
abcd=strlen((char*)lSessionkey);
strcpy((char*)data,(char*)lSessionkey);
data[abcd]='\0';
n=strlen((char*)data);
if(n&1)
{
strcat((char*)data,"0");
n++;
}
n/=2;
strcpy((char*)digit,"AA");
for(i=0;i{
digit[2]=data[i*2];
digit[3]=data[i*2+1];
hex=0xaa10;
seed[i]=(char)hex;
}
prepare_key(seed,n,&key);
rd=strlen((char*)lSourcestr);
strcpy((char*)buf,(char*)lSourcestr);
buf[rd]='\0';
rd=strlen((char*)buf);
rc4(buf,rd,&key);
buf[rd]='\0';
strcpy((char*)lSourcestr,(char*)buf);
return;
}
voidproduce_plaintext(unsignedchartext[8],unsignedintXX[4])
{
inti;
for(i=0;i<4;i++)
{
XX[i]=text[2*i];
XX[i]=(XX[i]<<8)+text[2*i+1];
}
}
voidproduce_miwen(unsignedchartext[8],unsignedintYY[4])
{
inti;
for(i=0;i<4;i++)
{
YY[i]=(unsignedint)text[2*i];
YY[i]=(YY[i]<<8)+text[2*i+1];
}
}
/*encryptionalgorithm*/
voidcip(unsignedintin[4],unsignedintout[4],unsignedintZ[7][10])
{
unsignedintr,x1,x2,