3DES算法报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

3DES加解密算法报告

一、3DES算法简介

3DES又称Triple DES,是DES加密算法的一种模式,它使用3条56位的密钥对

数据进行三次加密。数据加密标准(DES)是美国的一种由来已久的加密标准,它使用对称密钥加密法,并于1981年被ANSI组织规范为ANSI X.3.92。DES使用56位密钥和密码块的方法,而在密码块的方法中,文本被分成64位大小的文本块然后再进行加密。比起最初的DES,3DES更为安全。

3DES(即Triple DES)是DES向AES过渡的加密算法(1999年,NIST将3-DES 指定为过渡的加密标准),是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加密算法,其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,P代表明文,C代表密文,这样,

设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,P代表明文,C代表密表,这样,

3DES加密过程为:C=Ek3(Dk2(Ek1(P)))

3DES解密过程为:P=Dk1((EK2(Dk3(C)))

二、3DES程序运行界面

加密时,指定要加密的文件路径、加密的密钥以及加密后的文件名。

加密后的文件,打开时,显示的是乱码。

解密时指定要解密的文件路径、解密密钥(确保与加密密钥相同)以及解密后文件的名字。

解密后,打开解密后的文件,显示正确的字符,解密成功。

三、3DES程序的函数和类

1.void SDES(char Out[8], char In[8], const PSubKey pSubKey, bool Type) DES加密函数

2. bool DES::Execution_3DES(char *Out, char *In, long datalen, const char *Key, int keylen,

bool Type) 3DES加密函数

3. void CMy3DES_Encryption_DecryptionDlg::OnButton2() 对话框加密按钮函数,调用加密

函数

4. void CMy3DES_Encryption_DecryptionDlg::OnButton3() 对话框解密按钮函数,调用加密

函数进行解密

5.void CMy3DES_Encryption_DecryptionDlg::OnButton1() //获取源文件路径和文件名

四、3DES程序的主要函数注释

1、以下的两个函数为对明文进行加解密,使用两个密钥做三次加密,方式为加密-解密-加密。函数中调用了DES类中的SDES函数进行标准DES加解密。

在进行加密时,生成加密密钥,把待加密的明文分割成64位的块,把第i-1层加密后的密文作为第i层加密的明文输入,根据用户指定的加密层数进行n层加密,最终生成的密文存放在data所指向的内存中.

在进行解密时,生成解密密钥,把待解密文分割成64位的块,把第i-1层解密后的"明文"作为第i层解密的密文输入,根据用户指定的解密层数进行n层解密,最终生成的明文存放在data所指向的内存中.

bool DES::Execution_3DES(char *Out, char *In, long datalen, const char *Key, int keylen, bool Type)

{

if( !( Out && In && Key && (datalen=(datalen+7)&0xfffffff8) ) ) //datalen的长度对齐操作,又判断其是否为0,这些条件加起来实际上就是判断所有参数是否有效。

return false;

SetKey(Key, keylen);

// 3次DES 加密:加(key0)-解(key1)-加(key0) 解密::解(key0)-加(key1)-解(key0)

for(long i=0,j=datalen>>3; i

{

SDES(Out, In, &SubKey[0], Type);

SDES(Out, Out, &SubKey[1], !Type);

SDES(Out, Out, &SubKey[0], Type);

}

return true;

}

void SDES(char Out[8], char In[8], const PSubKey pSubKey, bool Type)

{

static bool M[64], tmp[32], *Li=&M[0], *Ri=&M[32];

ByteToBit(M, In, 64);

Transform(M, M, IP_Table, 64);

if( Type == ENCRYPT )

{

for(int i=0; i<16; ++i)

{

memcpy(tmp, Ri, 32);

F_func(Ri, (*pSubKey)[i]);

Xor(Ri, Li, 32);

memcpy(Li, tmp, 32);

}

}

else

{

for(int i=15; i>=0; --i)

{

memcpy(tmp, Li, 32);

F_func(Li, (*pSubKey)[i]);

Xor(Li, Ri, 32);

memcpy(Ri, tmp, 32);

}

}

Transform(M, M, IPR_Table, 64);

BitToByte(Out, M, 64);

}

2、本函数实现对由用户输入的文件的加密,函数中使用了判断机制,以判断是否用户指定了要加密的文件、加密的密钥以及加密后密文的文件名等。

在程序的OnInitDialog()中,通过定义一个成员变量m_Path2来保存程序的目录,并把加密后的密文保存到程序的Debug目录下。

在函数中利用了CFile类实现对要加密文件的读,对读出的数据加密后再写入到用户指定的密文文件中,密文文件的格式与要加密的文件是一样的,这不需要由用户指定。

void CMy3DES_Encryption_DecryptionDlg::OnButton2()

{

UpdateData(TRUE);

if(m_SourcePath=="")

{

MessageBox("请选择要加密的文件!","提示",MB_ICONW ARNING);

return;

相关文档
最新文档