优秀的毕业设计论文网
计算机 JAVA 电子信息 单片机 机械机电 模具 土木工程 建筑结构 论文
热门搜索词:网络 ASP.NET 汽车 电气 数控 PLC

064_基于Misty1算法的加密软件(VC)

以下是资料介绍,如需要完整的请充值下载.
1.无需注册登录,支付后按照提示操作即可获取该资料.
2.资料以网页介绍的为准,下载后不会有水印.资料仅供学习参考之用.
  
资料介绍:

3 加密软件的设计和实现
3.1 软件功能分析
软件要求如下:
1. 实现对加/解密正确性的演示;
2. 对文件(文本文件或BMP文件)进行加密,并能对加密文件进行解密;
分析图如下:

图8 流程图
所以说要进行编码的程序有:
1. MISTY1算法的c++语言实现,能实现正确的加密解密;
2. 图形界面的设计与编码。

【买计算机毕业论文就到www.think58.com】 think58.com

[来源:http://think58.com]

think58好,好think58 [来源:http://think58.com]

3.2 MISTY1的c++实现
由于我们使用的是MFC编程方式,因此为了更好的体现面向对象的编程思想,我们将MISTY1算法用一个C++类来实现。其关键代码如下:
DWORD misty1::FL (DWORD X, DWORD KEY)
{
DWORD XL, XR, KL, KR, YL, YR;
XL=X>>16; XR=X&0x0000FFFF;
KL=KEY>>16; KR=KEY&0x0000FFFF;
YR= (XL&KL) ^XR; YL= (YR|KR) ^XL;
Return (YL<<16) |YR;
}
DWORD misty1::FLINV (DWORD Y, DWORD KEY)
{
DWORD XL, XR, KL, KR, YL, YR;
YL=Y>>16; YR=Y&0x0000FFFF;
KL=KEY>>16; KR=KEY&0x0000FFFF;
XL= (YR|KR) ^YL; XR= (XL&KL) ^YR;
Return (XL<<16) |XR;
}
DWORD misty1::FO (DWORD X, WORD KO [4], WORD KI [3])
{
WORD L1, L2, L3, R1, R2, R3;
R1=FI((KO[0]^((WORD)(X>>16)&0xFFFF)),KI[0])^((WORD)(X&0xFFFF));
L1=(WORD)(X&0xFFFF);
R2=FI ((L1^KO [1]), KI [1]) ^R1;
L2=R1;
R3=FI ((L2^KO [2]), KI [2]) ^R2;
L3=R2^KO [3];
Return (((DWORD) L3) <<16)| ((DWORD) R3);

think58

[资料来源:http://THINK58.com]


}
WORD misty1::FI (WORD X, WORD KI)//right
{
WORD L1, L2, L3, R1, R2, R3;
R1=S9 [((X>>7) &0x1FF)] ^(X&0x007F);
L1=X&0x7F;
R2=S7 [L1] ^ (R1&0x7F) ^ ((KI>>9) &0x7F);
L2=R1^ (KI&0x1FF);
R3=S9 [L2] ^R2;
L3=R2;
Return (L3<<9) |R3;
}
Void misty1::KeySchedule (BYTE *userkey)
{
WORD tempkey1 [16], tempkey2 [16];
int i;
for (i=0;i<8;i++) tempkey1[i]=(((WORD)userkey[i*2])<<8)+((WORD)userkey[i*2+1]);
for (i=0;i<8;i++) tempkey2[i]=FI(tempkey1[i],tempkey1[(i+1)%8]);
for (i=0;i<8;i++)
{
KO[4*i]=tempkey1[i];KO[4*i+1]=tempkey1[(i+2)%8];KO[4*i+2]=tempkey1[(i+7)%8];KO[4*i+3]=tempkey1[(i+4)%8];
KI[3*i]=tempkey2[(i+5)%8];KI[3*i+1]=tempkey2[(i+1)%8];KI[3*i+2]=tempkey2[(i+3)%8];
}
for (i=0;i<10;i++)
{
if (i%2==0) KL[i]=(((DWORD)tempkey1[(i+1)/2])<<16)|(DWORD)tempkey2[(((i+1)/2)+6)%8];
else KL[i]=(((DWORD)tempkey2[(i/2+2)])<<16)|(DWORD)tempkey1[((i/2)+4)%8]; 本文来自think58 [资料来源:http://THINK58.com]
}
} think58好,好think58

[资料来源:http://think58.com]

3.3 加密软件的界面设计
文件加密/解密是将要加密/解密的文件中的数据存入数据缓存,调用MISTY1的加密/解密函数,对缓存中的数据进行加密/解密,最后将加密/解密都的文件存入指定的路径,这样就完成了文件的加密/解密。
程序的设计主要是利用Microsoft Visual C++6.0的MFC编程来完成对加密软件界面的实现。
界面中的控件及其属性如下各表所示: 本文来自think58 [资料来源:http://THINK58.com]

copyright think58 [资料来源:http://www.THINK58.com]

[资料来源:http://THINK58.com]

表1:控件属性
控件类型 属性 属性值
Statie Text Caption 输入文件
Statie Text Caption 密码
Statie Text Caption 保存文件
Edit Box Caption IDC-EDIT1
Edit Box Caption IDC-EDIT2
Edit Box Caption IDC-EDIT3 [资料来源:http://www.THINK58.com]

表2: 控件属性
控件类型 控件ID 属性 属性值
Buttou IDC-BUTTON1 Caption 加密
Buttou IDC-BUTTON2 Caption 解密
Buttou IDC-BUTTON3 Caption 浏览
Buttou IDC-BUTTON4 Caption 保存 think58

[版权所有:http://think58.com]

表3: 控件属性
控件ID 变量类型 变量名称
IDC-EDIT1 Cstring m-filename
IDC-EDIT2 Cstring m-filekey
IDC-EDIT3 Cstring m-savefile
3.4 加密软件的界面编码
3.4.1 文件加密
在文件加密过程中,把需要加密的文件中的数据读入缓存中,取得文件数据的长度。由于MISTY1加密算法每次只能实现对64位即8字节的数据进行加密,所以将先文件总长度除以8,求出它的倍数c和余数d。在加密的时候,先依次对每8字节进行加密进行c次;然后对最后剩下的d个字节进行加密,由于最后数据不满8字节,所以在加密之前需要进行填充,至少在数据后面填充一个字节,使其长度为8字节的整倍数。当文件为BMP文件的时候,加密的时候先将文件头8字节的数据依次读出,在对除去前8字节的数据进行加密,其加密过程与文本文件加密相同。其具体代码如下:
Void CMisty1lxpDlg::Onfileenc () //文件加密
{
UpdateData (TRUE);
if (m_filename=="") return;
CFile ff (m_filename, CFile::modeRead);
long lFileLen=ff.GetLength();//文件长度
long c=lFileLen/8;
long d=lFileLen%8;
CString fileext=m_filename.Right (4); 内容来自think58 [资料来源:http://www.THINK58.com]
CString filename=m_filename.Left (m_filename.GetLength ()-4);
if (m_savefile=="") m_savefile=filename+"[已加密]"+fileext;
CFile fp (m_savefile, CFile::modeCreate|CFile::modeWrite);
fp.SeekToBegin ();
ff.SeekToBegin ();
//CFile::modeCreate 创建方式打开文件,如文件已存在则将其长度设置为0
//CFile::modeReadWrite 读写方式打开文件
misty1 mistyk;
unsigned char inbuff [8], oubuff [8], skey [16];
memcpy (skey, (LPCTSTR) m_filekey, 16);
if (fileext==_T (".bmp"))
{
ff.Read(m_bmphead,64);
fp.Write(m_bmphead,64);
for(long i=8;i<c;i++)
{
ff.Read(inbuff,8);
mistyk.Encrypt((unsigned char *)inbuff,(unsigned char *)skey,oubuff);
fp.Write(oubuff,8);
}
}
else
{
for(long i=0;i<c;i++)
{
ff.Read(inbuff,8);
mistyk.Encrypt((unsigned char *)inbuff,(unsigned char *)skey,oubuff);
fp.Write(oubuff,8);
}
}
if(d>0)
{ 内容来自think58 [来源:http://www.think58.com]
ff.Read(inbuff,d);
mistyk.Encrypt((unsigned char *)inbuff,(unsigned char *)skey ,oubuff );
fp.Write(oubuff,8);
}
ff.Close();
fp.Close();
AfxMessageBox("加密成功!");
UpdateData(FALSE);

}
think58.com [资料来源:http://THINK58.com]