DES加密算法与解密(带流程图)
des密码算法编程

des密码算法编程
DES密码算法是一种对称加密算法,它使用一个密钥进行加密和解密操作。
下面是一个简单的Python示例,演示如何使用DES密码算法进行加密和解密操作。
```python
from Crypto.Cipher import DES
# 密钥,必须是8个字节长
key = b'mysecretkey'
# 原始数据
data = b'Hello, world!'
# 创建DES对象
cipher = DES.new(key, DES.MODE_ECB)
# 加密数据
ciphertext = cipher.encrypt(data)
# 解密数据
plaintext = cipher.decrypt(ciphertext)
print('原始数据:', data)
print('加密后的数据:', ciphertext)
print('解密后的数据:', plaintext)
```
在这个示例中,我们使用`Crypto.Cipher`模块中的`DES`类来创建
DES对象。
我们使用`new()`方法来创建一个DES对象,并传递一个密钥和加密模式(在本例中为ECB模式)。
然后,我们使用`encrypt()`方法来加密数据,并使用`decrypt()`方法来解密数据。
最后,我们打印出原始数据、加密后的数据和解密后的数据。
请注意,这只是一个简单的示例,用于演示如何使用DES密码算法进行加密和解密操作。
在实际应用中,您需要更加安全地处理密钥和加密数据,以防止数据泄露和攻击。
DES加密算法与解密(带流程图)

