密码学课程设计报告文档格式.docx

上传人:b****4 文档编号:15938489 上传时间:2022-11-17 格式:DOCX 页数:20 大小:147.30KB
下载 相关 举报
密码学课程设计报告文档格式.docx_第1页
第1页 / 共20页
密码学课程设计报告文档格式.docx_第2页
第2页 / 共20页
密码学课程设计报告文档格式.docx_第3页
第3页 / 共20页
密码学课程设计报告文档格式.docx_第4页
第4页 / 共20页
密码学课程设计报告文档格式.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

密码学课程设计报告文档格式.docx

《密码学课程设计报告文档格式.docx》由会员分享,可在线阅读,更多相关《密码学课程设计报告文档格式.docx(20页珍藏版)》请在冰豆网上搜索。

密码学课程设计报告文档格式.docx

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比特。

见图二。

(IDEA加密算法轮结构)

三:

源代码:

/*c-programofblockcipherIDEA*/

#include<

windows.h>

stdio.h>

process.h>

string.h>

stdlib.h>

conio.h>

#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'

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;

unsignedcharkey_data_ptr[256];

intcounter;

inti;

/*strcpy(key_data_ptr,key_data_ptrp);

*/

for(i=0;

i<

key_data_len;

i++)

/*state[i]=key.state[i];

key_data_ptr[i]=key_data_ptrp[i];

256;

state[i]=key->

state[i];

for(counter=0;

counter<

256;

counter++)

state[counter]=(char)counter;

key->

x=0;

y=0;

index1=0;

index2=0;

{

index2=(key_data_ptr[index1]+state[counter]+index2)%256;

swap_byte(state+counter,state+index2);

index1=(index1+1)%key_data_len;

}

state[i]=state[i];

}

voidrc4(unsignedcharbuffer_ptr[8],intbuffer_len,rc4_key*key)

unsignedchart;

unsignedcharxorIndex;

shortcounter;

x=key->

x;

y=key->

y;

state[i]=key->

buffer_len;

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];

key->

state[i]=state[i];

x=x;

y=y;

voidRC4RC4(unsignedcharlSourcestr[],unsignedchar*lSessionkey)

unsignedcharseed[256];

unsignedchardata[256];

unsignedcharbuf[buf_size];

unsignedchardigit[5];

longhex;

intrd;

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;

n;

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]='

rd=strlen((char*)buf);

rc4(buf,rd,&

strcpy((char*)lSourcestr,(char*)buf);

return;

voidproduce_plaintext(unsignedchartext[8],unsignedintXX[4])

4;

XX[i]=text[2*i];

XX[i]=(XX[i]<

<

8)+text[2*i+1];

voidproduce_miwen(unsignedchartext[8],unsignedintYY[4])

YY[i]=(unsignedint)text[2*i];

YY[i]=(YY[i]<

/*encryptionalgorithm*/

voidcip(unsignedintin[4],unsignedintout[4],unsignedintZ[7][10])

unsignedintr,x1,x2,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1