DES算法(基于C语言,加密解密代码)_第1页
DES算法(基于C语言,加密解密代码)_第2页
DES算法(基于C语言,加密解密代码)_第3页
DES算法(基于C语言,加密解密代码)_第4页
DES算法(基于C语言,加密解密代码)_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、/* Note:Your choice is C IDE */#include "stdio.h"#include "string.h" #define uchar unsigned char/*明文转换声明部分*/IP1置换表int IP_164=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, 5

2、9, 51, 43, 35, 27, 19, 11, 3, 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7;/IP2逆置换表int IP_264=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,

3、2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25;/E扩展置换表int E_case48=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;/S盒压缩int S1416=14, 4, 13, 1, 2, 15, 11, 8, 3, 1

4、0, 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; int S2416=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

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;int S3416=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,

6、 8, 7, 4, 15, 14, 3, 11, 5, 2, 12; int S4416= 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;int S5416= 2, 12, 4, 1, 7, 10, 11, 6, 8

7、, 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;int S6416=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、, 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; int S7416= 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,

9、1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12;int S8416=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;/P盒置换int Permute32= 16, 7, 20, 21, 2

10、9, 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 ByteToBit(char ch,char bit8)uchar x;for(x=0;x<8;x+) *(bit+x)=(ch<<x)&0x80)>>7; return 0;/字符串转换成二进制位串int Char8ToBit64(char ch8,char bit64)uchar x;for(x=

11、0;x<8;x+)ByteToBit(*(ch+x),bit+(x<<3);return 0;/二进制转换成字节int BitToByte(char bit8,char *ch)uchar x;for(x=0;x<8;x+)*ch|=*(bit+x)<<(7-x);return 0;/将二进制串转换成字符串int Bit64ToChar8(char bit64,char ch8)uchar x;memset(ch,0,8); /把ch8全部清零。for(x=0;x<8;x+)BitToByte(bit+(x<<3),ch+x);return

12、 0;/*密钥声明部分*/密钥PC1置换表int PC_156=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置换表int PC_248=14, 17, 11, 24, 1, 5, 3, 28, 15,

13、 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;/密钥每次轮回移位表uchar Left_Move16=1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1;/*密钥的生成函数部分*/PC-1置换函数int PC1_permute(char pc164,char PC1_Buff56)uchar x;fo

14、r(x=0;x<56;x+)PC1_Buffx=pc1PC_1x-1;return 0;/PC密钥左移int KeyLeftMove(char pcB56,char Move)uchar x;char Cn28,Dn28;char a_buff,b_buff,c_buff,d_buff;/*PC-1密钥56位分离成左右各28位* memcpy(Cn,pcB,28); memcpy(Dn,pcB+28,28);/*PC密钥左移部分*a_buff=Cn0;b_buff=Dn0; if(2=Move) c_buff=Cn1;d_buff=Dn1; for(x=0;x<28;x+)if(2

15、7=x)if(1=Move)Cn27=a_buff;Dn27=b_buff;if(2=Move)Cn26=a_buff;Cn27=c_buff;Dn26=b_buff;Dn27=d_buff;elseCnx=Cnx+Move;Dnx=Dnx+Move;/*28bit合成56bit* memcpy(pcB,Cn,28); memcpy(pcB+28,Dn,28);return 0;/PC-2逆置换函数int PC2_permut(char pc256,char PC2_Buff48)uchar x;for(x=0;x<48;x+)PC2_Buffx=pc2PC_2x-1;return 0;

16、/产生16轮的子密钥函数int Key16Itera(char key64,char subKeys1648)uchar x,move;char temp156;PC1_permute(key,temp1);/PC1置换,返回值tempfor(x=0;x<16;x+)move=Left_Movex;KeyLeftMove(temp1,move);/移位,返回值temp,56bitPC2_permut(temp1,subKeysx);return 0;/*明文加密函数部分*/IP置换int IP1_permute(char IP164)uchar x;char IP1Buff64;for(

17、x=0;x<64;x+)IP1Buffx=IP1IP_1x-1;memcpy(IP1,IP1Buff,64);return 0;/32bit经E盒扩展成48bitint R_Expand48bit(char R32,char RE48)uchar x;for(x=0;x<48;x+)REx=RE_casex-1;return 0;/IP64逆置换int IP2_permute(char IP264)uchar x;char temp264;for(x=0;x<64;x+)temp2x=IP2IP_2x-1;memcpy(IP2,temp2,64);return 0;/经P盒置

18、换int Pcase(char S8Byte32)uchar x;char temp332;for(x=0;x<32;x+)temp3x=S8BytePermutex-1;memcpy(S8Byte,temp3,32);return 0; /经S盒压缩成32bitint Reduceto32bit(char EKey48,char S32bit32)uchar x,Rank,Line;int out;for(x=0;x<8;x+) Rank=(EKey1+6*x<<3)|(EKey2+6*x<<2)|(EKey3+6*x<<1)|(EKey4+6

19、*x); Line=(EKey6*x<<1)|(EKey5+6*x); /在S盒寻找需要的数 if(0=x) out=S1LineRank; if(1=x) out=S2LineRank; if(2=x) out=S3LineRank; if(3=x) out=S4LineRank; if(4=x) out=S5LineRank; if(5=x) out=S6LineRank; if(6=x) out=S7LineRank; if(7=x) out=S8LineRank; /把一位数拆成数四位数 S32bit4*x+0=(char)(out)&0x08)>>3;