DES加密算法与解密(带流程图)一、DES加密及解密算法程序源代码:#include <iostream>using namespace std;const static char IP_Table[] = { //IP_Table置换58, 50, 42, 34, 26, 18, 10, 2,60, 52, 44, 36, 28, 20, 12, 4,62, 54, 46, 38, 30, 22, 14, 6,64, 56, 48, 40, 32, 24, 16, 8,57, 49, 41, 33, 25, 17, 9, 1,59, 51, 43, 35, 27, 19, 11, 3,61, 53, 45, 37, 29, 21, 13, 5,63, 55, 47, 39, 31, 23, 15, 7};const static char Final_Table[] = { //最终置换40, 8, 48, 16, 56, 24, 64, 32,39, 7, 47, 15, 55, 23, 63, 31,38, 6, 46, 14, 54, 22, 62, 30,37, 5, 45, 13, 53, 21, 61, 29,36, 4, 44, 12, 52, 20, 60, 28,35, 3, 43, 11, 51, 19, 59, 27,34, 2, 42, 10, 50, 18, 58, 26,33, 1, 41, 9, 49, 17, 57, 25};const static char S_Box[8][64] = {//s_box/* S1 */{14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13},/* S2 */{15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10,14, 5, 2, 8, 4,3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14},/* S5 */{2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3},/* S6 */{12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13},/* S7 */{4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12},/* S8 */{13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11}const static char Rar_Table[] = { //压缩置换14, 17, 11, 24, 1, 5,3, 28, 15, 6, 21, 10,23, 19, 12, 4, 26, 8,16, 7, 27, 20, 13, 2,41, 52, 31, 37, 47, 55,30, 40, 51, 45, 33, 48,44, 49, 39, 56, 34, 53,46, 42, 50, 36, 29, 32};const static char Exp_Table[] = { //扩展置换32, 1, 2, 3, 4, 5,4, 5, 6, 7, 8, 9,8, 9, 10, 11, 12, 13,12, 13, 14, 15, 16, 17,16, 17, 18, 19, 20, 21,20, 21, 22, 23, 24, 25,24, 25, 26, 27, 28, 29,28, 29, 30, 31, 32, 1const static char P_Table[]={ //P置换16, 7, 20, 21,29, 12, 28, 17,1, 15, 23, 26,5, 18, 31, 10,2, 8, 24, 14,32, 27, 3, 9,19, 13, 30, 6,22, 11, 4, 25};const static char KeyRar_Table[]={57, 49, 41, 33, 25, 17, 9,1, 58, 50, 42, 34, 26, 18,10, 2, 59, 51, 43, 35, 27,19, 11, 3, 60, 52, 44, 36,63, 55, 47, 39, 31, 23, 15,7, 62, 54, 46, 38, 30, 22,14, 6, 61, 53, 45, 37, 29,21, 13, 5, 28, 20, 12, 4};//设置全局变量,16轮密钥bool key[16][48]={{0}};void ByteToBit(bool *Out,char *In,int bits) //字节到位转换函数{int i;for(i=0;i<bits;i++)Out[i]=(In[i/8]>>(i%8))&1;}void BitToByte(char *Out,bool *In,int bits)//位到字节转换函数{int i;for(i=0;i<bits/8;i++)Out[i]=0;for(i=0;i<bits;i++)Out[i/8]|=In[i]<<(i%8);}void Xor(bool *InA,const bool *InB,int length) //按位异或for(int i=0;i<length;i++)InA[i]^=InB[i];}void keyfc(char *In) //密钥生成函数{int i,j=0,mov,k,m;bool* key0 = new bool[56];bool* keyin = new bool[64];bool temp;ByteToBit(keyin,In,64); //字节到位的转换for(i=0;i<56;i++) //密钥压缩为56位key0[i]=keyin[KeyRar_Table[i]-1];for(i=0;i<16;i++) //16轮密钥产生{if(i==0||i==1||i==8||i==15)mov=1;elsemov=2;for(k=0;k<mov;k++) //分左右两块循环左移{for(m=0;m<8;m++){temp=key0[m*7];for(j=m*7;j<m*7+7;j++)key0[j]=key0[j+1];key0[m*7+6]=temp;}temp=key0[0];for(m=0;m<27;m++)key0[m]=key0[m+1];key0[27]=temp;temp=key0[28];for(m=28;m<55;m++)key0[m]=key0[m+1];key0[55]=temp;}for(j=0;j<48;j++) //压缩置换并储存key[i][j]=key0[Rar_Table[j]-1];}delete[] key0;delete[] keyin;}void DES(char Out[8],char In[8],bool Type)//加密核心程序,Type=0时加密,反之解密{bool* MW = new bool[64];bool* tmp = new bool[32];bool* PMW = new bool[64];bool* kzmw = new bool[48];bool* keytem = new bool[48];bool* ss = new bool[32];int hang,lie,i;ByteToBit(PMW,In,64);for(int j=0;j<64;j++){MW[j]=PMW[IP_Table[j]-1]; //初始置换}bool *Li=&MW[0],*Ri=&MW[32];for(i=0;i<48;i++) //右明文扩展置换kzmw[i]=Ri[Exp_Table[i]-1];if(Type==0) //DES加密过程{for(int lun=0;lun<16;lun++){for(i=0;i<32;i++)ss[i]=Ri[i];for(i=0;i<48;i++) //右明文扩展置换kzmw[i]=Ri[Exp_Table[i]-1];for(i=0;i<48;i++)keytem[i]=key[lun][i];Xor(kzmw,keytem,48);/*S盒置换*/for(i=0;i<8;i++)hang=kzmw[i*6]*2+kzmw[i*6+5];lie=kzmw[i*6+1]*8+kzmw[i*6+2]*4+kzmw[i*6+3] *2+kzmw[i*6+4];tmp[i*4+3]=S_Box[i][(hang+1)*16+lie]%2;tmp[i*4+2]=(S_Box[i][(hang+1)*16+lie]/2)%2 ;tmp[i*4+1]=(S_Box[i][(hang+1)*16+lie]/4)%2 ;tmp[i*4]=(S_Box[i][(hang+1)*16+lie]/8)%2;}for(i=0;i<32;i++) //P置换Ri[i]=tmp[P_Table[i]-1];Xor(Ri,Li,32); //异或for(i=0;i<32;i++) //交换左右明文Li[i]=ss[i];}}for(i=0;i<32;i++){tmp[i]=Li[i];Li[i]=Ri[i];Ri[i]=tmp[i];}for(i=0;i<64;i++)PMW[i]=MW[Final_Table[i]-1];BitToByte(Out,PMW,64); //位到字节的转换}else //DES解密过程{for(int lun=15;lun>=0;lun--){for(i=0;i<32;i++)ss[i]=Ri[i];for(i=0;i<48;i++) //右明文扩展置换kzmw[i]=Ri[Exp_Table[i]-1];for(i=0;i<48;i++)keytem[i]=key[lun][i];Xor(kzmw,keytem,48);/*S盒置换*/for(i=0;i<8;i++){hang=kzmw[i*6]*2+kzmw[i*6+5];lie=kzmw[i*6+1]*8+kzmw[i*6+2]*4+kzmw[i*6+3] *2+kzmw[i*6+4];tmp[i*4+3]=S_Box[i][(hang+1)*16+lie]%2;tmp[i*4+2]=(S_Box[i][(hang+1)*16+lie]/2)%2 ;tmp[i*4+1]=(S_Box[i][(hang+1)*16+lie]/4)%2 ;tmp[i*4]=(S_Box[i][(hang+1)*16+lie]/8)%2; }for(i=0;i<32;i++) //P置换Ri[i]=tmp[P_Table[i]-1];Xor(Ri,Li,32); //异或for(i=0;i<32;i++) //交换左右明文{Li[i]=ss[i];}}for(i=0;i<32;i++){tmp[i]=Li[i];Li[i]=Ri[i];Ri[i]=tmp[i];}for(i=0;i<64;i++)PMW[i]=MW[Final_Table[i]-1]; BitToByte(Out,PMW,64); //位到字节的转换}delete[] MW;delete[] tmp;delete[] PMW;delete[] kzmw;delete[] keytem;delete[] ss;}bool RunDes(char *Out, char *In, int datalength, char *Key, bool Type) //加密运行函数,判断输入以及对输入文本8字节分割{if( !( Out && In && Key && (datalength=(datalength+7)&0xfffffff8) ) ) return false;keyfc(Key);for(int i=0,j=datalength%8; i<j; ++i,Out+=8,In+=8)DES(Out, In, Type);return true;}int main(){char* Ki = new char[8];char Enter[]="This is the test of DES!"; char* Print = new char[200];int len = sizeof(Enter);int i_mf;cout << "请输入密钥(8位):" <<"\n"; for(i_mf=0;i_mf<8;i_mf++)cin >> Ki[i_mf];cout << "\n";RunDes(Print,Enter,len,Ki,0);//加密cout << "----加密前----" << "\n";for(i_mf=0;i_mf<len;i_mf++)cout << Enter[i_mf];cout << "\n\n";cout << "----加密后----" << "\n";for(i_mf=0;i_mf<len;i_mf++)cout<<Print[i_mf];cout << "\n\n";//此处进行不同密钥输入测试cout << "请输入密钥(8位):" <<"\n"; for(i_mf=0;i_mf<8;i_mf++)cin >> Ki[i_mf];cout << "\n";RunDes(Enter,Print,len,Ki,1);//解密cout << "----解密后----" << "\n";for(i_mf=0;i_mf<len;i_mf++)cout << Enter[i_mf];cout << endl;delete[] Ki;delete[] Print;return 0;}二、程序编译、运行结果图:三、程序总体框架图:读取待加密文本输入密钥DES 加密显示加密后文本再次输入密钥DES 解密显示解密后文本显示错误解密信息密钥错误密钥正确四、程序实现流程图:Enter = 待加密文本分割Enter ,8字节为一段,不足补加,段数为N 初始化:*Print ,i=0,j=0文本第i 段,转为二进制64位初始置换(IP_Table )文本段分为左右两部分左部分(32位)右部分(32)输入8字节密钥转为二进制64位密钥压缩KeyRar_Table (56位)形成16轮密钥合并形成子密钥(48位)S 置换(S_Box )P 置换(P_Table )左右交换,j++最终置换(Final_Table )J<16扩展置换(Exp_Table )i<N异或异或NoYes存入*Print ,i++DES 加密过程结束,输出Print YesNoDES 解密过程为以上逆过程。
DES算法原理完整版

