DES算法及其程序实现
DES 算法的理解和实现

DES算法的理解和实现软件121 金凯11020520190.前言DES是一种对称加密算法,所谓对称加密算法即:加密和解密使用相同密钥的算法。
DES 算法在实际应用中应用广泛,我自己在做一个校园登录客户端的时候就会用DES算法将用户密码加密存放在本地中。
可见,DES其实离我们的生活很近,我们也应该去多多学习它。
本篇先讲述了DES在本人的通大校园网客户端中的使用范例,由此引出了DES的介绍和DES的实现方式。
1.范例我自己做了一个手机登录CMCC-EDU的客户端,其中有个记住密码的选项。
如果用户点选了“记住密码”,那么其密码就会被保存在本地,下次打开本软件后密码就会自动从本地读取并填充进密码框。
但密码保存在本地就会出现不安全的问题,很容易被其他应用获取。
因此我在采用了DES算法将密码加密存放本地,用的时候再将密码解密使用的方式来保证安全。
2.简介DES 算法为密码体制中的对称密码体制,又被称为美国数据加密标准,是1972年美国IBM 公司研制的对称密码体制加密算法。
明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES 运算(第8、16、24、32、40、48、56、64位是校验位, 使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。
☆具有相当高的复杂性,使得破译的开销超过可能获得的利益,同时又要便于理解和掌握; ☆DES 密码体制的安全性应该不依赖于算法的保密,其安全性仅以加密密钥的保密为基础; ☆实现经济,运行有效,并且适用于多种完全不同的应用。
目前在国内,随着三金工程尤其是金卡工程的启动,DES 算法在POS 、ATM 、磁卡及智能卡(IC 卡)、加油站、高速公路收费站等领域被广泛应用,以此来实现关键数据的保密,如信用卡持卡人的PIN 的加密传输,IC 卡与POS 间的双向认证、金融交易数据包的MAC 校验等,均用到DES 算法。
DES 算法的入口参数有三个:Key 、Data 、Mode 。
des算法标准代码

des算法标准代码一、概述DES(数据加密标准)是一种常用的对称加密算法,它使用64位的密钥对数据进行加密和解密。
本标准代码文档旨在提供DES算法的完整实现,以便读者了解其工作原理和实现细节。
二、算法描述1. 密钥生成:DES算法使用一个56位的密钥,通过一系列复杂的算法将其转换为64位的数据。
2. 加密过程:加密过程包括三个步骤:初始置换、分组和迭代。
在迭代过程中,每个分组被替换为新的分组,并使用密钥进行置换和移位操作。
3. 解密过程:解密过程与加密过程类似,但使用与加密时相反的置换和移位操作。
三、代码实现以下是一个简单的Python实现示例:```pythonfrom Crypto.Cipher import DESfrom Crypto.Util.Padding import pad, unpadfrom binascii import hexlify, unhexlifyimport random# 密钥生成函数def generate_key(bit_length=8):key = [0]*64for i in range(bit_length//8):random.shuffle(key[:8]) # 使用随机数填充8字节密钥的一部分 if i != bit_length//8-1: # 最后一位用校验位替代,所以不算进bit_length长度中random.shuffle(key[8:]) # 对剩余字节打乱顺序,以保护剩余部分的秘密性return key.tolist() # 转换为列表便于序列化处理# DES加密/解密函数def des_encrypt(data, key):des = DES.new(key, DES.MODE_ECB) # 使用ECB模式进行加密padded_data = pad(data.encode(), DES.block_size) # 对数据进行填充处理encrypted_data = des.encrypt(padded_data) # 进行加密操作return encrypted_data.hex() # 将加密结果转换为十六进制字符串方便查看def des_decrypt(encrypted_data, key):des = DES.new(key, DES.MODE_ECB) # 使用ECB模式进行解密操作decrypted_data = des.decrypt(unhexlify(encrypted_data)) # 进行解密操作,并将结果解码为原始数据return unpad(decrypted_data).decode() # 将解密结果进行去填充处理,并解码为原始字符串返回```四、使用示例以下是一个简单的使用示例:```python# 生成随机密钥,这里假设使用长度为8字节的密钥,根据实际情况进行修改即可key = generate_key()print("Generated key: {}".format(hexlify(key)))# 要加密的数据(这里使用字符串“Hello World”作为示例)data = "Hello World"print("Original data: {}".format(data))encrypted_data = des_encrypt(data, key) # 对数据进行加密操作,并输出加密结果(十六进制字符串)print("Encrypted {}".format(encrypted_data))decrypted_data = des_decrypt(encrypted_data, key) # 对加密结果进行解密操作,并输出解密结果(原始字符串)print("Decrypted {}".format(decrypted_data))```请注意,这只是一个简单的示例代码,用于演示DES算法的实现和基本用法。
des子秘钥生成算法实现

des子秘钥生成算法实现DES(Data Encryption Standard)是一种常见的对称密钥加密算法,它广泛应用于信息安全领域。
本文将介绍DES子秘钥生成算法的实现过程,以及其在实际应用中的重要性和指导意义。
首先,我们需要了解DES算法的整体结构。
DES算法涉及到密钥的生成、明文的分组与置换、多轮迭代、处理函数、逆置换等环节。
其中,子秘钥生成算法负责根据输入的主密钥生成多个子密钥,用于后续的加密和解密操作。
子秘钥生成算法的核心思想是使用主密钥经过一系列的置换、选择和移位操作,生成多个子密钥。
具体实现过程如下:1. 首先,将64位的主密钥经过固定的置换表置换成56位。
2. 将56位的密钥分为左右两部分,每部分各28位。
3. 对左右两部分进行循环左移操作,具体移位数由轮数确定。
每轮循环左移的位数从一个预设的表中查找得出。
4. 将左右两部分连接起来,得到56位的中间结果。
5. 对中间结果进行一次选择置换操作,将56位的中间结果压缩成48位的子密钥。
6. 重复第3至第5步,直到生成所需数量的子密钥。
DES子秘钥生成算法的实现过程较为复杂,需要确保密钥长度、置换表的正确性,以及移位操作的准确性。
通过正确实现子秘钥生成算法,可以保证加密过程的安全性和可靠性。
DES算法在信息安全领域具有重要的应用价值和指导意义。
它不仅可以用于保护敏感数据的加密和解密,还可以应用于数字签名、身份认证、网络通信等方面。
通过合理使用DES算法,可以有效防止信息泄露、数据篡改等恶意攻击。
总之,DES子秘钥生成算法是DES加密算法的关键一步,它通过一系列的置换、选择和移位操作,生成多个子密钥用于加密和解密过程。
正确实现子秘钥生成算法对于保障信息安全具有重要意义,并对信息安全领域的发展起到积极的指导作用。
DES算法实现

DES算法实现一、算法需求二、算法分析三、具体实现代码:#include<memory.h>#include<stdio.h>enum{encrypt,decrypt}; //encrypt:加密,decrypt:解密void des_run(char out[8],char[8],bool type=encrypt);void des_setkey(const char key[8]); //设置密钥static void f_func(bool in[32],const bool ki[48]); //f函数static void s_func(bool out[32],const bool in[48]); //s盒代替static void transform(bool *out,bool *in,const char *table,int len); //变换static void xor(bool *ina,const bool *inb,int len); //异或static void rotatel(bool *in,int len,int loop); //循环左移static void bytetobit(bool *out,const char *in,int bits);//字节组转换成位组static void bittobyte(char *out,const bool *in,int bits);//位组转换成字节组//置换IP表const static char ip_table[64]={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};//逆置换IP表const static char ipr_table[64]={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};//E位选择表const static char e_table[48]={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};//P换位表const static char p_table[32]={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};//PC1选位表const static char pc1_table[56]={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}; //PC2选位表const static char pc2_table[48]={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 loop_table[16]={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};//s盒const static char s_box[8][4][16]={//s114,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,//s215,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,//s310,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,//s47,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,//s52,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,//s612,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,//s74,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,//s813,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};static bool subkey[16][48];//16圈子密钥void des_run(char out[8],char in[8],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,subkey[i]);xor(ri,li,32);memcpy(li,tmp,32);}}else{for(int i=15;i>=0;i--){ //解密,解密子密钥顺序与加密子密钥相反memcpy(tmp,li,32);f_func(li,subkey[i]);xor(li,ri,32);memcpy(ri,tmp,32);}}transform(m,m,ipr_table,64);bittobyte(out,m,64);}void des_setkey(const char key[8]){static bool k[64],*kl=&k[0],*kr=&k[28];bytetobit(k,key,64);transform(k,k,pc1_table,56);for(int i=0;i<16;i++){rotatel(kl,28,loop_table[i]);rotatel(kr,28,loop_table[i]);transform(subkey[i],k,pc2_table,48);}}void f_func(bool in[32],const bool ki[48]){static bool mr[48];transform (mr,in,e_table,48);xor(mr,ki,48);s_func(in,mr);transform(in,in,p_table,32);}void s_func(bool out[32],const bool in[48]){for(char i=0,j,k;i<8;i++,in+=6,out+=4){j=(in[0]<<1)+in[5];k=(in[1]<<3)+(in[2]<<2)+(in[3]<<1)+in[4];bytetobit(out,&s_box[i][j][k],4);}}void transform(bool *out,bool *in,const char *table,int len) {static bool tmp[256];for(int i=0;i<len;i++)tmp[i]=in[table[i]-1];memcpy(out,tmp,len);}void xor(bool *ina,const bool *inb,int len){for(int i=0;i<len;i++)ina[i]^=inb[i];}void rotatel(bool *in,int len,int loop){static bool tmp[256];memcpy(tmp,in,loop);memcpy(in,in+loop,len-loop);memcpy(in+len-loop,tmp,loop);}void bytetobit(bool *out,const char *in,int bits){for(int i=0;i<bits;i++)out[i]=(in[i/8]>>(i%8))&1;}void bittobyte(char *out,const bool *in,int bits){memset(out,0,(bits+7)/8);for(int i=0;i<bits;i++)out[i/8]|=in[i]<<(i%8);}void main(){char key[8]={2,9,5,0,6,1,7,3},str[]="I am a girl!";printf("加密之前:");puts(str);des_setkey(key);des_run(str,str,encrypt);printf("加密以后:");printf("%s\n",str);des_run(str,str,decrypt);printf("解密以后:");printf("%s\n",str);}。
des子密钥生成算法实现

des子密钥生成算法实现
DES算法,英文全称为Data Encryption Standard,即为“数据加密标准”。
该算法的加密和解密过程都是基于密钥进行的,因此密钥的安全性至关重要。
为了确保加密过程的安全性,DES算法对密钥进行了复杂的生成方式。
DES算法的密钥长度为64位,虽然DES算法被认为是一种强加密算法,但由于密钥长度较短,因此仍具有一定的被破解的可能性。
为了增强密码强度,可以采用“三重DES”或“高级加密标准(AES)”等更为安全的加密算法。
DES算法中的密钥生成算法是为了生成子密钥,该过程一般分为三个步骤:
1. 使用密钥置换表进行密钥置换:将64位的密钥按照密钥置换表进行置换,得到56位的密钥。
2. 对56位的密钥进行分组操作:将56位的密钥分成两个28位的半密钥,分别称为左半密钥和右半密钥。
3. 对左、右半密钥进行移位和置换操作:经过16轮迭代操作,将左、右半密钥进行不同方式的移位、置换和替换操作,最终生成16个48位的子密钥。
在DES算法中,密钥生成算法的实现是非常重要的,它决定了加密效果的好坏和安全性的高低。
在进行DES算法加密过程之前,密钥的生成和保护工作必须得到充分的重视。
总之,密钥生成算法是DES算法中的重要一环,它能够保证加密过程的安全性并增强密钥的复杂度。
在实际应用中,可根据需求采用更为安全的加密算法,确保数据的安全。
DES对称加密算法详解和c++代码实现(带样例和详细的中间数据)

DES对称加密算法详解和c++代码实现(带样例和详细的中间数据)特点:1.DES是对称性加密算法,即加密和解密是对称的,⽤的是同⼀个密钥2.DES只处理⼆进制数据,所以需要将明⽂转换成为2进制数据3.DES每次处理64位的数据,所以应该将明⽂切割成64位的分组,当最后⼀组数据不⾜64位的时候,⾼位补04.DES使⽤64位的密钥,但因为密钥中的每8位会被忽略,所以有效的密钥长度是56位,从⽽产⽣16个48位的⼦密钥(变换过程后⾯会说明)5.每64位数据⼀个块,是DES的永恒组织⽅式具体样例分析:(仅以⼀组64位数据为例分析加密过程)明⽂M是:8787878787878787密钥K是:0E329232EA6D0D73上⾯的信息都是16进制的,转换为2进制明⽂M是:0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111密钥K是:00010011 00110100 01010111 01111001 10011011 10111100 11011111 11110001第⼀步:根据密钥⽣成16个⼦密钥1.根据密钥初始置换表将64位的密钥转化为58位的密钥57 49 41 33 25 17 91 58 50 42 34 26 1810 2 59 51 43 35 2719 11 3 60 52 44 3663 55 47 39 31 23 157 62 54 46 38 30 2214 6 61 53 45 37 2921 13 5 28 20 12 4由于上表中第⼀个元素为57,这将使原秘钥的第57位变换为新秘钥K+的第1位。
同理,原秘钥的第49位变换为新秘钥的第2位……原秘钥的第4位变换为新秘钥的最后⼀位。
注意原秘钥中只有56位会进⼊新秘钥,上表也只有56个元素。
原密钥K:00010011 00110100 01010111 01111001 10011011 10111100 11011111 11110001新密钥K:1111000 0110011 0010101 0101111 0101010 1011001 1001111 00011112.将新密钥拆分成C0和D0,每组都有28位⽐如新密钥C0:1111000 0110011 0010101 0101111D0:0101010 1011001 1001111 00011113.根据密钥轮次左移表,左移特定的位数1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 161 12 2 2 2 2 2 1 2 2 2 2 2 2 1⽐如第⼀轮是左移1位,第⼆轮也是左移1位,第三轮是左移两位所以C1:1110000110011001010101011111D1:1010101011001100111100011110下⾯给出C1,D1到C16,D16的数据:C1 = 1110000110011001010101011111D1 = 1010101011001100111100011110C2 = 1100001100110010101010111111D2 = 0101010110011001111000111101C3 = 0000110011001010101011111111D3 = 0101011001100111100011110101C4 = 0011001100101010101111111100D4 = 0101100110011110001111010101C5 = 1100110010101010111111110000D5 = 0110011001111000111101010101C6 = 0011001010101011111111000011D6 = 1001100111100011110101010101C7 = 1100101010101111111100001100D7 = 0110011110001111010101010110C8 = 0010101010111111110000110011D8 = 1001111000111101010101011001C9 = 0101010101111111100001100110D9 = 0011110001111010101010110011C10 = 0101010111111110000110011001D10 = 1111000111101010101011001100C11 = 0101011111111000011001100101D11 = 1100011110101010101100110011C12 = 0101111111100001100110010101D12 = 0001111010101010110011001111C13 = 0111111110000110011001010101D13 = 0111101010101011001100111100C14 = 1111111000011001100101010101D14 = 1110101010101100110011110001C15 = 1111100001100110010101010111D15 = 1010101010110011001111000111C16 = 1111000011001100101010101111D16 = 0101010101100110011110001111需要记住的是:每⼀对Cn 和 Dn都是由前⼀对Cn-1 和 Dn-1移位⽽来!4.得到Cn,Dn后合并CnDn,然后根据密钥压缩置换表将56位密钥压缩成48位的⼦密钥密钥压缩置换表:14 17 11 24 1 53 28 15 6 21 1023 19 12 4 26 816 7 27 20 13 241 52 31 37 47 5530 40 51 45 33 4844 49 39 56 34 5346 42 50 36 29 32每对⼦秘钥有56位,但PC-2仅仅使⽤其中的48位。
DES算法的详细分析

DES算法的详细分析DES(Data Encryption Standard)是一种对称加密算法,是美国联邦政府使用的加密标准。
它采用了分组密码的方式对数据进行加密和解密处理。
本文将对DES算法进行详细分析,涵盖算法原理、加密过程、密钥生成、弱点以及DES的安全性评估等方面。
1.算法原理:-将明文数据分成64位的分组,使用64位密钥进行加密。
-密钥通过密钥生成算法进行处理,生成16个48位的子密钥。
-明文分为左右两半部分,每轮加密时,右半部分与子密钥进行逻辑运算,并与左半部分进行异或操作。
-运算结果作为下一轮的右半部分,左半部分不变。
循环16轮后得到密文。
2.加密过程:-初始置换(IP):将64位明文按照预定的规则进行位重排。
-分为左右两半部分L0,R0。
-通过16轮的迭代过程,每轮使用不同的48位子密钥对右半部分进行扩展置换(E盒扩展),与子密钥进行异或操作,再通过S盒代换和P 盒置换输出。
-将经过迭代的左右两半部分进行交换。
-最后经过逆初始置换(IP^-1)后输出64位密文。
3.密钥生成:-密钥生成算法从初始64位密钥中减小奇偶校验位,然后使用置换选择1(PC-1)表对密钥进行位重排,得到56位密钥。
-将56位密钥分为两部分,每部分28位,并进行循环左移操作,得到16个48位的子密钥。
4.弱点:-DES算法的密钥长度较短,只有56位有效位,容易受到穷举攻击。
-由于DES算法设计时的数据量较小,运算速度较快,使得密码破解更加容易。
-DES算法对明文的局部统计特性没有进行充分的打乱,可能导致部分明文模式的加密结果不够随机。
5.DES的安全性评估:-DES算法的弱点导致了它在现代密码学中的安全性问题,已经不再适用于高强度加密要求的场景。
- 美国国家标准与技术研究所(NIST)发布了Advanced Encryption Standard(AES)来替代DES作为加密标准。
-DES算法可以用于低安全性需求的领域,或作为加密算法的组成部分。
C++实现DES加密算法

程序设计文档(一)设计原理:本次作业是完成DES加密算法的。
DES加密算法是用64位明文和64位密钥进行相关的运算得到。
具体的实现步骤为:1)将输入的明文字符转为64位的二进制代码2)将输入的密钥字符转为64位的二进制代码3)将64位明文二进制进行位变换4)将变换后的明文二进制分为左右两个32数组5)将32位右数组扩展为48位数组6)将64位密钥进行除奇偶转换变成56位数组7)将56位数组等分为ab两个数组8)将a,b两个数组分别进行移位9)将移位后的ab两个数组进行合并成56位数组10)将合并后的56位数组变换成48位数组11)在第10步生成的48位数组和第5步生成的48位进行异或得到新的48位数组12)新的48位数组进行s盒变换后得到32位数组13)将32位数组进行变换得到新的32位数组14)新的32位数组和明文的左数组进行异或得到新的右数组,原来的右数组变成新的左数组15)回到第5步一共迭代16次16)最后将右左数组合并成64位数组17)64位数组进行变换得到新的64位数组18)将64位数组变换成8个字符这次作业要求用类的思想来解决,不过我没有很好的把加密算法抽象成类的概念,只是把整个大的加密算法当成一个类,每次加密都是一个类,所有的子函数都作为算法类的公有函数。
或许可以把明文抽象成一个类,密文又抽象成一个类,把他们共有的函数作为这个类的公有函数;又或许把几个函数作为一个类的公有函数,但是这样只是采用了类的形式而已并非很好的运用类的思想。
本次作业采取的是第一个把整个大的加密算法当为一个类的方法。
(二)设计工作流程(三)程序代码#include<iostream>#include<string>using namespace std;class wangxianDES{public:void sr(char a[8]);//将输入的字符转入shur字符数组里去void mwerjinzhi();//明文进行二进制转换,并放入mingwen[64]数组里void merjinzhi();//密钥进行二进制转换,并放入miyue[64]数组里 void bmingwen();//64位初始明文进行移位变换,并放入mingwenbianhuan[64]数组里void fenmingwen();//变换后的明文分为r和l两个32位数组,放入mingwenr[32]和mingwenl[32]void kuozhan();//r数组由32位扩展到48位,放到mingwenrk[48] void cjo();//64位密钥除去奇偶位变成56位,放到miyuecjo[56] void df();//将56位密钥等分成a和b两个28位的数组,放到miyuea[28]和miyueb[28]void ayw(int n);//a数组进行移位void byw(int n);//b数组进行移位void hb();//将移位后的a和b数组合并,放到miyuehb[56]void bh();//合并后将56位数组变换成48位数组,放到miyuehbh[48] void tyh();//将扩展后的r数组和合并后的48位数组进行异或运算,放到yh[48]void s();//对48位数据进行s盒变换,得到32位数据放到sbh[32] void sh();//sbh[32]的数据再变换放到szbh[32]里void zyh();//将szbh[32]和mingwenl[32]异或放到mingwenr[32]里void zhb();//最后将mingwenr[32]和mingwenl[32]合并到zh[64]里void zzz();//zh[64]再变换放到aaa[64]里int aaa[64];private:char shur[8];//定义了所需要的数组,具体用途上边函数注释里提到int bhs[8], mingwen[64],mingwenbianhuan[64],mingwenl[32],mingwenr[32],mingwenrk[48],miyue[64],miyuecjo[56],miyuea[28],miyueb[28],miyueyw[16],mi yuehb[56],miyuehbh[48],yh[48],sbh[32],szbh[32],zhong[32],zh[64];};int mwbhjz[64]={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};//明文变换所用到的变换矩阵intmwrkzjz[48]={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};//mingwenr[32]扩展所用到的变换矩阵int mycjojz[56]= {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};//密钥除奇偶位用到的变换矩阵int myyw[16]={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};//密钥移位用到的矩阵int myhbhzj[48]= {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};//密钥合并用到的矩阵int sbhjz[32]= {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};//密钥合并后变换用到的矩阵int zhjz[64]={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}; //最后64位变换的矩阵int B[4][16]= {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};//s盒变换的矩阵int C[4][16]= {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};//s盒变换的矩阵int D[4][16]= {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};//s盒变换的矩阵int E[4][16]= {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};//s盒变换的矩阵int F[4][16]= {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};//s盒变换的矩阵int G[4][16]= {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};//s盒变换的矩阵int H[4][16]= {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,//s盒变换的矩阵6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12};int I[4][16]= {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};//s盒变换的矩阵void wangxianDES::sr(char a[8]){ int i;for (i=0;i<8;i++)shur[i]=a[i];cout<<"将输入的字符转入shur字符数组里去"<<endl;}void wangxianDES::mwerjinzhi(){ int a=8,i,j;for(j=0;j<8;j++){ for(i=8;i>0;i--){mingwen[i+a-1]=shur[j]%2;shur[j]=shur[j]/2;}a=a+8;}cout<<"明文进行二进制转换,并放入mingwen[64]数组里"<<endl;} void wangxianDES::merjinzhi(){ int a=8;int i,j;for(j=0;j<8;j++){ for(i=8;i>0;i--){miyue[i+a-1]=shur[j]%2;shur[j]=shur[j]/2;}a=a+8;}cout<<"密钥进行二进制转换,并放入miyue[64]数组里"<<endl; } void wangxianDES::bmingwen(){ int i;for(i=0;i<64;i++)mingwenbianhuan[i]=mingwen[mwbhjz[i]-1];cout<<"64位初始明文进行移位变换,并放入mingwenbianhuan[64]数组里"<<endl;}void wangxianDES::fenmingwen(){ int i;for(i=0;i<32;i++)mingwenl[i]=mingwenbianhuan[i];for(i=0;i<32;i++)mingwenr[i]=mingwenbianhuan[i+32];cout<<"变换后的明文分为r和l两个32位数组,放入mingwenr[32]和mingwenl[32]"<<endl;}void wangxianDES::kuozhan(){ int i;for(i=0;i<48;i++)mingwenrk[i]=mingwenr[mwrkzjz[i]-1];cout<<"r数组由32位扩展到48位,放到mingwenrk[48]"<<endl;} void wangxianDES::cjo(){ int i;for(i=0;i<56;i++)miyuecjo[i]=miyue[mycjojz[i]-1];cout<<"64位密钥除去奇偶位变成56位,放到miyuecjo[56]"<<endl;}void wangxianDES::df(){ int i;for(i=0;i<28;i++)miyuea[i]=miyuecjo[i];for(i=0;i<28;i++)miyueb[i]=miyuecjo[i+28];cout<<"将56位密钥等分成a和b两个28位的数组,放到miyuea[28]和miyueb[28]"<<endl;}void wangxianDES::ayw(int n){ int a,i;a=myyw[n];if(a==1){int b;b=miyuea[0];for(i=0;i<27;i++)miyuea[i]=miyuea[i+1];miyuea[28]=b;}else{int b,c;b=miyuea[0];c=miyuea[1];for(i=0;i<26;i++)miyuea[i]=miyuea[i+2];miyuea[26]=b;miyuea[27]=c;}cout<<"a数组进行移位"<<endl;}void wangxianDES::byw(int n){ int a,i;a=myyw[n];if(a==1){int b;b=miyueb[0];for(i=0;i<27;i++)miyueb[i]=miyueb[i+1];miyueb[28]=b;}else{int b,c;b=miyueb[0];c=miyueb[1];for(i=0;i<26;i++)miyueb[i]=miyueb[i+2];miyueb[26]=b;miyueb[27]=c;}cout<<"b数组进行移位"<<endl;}void wangxianDES::hb(){ int i;for(i=0;i<28;i++)miyuehb[i]=miyuea[i];for(i=0;i<28;i++)miyuehb[i+28]=miyueb[i];cout<<"将移位后的a和b数组合并,放到miyuehb[56]"<<endl;} void wangxianDES::bh(){ int i;for(i=0;i<48;i++)miyuehbh[i]=miyuehb[myhbhzj[i]-1];cout<<"合并后将56位数组变换成48位数组,放到miyuehbh[48]"<<endl;}void wangxianDES::tyh(){ int i;for(i=0;i<48;i++){if(miyuehbh[i]==mingwenrk[i])yh[i]=0;else yh[i]=1;}cout<<"将扩展后的r数组和合并后的48位数组进行异或运算,放到yh[48]"<<endl;}void wangxianDES::s(){ int a,b;a=yh[0]*2+yh[5];b=yh[1]*8+yh[2]*4+yh[3]*2+yh[4];bhs[0]=B[a][b];a=yh[6]*2+yh[11];b=yh[7]*8+yh[8]*4+yh[9]*2+yh[10];bhs[1]=C[a][b];a=yh[12]*2+yh[17];b=yh[13]*8+yh[14]*4+yh[15]*2+yh[16];bhs[2]=D[a][b];a=yh[18]*2+yh[23];b=yh[19]*8+yh[20]*4+yh[21]*2+yh[22];bhs[3]=E[a][b];a=yh[24]*2+yh[29];b=yh[25]*8+yh[26]*4+yh[27]*2+yh[28];bhs[4]=F[a][b];a=yh[30]*2+yh[35];b=yh[31]*8+yh[32]*4+yh[33]*2+yh[34];bhs[5]=G[a][b];a=yh[36]*2+yh[41];b=yh[37]*8+yh[38]*4+yh[39]*2+yh[40];bhs[6]=H[a][b];a=yh[42]*2+yh[47];b=yh[43]*8+yh[44]*4+yh[45]*2+yh[46];bhs[7]=I[a][b];int k=8,i,j;for(j=0;j<8;j++){ for(i=4;i>0;i--){sbh[i+k-1]=bhs[j]%2;bhs[j]=bhs[j]/2;}k=k+8;}cout<<"对48位数据进行s盒变换,得到32位数据放到sbh[32]"<<endl;}void wangxianDES::sh(){ int i;for(i=1;i<32;i++)szbh[i]=sbh[sbhjz[i]-1];cout<<"sbh[32]的数据再变换放到szbh[32]里"<<endl;}void wangxianDES::zyh(){ int i;for(i=1;i<32;i++){ zhong[i]=mingwenr[i];if(szbh[i]==mingwenl[i])mingwenr[i]=0;else mingwenr[i]=1;mingwenl[i]=zhong[i];}cout<<"将szbh[32]和mingwenl[32]异或放到mingwenr[32]里,原来mingwenr里的转到mingwenl里"<<endl;}void wangxianDES::zhb(){ int i;for(i=0;i<32;i++)zh[i]=mingwenr[i];for(i=0;i<32;i++)zh[i+32]=mingwenl[i];cout<<"最后将mingwenr[32]和mingwenl[32]合并到zh[64]里"<<endl;}void wangxianDES::zzz(){ int i;for(i=0;i<64;i++)aaa[i]=zh[zhjz[i]-1];cout<<"zh[64]再变换放到aaa[64]里"<<endl;}void main(){ wangxianDES A;char shuru[8],shuchu[8];int p;int w, y;cout<<"输入明文(小于9个字符)"<<endl;cin>>shuru;A.sr(shuru);A.mwerjinzhi();cout<<"输入密钥(8个字符)"<<endl;cin>>shuru;A.sr(shuru);A.merjinzhi();A.bmingwen();A.fenmingwen();A.cjo();A.df();for(p=0;p<16;p++){ A.ayw(p);A.byw(p);A.hb();A.bh();A.kuozhan();A.tyh();A.s();A.sh();A.zyh();}A.zhb();A.zzz();cout<<"加密后的密文二进制"<<endl;for(y=0;y<64;y++){cout<<A.aaa[y]<<" ";p=y+1;if(p%8==0)cout<<endl;}cout<<endl;w=0;cout<<"加密后的8位密文"<<endl;for(p=0;p<8;p++){(char)shuchu[p]=A.aaa[7+w]+A.aaa[6+w]*2+A.aaa[5+w]*4+A.aaa[4+w ]*8+A.aaa[3+w]*16+A.aaa[2+w]*32+A.aaa[1+w]*64+A.aaa[0+w]*128;cout<<shuchu[p];w=w+8;}}(四)运行结果(五)设计总结本次作业是按照自己的思路和想法来完成的,最后得到加密后的密文。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DES算法及其程序实现一.D ES算法概述①DES算法为密码体制中的对称密码体制,又被成为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。
明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位,使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。
②DES算法的特点:分组比较短、密钥太短、密码生命周期短、运算速度较慢。
③DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,整个算法的主流程图如下:二.D ES算法的编程实现#include <iostream>#include <fstream>using namespace std;const static char ip[] = { //IP置换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 fp[] = { //最终置换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 sbox[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, 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, 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[] = { //压缩置换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 ei[] = { //扩展置换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 Pzh[]={ //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[]={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};bool key[16][48]={0},/*rekey[16][48],*/char key_in[8];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) //位到字节转换{for(int 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 len) //按位异或{for(int i=0;i<len;i++)InA[i]^=InB[i];}void keyfc(char *In) //获取密钥函数{int i,j=0,mov,k;bool key0[56],temp,keyin[64];ByteToBit(keyin,In,64); //字节到位的转换for(i=0;i<56;i++) //密钥压缩为56位key0[i]=keyin[Keyrar[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(int 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[j]-1];}}void DES(char Out[8],char In[8],bool MS)//加密核心程序,ms=0时加密,反之解密{bool MW[64],tmp[32],PMW[64]; //注意指针bool kzmw[48],keytem[48],ss[32];int hang,lie;ByteToBit(PMW,In,64);for(int j=0;j<64;j++){MW[j]=PMW[ip[j]-1]; //初始置换}bool *Li=&MW[0],*Ri=&MW[32];for(int i=0;i<48;i++) //右明文扩展置换kzmw[i]=Ri[ei[i]-1]; //注意指针if(MS==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[ei[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]=sbox[i][(hang+1)*16+lie]%2;tmp[i*4+2]=(sbox[i][(hang+1)*16+lie]/2)%2;tmp[i*4+1]=(sbox[i][(hang+1)*16+lie]/4)%2;tmp[i*4]=(sbox[i][(hang+1)*16+lie]/8)%2;}for(int i=0;i<32;i++) //P置换Ri[i]=tmp[Pzh[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[fp[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(int i=0;i<48;i++) //右明文扩展置换kzmw[i]=Ri[ei[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]=sbox[i][(hang+1)*16+lie]%2;tmp[i*4+2]=(sbox[i][(hang+1)*16+lie]/2)%2;tmp[i*4+1]=(sbox[i][(hang+1)*16+lie]/4)%2;tmp[i*4]=(sbox[i][(hang+1)*16+lie]/8)%2;}for(i=0;i<32;i++) //P置换Ri[i]=tmp[Pzh[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[fp[i]-1];BitToByte(Out,PMW,64); //位到字节的转换}}void main(){char Ki[8],jm[8],final[8];int i0;cout<<"请输入密钥(8字节):"<<endl;for(i0=0;i0<8;i0++)cin>>Ki[i0];keyfc(Ki);cout<<"请输入明文:"<<endl;for(i0=0;i0<8;i0++)cin>>jm[i0];DES(final,jm,0);cout<<"加密后:"<<endl;//加密for(i0=0;i0<8;i0++)cout<<final[i0];cout<<endl;cout<<"解密后:"<<endl;DES(jm,final,1); //解密for(i0=0;i0<8;i0++)cout<<jm[i0];cout<<endl;}三.实例描述1.加密字母,运行结果如下:2.加密汉字,运行结果如下:。