20、 S32bit4*x+1=(char)(out)&0x04)>>2; S32bit4*x+2=(char)(out)&0x02)>>1; S32bit4*x+3=(char)(out)&0x01);return 0; /*明文16次迭代,加密,*输入值:mw64子密钥:miyue1648*返回值:data64*/int Encryp(char data64,char Zkey161648)uchar x,y;char Left32,Right32,EKbuff48;char SE32bit32;IP1_permute(data);/IP置换mem

21、cpy(Left,data,32);/分离32bitmemcpy(Right,data+32,32); for(x=0;x<16;x+)R_Expand48bit(Right,EKbuff);/E盒扩展for(y=0;y<48;y+) /与密钥异或EKbuffy=Zkey16xy; Reduceto32bit(EKbuff,SE32bit);/经S盒压缩32bit,返回值SE32bit Pcase(SE32bit); /经P盒置换,返回值SE32bit for(y=0;y<32;y+) /与左半部分Left 32bit异或SE32bity=Lefty;memcpy(Left,

22、Right,32);memcpy(Right,SE32bit,32);memcpy(data,Right,32);/合成64bitmemcpy(data+32,Left,32);IP2_permute(data); /IP逆置换return 0;/*密文输入,解密,16次迭代*输入值:miwen64*输出值:mw64*/int Decryp(char miwen64,char D_Zkey161648)uchar x,y;char D_Left32,D_Right32;char D_EKbuff48,D_SE32bit32;IP1_permute(miwen); /IP1置换。memcpy(D

23、_Left,miwen,32);/分离32bitmemcpy(D_Right,miwen+32,32);for(x=16;x>0;x-) /16轮迭代R_Expand48bit(D_Right,D_EKbuff);/E盒扩展for(y=0;y<48;y+) /与密钥异或D_EKbuffy=D_Zkey16x-1y;Reduceto32bit(D_EKbuff,D_SE32bit);/经S盒压缩32bit,返回值D_SE32bit。 Pcase(D_SE32bit); /经P盒置换,返回值SE32bit for(y=0;y<32;y+) D_SE32bity=D_Lefty;m

24、emcpy(D_Left,D_Right,32);memcpy(D_Right,D_SE32bit,32);memcpy(miwen,D_Right,32); /合成64bitmemcpy(miwen+32,D_Left,32);IP2_permute(miwen); /IP逆置换return 0; /*主函数部分*/int main(void) uchar x; char MingW64bit64,MingW8Byte8; char Key64bit64,Key8Byte8; char Key161648,temp264; char Mybuff8; printf("请输入密钥:n"); scanf("%s",Key8Byte); Char8ToBit64(Key8Byte,Key64bit); /密钥字符串置换成二进制串 for(x=0;x<8;x+) /补偿足8位奇偶校验位 memcpy(temp2+8*x,Key64bit+7*x,7); temp2x*8+7=1;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论