DES算法原理完整版1.所需参数key:8个字节共64位的⼯作密钥data:8个字节共64位的需要被加密或被解密的数据 mode:DES⼯作⽅式,加密或者解密2.初始置换DES算法使⽤64位的密钥key将64位的明⽂输⼊块变为64位的密⽂输出块,并把输出块分为L0、R0两部分,每部分均为32位。
初始置换规则如下:注意:这⾥的数字表⽰的是原数据的位置,不是数据158,50,42,34,26,18,10,2,260,52,44,36,28,20,12,4,362,54,46,38,30,22,14,6,464,56,48,40,32,24,16,8,557,49,41,33,25,17, 9,1,659,51,43,35,27,19,11,3,761,53,45,37,29,21,13,5,863,55,47,39,31,23,15,7,即将输⼊的64位明⽂的第1位置换到第40位,第2位置换到第8位,第3位置换到第48位。
以此类推,最后⼀位是原来的第7位。
置换规则是规定的。
L0(Left)是置换后的数据的前32位,R0(Right)是置换后的数据的后32位。
例如:64位输⼊块是D1~D64,则经过初始置换后是D58,D50...D7。
则L0=D58,D50,D12...D8;R0=D57,D49,D41 (7)该置换过程是在64位秘钥的控制下。
3.加密处理--迭代过程经过初始置换后,进⾏16轮完全相同的运算,在运算过程中数据与秘钥结合。
函数f的输出经过⼀个异或运算,和左半部分结合形成新的右半部分,原来的右半部分成为新的左半部分。
每轮迭代的过程可以表⽰如下:Ln = R(n - 1);Rn = L(n - 1)⊕f(Rn-1,kn-1)⊕:异或运算Kn是向第N层输⼊的48位的秘钥,f是以Rn-1和Kn为变量的输出32位的函数3.1函数f函数f由四步运算构成:秘钥置换(Kn的⽣成,n=0~16);扩展置换;S-盒代替;P-盒置换。
数据加密标准DES

