密码学课程设计报告.docx
- 文档编号:3027527
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:20
- 大小:147.30KB
密码学课程设计报告.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,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 密码学 课程设计 报告