vc++基于Misty1算法的加密软件设计+源码 第5页
6.加密函数加密操作如图6:
图6 加密过程
64位的明文输入P分为两部份分别为32位L0和R0,在第一轮和之后的每两个轮回中,左边和右边的两部分Li-1和Ri-1分别与KLi通过FL函数产生32位的输出。在每次轮回中的左边部份调用接受32位输入和16位的工作密钥KIi以及16位的工作密钥KOi的FO函数,产生32位的输出。在每一次轮回中,左边部分和右边部分相互交换给Li和Ri。经过8次轮回最后一次调用KL函数得到左部和右部,然后再作出最后的重组左边和右边即Ln+1和Rn+1产生64位输出C64,其中n是轮回的次数(一般为8)。
其中加密输入为:
P=L0‖R0
KL= {KLi}
KO= {KOi}
KI= {KIi}
加密函数则是:
For i=1, 3,..., n-1;
Ri=FL (Li-1,KLi)
Li=FL (Ri-1,KLi+1)^FO(Ri,KOi,KIi)
Li+1=Ri^FO(Li,KOi+2,KIi+1)
Ri+1=Li
for i=n+1;
Ri=FL(Li-1.KLi)
Li= FL(Ri-1.KLi+1)
最后输出:C=Ln+1‖Rn+1
下面是加密代码:
void misty1::Encrypt(BYTE *ptext,BYTE *userkey,BYTE *ctext)
{
DWORD L0,L1,L2,L3,L4,L5,L6,L7,L8,L9,R0,R1,R2,R3,R4,R5,R6,R7,R8,R9;//临时明文,密文
KeySchedule(userkey);//密钥调度,产生加密密钥
L0=(((DWORD)ptext[0])<<24)+(((DWORD)ptext[1])<<16)+(((DWORD)ptext[2])<<8)+((DWORD)ptext[3]);
R0=(((DWORD)ptext[4])<<24)+(((DWORD)ptext[5])<<16)+(((DWORD)ptext[6])<<8)+((DWORD)ptext[7]);
R1=FL(L0,KL[0]);
L1=FO(R1,KO,KI)^FL(R0,KL[1]);
R2=L1;
L2=FO(R2,KO+4,KI+3)^R1;
R3=FL(L2,KL[2]);
L3=FO(R3,KO+8,KI+6)^FL(R2,KL[3]);
R4=L3;
L4=FO(R4,KO+12,KI+9)^R3;
R5=FL(L4,KL[4]);
L5=FO(R5,KO+16,KI+12)^FL(R4,KL[5]);
R6=L5;
L6=FO(R6,KO+20,KI+15)^R5;
R7=FL(L6,KL[6]);
L7=FO(R7,KO+24,KI+18)^FL(R6,KL[7]);
R8=L7本文来自辣文论文网原文请找QQ752018766
L9=FL(R8,KL[9]);//最后一轮
ctext[0]=(BYTE)((L9>>24)&0XFF);ctext[1]=(BYTE)((L9>>16)&0XFF);ctext[2]=(BYTE)((L9>>8)&0XFF);ctext[3]=(BYTE)(L9&0XFF);
ctext[4]=(BYTE)((R9>>24)&0XFF);ctext[5]=(BYTE)((R9>>16)&0XFF);ctext[6]=(BYTE)((R9>>8)&0XFF);ctext[7]=(BYTE)(R9&0XFF);
}7.解密函数
解密函数运行如图7:与加密运行完全相同,只需要改变两项:
1、FL-1函数取代所有的FL函数;
2、函数中的子密钥的应用都扭转。
图7 解密过程
具体代码:
Void misty1::Decrypt (BYTE *ctext,BYTE *userkey,BYTE *ptext)
{
DWORD L0,L1,L2,L3,L4,L5,L6,L7,L8,L9,R0,R1,R2,R3,R4,R5,R6,R7,R8,R9;//临时明文,密文
KeySchedule(userkey);// 密钥调度,产生解密密钥
L9=(((DWORD)ctext[0])<<24)+(((DWORD)ctext[1])<<16)+(((DWORD)ctext[2])<<8)+
上一页 [1] [2] [3] [4] [5] [6] 下一页
vc++基于Misty1算法的加密软件设计+源码 第5页下载如图片无法显示或论文不完整,请联系qq752018766