数据加密标准DES1977年1月,美国政府将IBM研制的一种乘积密码宣布为国家的数据加密标准。
这个标准的确立刺激了很大一批厂商去实现加密算法的硬件化,以提高处理速度。
这种密码术的核心是乘积变换,在硬件产业中常常简称为DES(Data Encryption Standard)。
这样一来,由于可以得到便宜高速的硬件,所以反过来也鼓励了许多其他用户采纳DES。
1.DES算法描述现在我们来说明DES算法,它的过程如图9-2所示。
对明文按64位分组,每组明文经初始排列(第1步),通过子密钥K1--K16进行16次乘积变换(第2步),再通过最终排列(第3步)得到64位密文。
图9-2 DES算法过程图16次乘积变换的目的是使明文增大其混乱性和扩散性,使得输出不残存统计规律,使破译者不能从反向推算出密钥。
第1步:初始排列(IP)IP(Initial Permutation)取排数据的方法如表9-2所示,其中的数据表示明文的位标(1~64)。
例如,58指该组明文中的第58位,50指该组明文中的第50位,其他类推。
第l步初始排列的目的是将明文的顺序打乱。
表9-2 初始排列法(IP)[例12-1]明文X=0123456789ABCDEF(十六进制形式),写成二进制形式,共64位:X=0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111经过初始排列(IP)后,结果变成:1100 1100 0000 0000 1100 1100 1111 1111 1111 0000 1010 1010 1111 0000 1010 1010即写成十六进制形式是:CC00CCFFFOAAFOAA。
第2步:乘积变换把通过第1步得出的64位一分为二,用L0表示前32位,R0表示后32位,那么在上例中有:L0=CC00CCFF R0=FOAAFOAA其16次乘积变换的过程可以用图9-3表示。
DES的加密解密流程

Feistel 结构图
Feistel结构定义 Feistel结构定义
• 加密: Li = Ri-1; Ri = Li-1⊕F(Ri-1,Ki) • 解密: Ri-1 = Li Li-1 = Ri⊕F(Ri-1,Ki) = Ri⊕F(Li,Ki)
Feistel 的加密 和解密
DES算法的基本结构
置换表(P表)
子密钥的产生
置换选择1
置换选择2和循环左移次数
初始置换(IP)
逆初始置换(IP-1)
DES每轮变换 Li = Ri-1 Ri = Li-1⊕F(Ri-1,Ki) ⊕
F函数
Expansion: 32 S-box: 6 4 Permutation 48
扩展/置换表(ox)
S盒(S-box)(续)
S盒(S-box)(续)
DES加密与解密算法的介绍和实现(有程序)

DES算法的介绍和实现一.DES算法介绍DES( Data Encryption Standard)算法,于1977年得到美国政府的正式许可,是一种用56位密钥来加密64位数据的方法。
虽然56位密钥的DES算法已经风光不在,而且常有用Des加密的明文被破译的报道,但是了解一下昔日美国的标准加密算法总是有益的,而且目前DES 算法得到了广泛的应用,在某些场合,她仍然发挥着余热^_^.1.1 密钥生成1.1.1 取得密钥从用户处取得一个64位(本文如未特指,均指二进制位))长的密码key ,去除64位密码中作为奇偶校验位的第8、16、24、32、40、48、56、64位,剩下的56位作为有效输入密钥.1.1.2 等分密钥表1.57 49 41 33 25 17 91 58 50 42 34 26 1810 2 59 51 43 35 2719 11 3 60 50 44 36表2.65 55 47 39 31 23 157 62 54 46 38 30 2214 6 61 53 45 37 2921 13 5 28 20 12 4把在1.1.1步中生成的56位输入密钥分成均等的A,B两部分,每部分为28位,参照表1和表2把输入密钥的位值填入相应的位置. 按照表1所示A的第一位为输入的64位密钥的第57位,A的第2位为64位密钥的第49位,...,依此类推,A的最后一位最后一位是64位密钥的第36位。
1.1.3 密钥移位表3.i 1 2 3 4 5 6 7 8ǿ 1 1 2 2 2 2 2 2i 9 10 11 12 13 14 15 16ǿ 1 2 2 2 2 2 2 1DES算法的密钥是经过16次迭代得到一组密钥的,把在1.1.2步中生成的A,B视为迭代的起始密钥,表3显示在第i次迭代时密钥循环左移的位数. 比如在第1次迭代时密钥循环左移1位,第3次迭代时密钥循环左移2位.第9次迭代时密钥循环左移1位,第14次迭代时密钥循环左移2位.第一次迭代:A(1) = ǿ(1) AB(1) = ǿ(1) B第i次迭代:A(i) = ǿ(i) A(i-1)B(i) = ǿ(i) B(i-1)1.1.4 密钥的选取表4.14 17 11 24 1 5 3 2815 6 21 10 23 19 12 426 8 16 7 27 20 13 241 52 31 37 47 55 30 4051 45 33 48 44 49 39 5634 53 46 42 50 36 29 32在1.1.3步中第i次迭代生成的两个28位长的密钥为把合并按照表4所示k的第一位为56位密钥的第14位,k的第2位为56位密钥的第17位,...,依此类推,k的最后一位最后一位是56位密钥的第32位。
数据加密算法--详解DES加密算法原理与实现

数据加密算法--详解DES加密算法原理与实现DES算法简介DES(Data Encryption Standard)是⽬前最为流⾏的加密算法之⼀。
DES是对称的,也就是说它使⽤同⼀个密钥来加密和解密数据。
DES还是⼀种分组加密算法,该算法每次处理固定长度的数据段,称之为分组。
DES分组的⼤⼩是64位,如果加密的数据长度不是64位的倍数,可以按照某种具体的规则来填充位。
从本质上来说,DES的安全性依赖于虚假表象,从密码学的术语来讲就是依赖于“混乱和扩散”的原则。
混乱的⽬的是为隐藏任何明⽂同密⽂、或者密钥之间的关系,⽽扩散的⽬的是使明⽂中的有效位和密钥⼀起组成尽可能多的密⽂。
两者结合到⼀起就使得安全性变得相对较⾼。
DES算法具体通过对明⽂进⾏⼀系列的排列和替换操作来将其加密。
过程的关键就是从给定的初始密钥中得到16个⼦密钥的函数。
要加密⼀组明⽂,每个⼦密钥按照顺序(1-16)以⼀系列的位操作施加于数据上,每个⼦密钥⼀次,⼀共重复16次。
每⼀次迭代称之为⼀轮。
要对密⽂进⾏解密可以采⽤同样的步骤,只是⼦密钥是按照逆向的顺序(16-1)对密⽂进⾏处理。
计算16个⼦密钥上⾯提到DES算法的第⼀步就是从初始密钥中计算得出16个⼦密钥。
图⽰1展⽰了这个过程。
DES使⽤⼀个56位的初始密钥,但是这⾥提供的是⼀个64位的值,这是因为在硬件实现中每8位可以⽤于奇偶校验,在软件实现中多出的位只是简单的忽略掉。
要获得⼀个56位的密钥,可以执照表1的⽅式执⾏密钥转换。
解释⼀下表1,按照从左往右从上往下的⽅式看,表格中每个位置P包含初始密钥中位在转换后的密钥中所占的位置。
⽐如,初始密钥中的第57位就是转换后的密钥中的第1位,⽽初始密钥中的第49位则变成转换后的密钥中的第2位,以此类推...。
(数据位的计数顺序按照从左到右从1开始的)表1:DES中密钥的转换表(DesTransform[56])将密钥转换为56位后,接下来计算⼦密钥。
Des加密解密全过程

001011 110101 001111 011011 011101 100001 000010 101100
步骤1-2-7-1:第7轮循环左移累计14位,在前基础上再左移2位后:
左28位:
1111111 1111000 0000000 0111111
步骤1-2-5-3:第5轮循环左移累计10位,压缩置换后得到子钥K5:
101011 111101 001101 011011 010100 000011 001100 001111
步骤1-2-6-1:第6轮循环左移累计12位,在前基础上再左移2位后:
左28位:
1111111 1111110 0000000 0001111
步骤1-2-3-3:照以下数组进行选位并排序:
14,17,11,24,01,05,|03,28,15,06,21,10,|23,19,12,04,26,08,|16,07,27,20,13,02,|
41,52,31,37,47,55,|30,40,51,45,33,48,|44,49,39,56,34,53,|46,42,50,36,29,32,|
步骤1-2-3-3:第3轮循环左移累计6位,压缩置换后得到子钥K3:
111001 101101 011101 110010 110100 110010 000100 010101
步骤1-2-4-1:第4轮循环左移累计8位,在前基础上再左移2位后:
左28位:
1111111 1111111 1110000 0000000
L 28位:
57 49 41 33 25 17 09 | 01 58 50 42 34 26 18 | 10 02 59 51 43 35 27 | 19 11 03 60 52 44 36 |
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、DES加密及解密算法程序源代码:#include<iostream>usingnamespacestd;conststaticcharIP_Table[]={//IP_Table置换58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4,62,54,46,38,30,22,14,6,64,56,48,40,32,24,16,8,57,49,41,33,25,17,9,1,59,51,43,35,27,19,11,3,61,53,45,37,29,21,13,5,63,55,47,39,31,23,15,7};conststaticcharFinal_Table[]={ //最终置换40,8,48,16,56,24,64,32,39,7,47,15,55,23,63,31,38,6,46,14,54,22,62,30,37,5,45,13,53,21,61,29,36,4,44,12,52,20,60,28,35,3,43,11,51,19,59,27,34,2,42,10,50,18,58,26,33,1,41,9,49,17,57,25};conststaticcharS_Box[8][64]={ //s_box /*S1*/0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8,4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0, 15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13},/*S2*/{15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10, 3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5,0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15, 13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9},/*S3*/{10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8,13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1,13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7, 1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12}, /*S4*/{7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15, 13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9,10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4, 3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14}, /*S5*/{2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9, 14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6, 4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14, 11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3},/*S6*/{12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11,9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6,4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13}, /*S7*/{4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1, 13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6,1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2,6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12}, /*S8*/{13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7,1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2,7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8,2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11}};conststaticcharRar_Table[]={ //压缩置换14,17,11,24,1,5,3,28,15,6,21,10,23,19,12,4,26,8,16,7,27,20,13,2,41,52,31,37,47,55,30,40,51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32};conststaticcharExp_Table[]={ //扩展置换32,1,2,3,4,5,4,5,6,7,8,9,8,9,10,11,12,13,12,13,14,15,16,17,16,17,18,19,20,21,20,21,22,23,24,25,24,25,26,27,28,29,28,29,30,31,32,1};conststaticcharP_Table[]={ //P置换16,7,20,21,29,12,28,17,1,15,23,26,5,18,31,10,2,8,24,14,32,27,3,9,19,13,30,6,22,11,4,25};conststaticcharKeyRar_Table[]={57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,27,19,11,3,60,52,44,36,63,55,47,39,31,23,15,7,62,54,46,38,30,22,14,6,61,53,45,37,29,21,13,5,28,20,12,4};//设置全局变量,16轮密钥boolkey[16][48]={{0}};voidByteToBit(bool*Out,char*In,intbits) //字节到位转换函数{inti;for(i=0;i<bits;i++)Out[i]=(In[i/8]>>(i%8))&1;}voidBitToByte(char*Out,bool*In,intbits) //位到字节转换函数{inti;for(i=0;i<bits/8;i++)Out[i]=0;for(i=0;i<bits;i++)Out[i/8]|=In[i]<<(i%8);}voidXor(bool*InA,constbool*InB,intlength)//按位异或{for(inti=0;i<length;i++)InA[i]^=InB[i];}voidkeyfc(char*In)//密钥生成函数{inti,j=0,mov,k,m;bool*key0=newbool[56];bool*keyin=newbool[64];booltemp;ByteToBit(keyin,In,64);//字节到位的转换for(i=0;i<56;i++)//密钥压缩为56位key0[i]=keyin[KeyRar_Table[i]-1];for(i=0;i<16;i++)//16轮密钥产生{if(i==0||i==1||i==8||i==15)mov=1;elsemov=2;for(k=0;k<mov;k++)//分左右两块循环左移{for(m=0;m<8;m++){temp=key0[m*7];for(j=m*7;j<m*7+7;j++)key0[j]=key0[j+1];key0[m*7+6]=temp;}temp=key0[0];for(m=0;m<27;m++)key0[m]=key0[m+1];key0[27]=temp;temp=key0[28];for(m=28;m<55;m++)key0[m]=key0[m+1];key0[55]=temp;}for(j=0;j<48;j++)//压缩置换并储存key[i][j]=key0[Rar_Table[j]-1];}delete[]key0;delete[]keyin;}voidDES(charOut[8],charIn[8],boolType)//加密核心程序,Type=0时加密,反之解密{bool*MW=newbool[64];bool*tmp=newbool[32];bool*PMW=newbool[64];bool*kzmw=newbool[48];bool*keytem=newbool[48];bool*ss=newbool[32];inthang,lie,i;ByteToBit(PMW,In,64);for(intj=0;j<64;j++){MW[j]=PMW[IP_Table[j]-1];//初始置换}bool*Li=&MW[0],*Ri=&MW[32];for(i=0;i<48;i++) //右明文扩展置换kzmw[i]=Ri[Exp_Table[i]-1];if(Type==0) //DES加密过程{for(intlun=0;lun<16;lun++){for(i=0;i<32;i++)ss[i]=Ri[i];for(i=0;i<48;i++) //右明文扩展置换kzmw[i]=Ri[Exp_Table[i]-1];for(i=0;i<48;i++)keytem[i]=key[lun][i];Xor(kzmw,keytem,48);/*S盒置换*/for(i=0;i<8;i++){hang=kzmw[i*6]*2+kzmw[i*6+5];lie=kzmw[i*6+1]*8+kzmw[i*6+2]*4+kzmw[i*6+3]*2+kzmw[i*6+4];tmp[i*4+3]=S_Box[i][(hang+1)*16+lie]%2;tmp[i*4+2]=(S_Box[i][(hang+1)*16+lie]/2)%2;tmp[i*4+1]=(S_Box[i][(hang+1)*16+lie]/4)%2;tmp[i*4]=(S_Box[i][(hang+1)*16+lie]/8)%2;}for(i=0;i<32;i++) //P置换Ri[i]=tmp[P_Table[i]-1];Xor(Ri,Li,32); //异或for(i=0;i<32;i++) //交换左右明文{Li[i]=ss[i];}}for(i=0;i<32;i++){tmp[i]=Li[i];Li[i]=Ri[i];Ri[i]=tmp[i];}for(i=0;i<64;i++)PMW[i]=MW[Final_Table[i]-1];BitToByte(Out,PMW,64); //位到字节的转换}else //DES解密过程{for(intlun=15;lun>=0;lun--){for(i=0;i<32;i++)ss[i]=Ri[i];for(i=0;i<48;i++) //右明文扩展置换kzmw[i]=Ri[Exp_Table[i]-1];for(i=0;i<48;i++)keytem[i]=key[lun][i];Xor(kzmw,keytem,48);/*S盒置换*/for(i=0;i<8;i++){hang=kzmw[i*6]*2+kzmw[i*6+5];lie=kzmw[i*6+1]*8+kzmw[i*6+2]*4+kzmw[i*6+3]*2+kzmw[i*6+4];tmp[i*4+3]=S_Box[i][(hang+1)*16+lie]%2;tmp[i*4+2]=(S_Box[i][(hang+1)*16+lie]/2)%2;tmp[i*4+1]=(S_Box[i][(hang+1)*16+lie]/4)%2;tmp[i*4]=(S_Box[i][(hang+1)*16+lie]/8)%2;}for(i=0;i<32;i++) //P置换Ri[i]=tmp[P_Table[i]-1];Xor(Ri,Li,32); //异或for(i=0;i<32;i++) //交换左右明文{Li[i]=ss[i];}}for(i=0;i<32;i++){tmp[i]=Li[i];Li[i]=Ri[i];Ri[i]=tmp[i];}for(i=0;i<64;i++)PMW[i]=MW[Final_Table[i]-1];BitToByte(Out,PMW,64); //位到字节的转换}delete[]MW;delete[]tmp;delete[]PMW;delete[]kzmw;delete[]keytem;delete[]ss;}boolRunDes(char*Out,char*In,intdatalength,char*Key,boolType)//加密运行函数,判断输入以及对输入文本8字节分割{if(!(Out&&In&&Key&&(datalength=(datalength+7)&0xfffffff8)))returnfalse;keyfc(Key);for(inti=0,j=datalength%8;i<j;++i,Out+=8,In+=8)DES(Out,In,Type);returntrue;}intmain(){char*Ki=newchar[8];charEnter[]="ThisisthetestofDES!";char*Print=newchar[200];intlen=sizeof(Enter);inti_mf;cout<<"请输入密钥(8位):"<<"\n";for(i_mf=0;i_mf<8;i_mf++)cin>>Ki[i_mf];cout<<"\n";RunDes(Print,Enter,len,Ki,0);//加密cout<<"----加密前----"<<"\n";for(i_mf=0;i_mf<len;i_mf++)cout<<Enter[i_mf];cout<<"\n\n";cout<<"----加密后----"<<"\n";for(i_mf=0;i_mf<len;i_mf++)cout<<Print[i_mf];cout<<"\n\n";//此处进行不同密钥输入测试cout<<"请输入密钥(8位):"<<"\n";for(i_mf=0;i_mf<8;i_mf++)cin>>Ki[i_mf];cout<<"\n";RunDes(Enter,Print,len,Ki,1);//解密cout<<"----解密后----"<<"\n";for(i_mf=0;i_mf<len;i_mf++)cout<<Enter[i_mf];cout<<endl;delete[]Ki;delete[]Print;return0;}二、程序编译、运行结果图:三、程序总体框架图:四、程序实现流程图:。