DES加密算法的C语言实现_第1页
DES加密算法的C语言实现_第2页
DES加密算法的C语言实现_第3页
DES加密算法的C语言实现_第4页
DES加密算法的C语言实现_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

1、Generated by Foxit PDF Creator © Foxit Softwarehttp:/www.foxitsoftware.coni For evaluation only.#include <stdio.h> #include<memory.h> #include<string.h> #include <time.h> #define Decode 0 #define Encode 1 bool Sub_Key1648;明文初始置换unsigned char Initial =58, 50,42, 34, 26,18

2、,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, 159, 51,43, 35, 27,19,11, 3,61,53, 45, 37, 29,21,13, 5,63, 55, 47, 39,31,23, 15, 7 ;最终置换unsigned char Final=40, 8, 48, 16, 56, 24, 64, 32,39, 7, 47, 15, 55, 23, 63, 31,38, 6, 46, 14,

3、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 ;S-盒置换unsigned char S_Box864=/* S1 */Generated by Foxit PDF Creator © Foxit Softwarehttp:/www.foxitsoftware.coni For evaluation only.14, 4, 13,

4、0, 7, 0, 15,5, 3, 8,4,1, 2,15,11, &7, 4,14, 2,13,1,14, 8,13, 6,3.10, 6,12, 5, 9,1.10, 6,12,11, 9,2,11,15,12, 9, 7,3,10,5, 0, 15, 12, 8, 2, 4,9, 1, 7, 5, 11, 3,Generated by Foxit PDF Creator © Foxit Softwarehttp:/www.foxitsoftware.coni For evaluation only.14,10, 0, 6, 13,/* S2 */15,1, 8,14,

5、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, 911, 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

6、,12,5,10,14, 7,1,10,13,o,6,9,8,7, 4,15,14, 311, 5, 2, 12,/* S4 */7,13,14, 3, 0, 6,9,10,1,2,8, 5, 11, 12, 415,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 */,12, 4, 1,7,10,11, 6, 8, 5, 3,15,13, 0, 14

7、,9,14,11, 2,12, 4, 7,13,1,8, 6,4, 2,3, 0,14,11,10, 4, 5,1,11,10,13, 7,8,12, 7, 1,14, 3,5, 0,15,10, 3,8,15,2,13,9,12, 5,6,15, 0,9,6,9,/* 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,&12, 3,7, 0, 4,10,1,13,11, 6,4, 3, 2,12,9, 5

8、, 15,10, 11, 14,1,7, 6,0, 8,13,/* S7 */2X31-X1-5ToXdiXIdi4di5di5XI4diodiT2T3diTXIT4h&21/* 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;unsigne

9、d char Key_Exchange56= _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;压缩变换unsigned char Compression=14,17,11,24, 1, 5, 3, 28,15, 6,21, 10,23, 19, 12, 4

10、, 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;扩展变换unsigned char Expansion=324&1, 2, 3, 4, 5,5, 6, 7, 8, 9,9, 10, 11, 12, 13,13, 14, 15, 16, 17, 17, 18, 19, 20,21, 21,22, 23, 24, 25,25, 26, 27, 28, 29, 29, 30, 31,32, 1P_

11、盒置换unsigned char P_Box= _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 ;密钥置换unsigned char KeyQ=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, 4

12、6, 38, 30, 22,14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4 ;/unsigned char Key_Move= _1,1 ,2,2,2,2,2,2,1,2,2,2,2,2,2,1;void Key_Process(char *);void DES(char*,char*,int);void Generate_SubKey(bool*,bool*);void Rotate_Key(bool *,int);void lnitial_Exchange(char *, booF,booF );void Exchange_Key(c

13、ha*, bool*);void Expand_Right(boo匚 bool*);void Sunction(bool* ,bool*);void P_function(bool * );void Final_Exchange(booF , bool*,char*);void BitToByte(char *Out, const bool *ln, int bits);主函数int main(int argc,char*argv)unsigned long start,end;/time when execution beginsstart = clock();char Final_Resu

14、lt12=0;char Message12=0;char S_Key8=123,4,5,6,7,8;64bits打开文件用于输入FILE *input = fopen( argv1, V);if(ferror( input)retur n 0 ;创建文件用于输出密文FILE *encyption = fopen(argv2,Hw");if(ferror( encyption )return 0 ;创建文件用于输出解密后的明文FILE *decyption = fopen(argvw“);if(ferror( decyption )return 0;while( Ifeof(input

15、)int i=0;while( Ifeof(input) && i<8 )Messagei=fgetc(input);i+;if (i=0)break;else if(i<8)for(;i<8;i+) Messagei-O*;Key_Process(S_Key);DES(Message,Final_Result,Encode);Final_Result8=0;fputs( Final_Result, encyption );memset(Message,0,8);DES(Final_Result,Message,Decode);Message 二 0;fput

16、s( Message, decyption );/time when execution endsend = clock();pintf(HThe execution time is %ld msrT, end-start); return 0;void Key_Process(char *S_Key) " "int round ;bool Bit_Key56;/56bitsExchange_Key(S_Key,Bit_Key);for(round = 0 丁ound<16;round+)/KL->消息左28位,KR->消息右28位bool*KL = &a

17、mp;Bit_KeyO, *KR = &Bit_Key28;循环左移Rotate_Key(KL,Key_Moveround); Rotate_Key(KR,Ky_Moveround);产生子密潮_Generate_SubKey(Bit_Key,Sub_Keyround); "void Exchange_Key(char *Key , bool* New_Key) int i j;bool Bit_Key64;/Transform the initial key to bool type for(i = 0 ;i<8;i+)forO=0;j<8;j+)Bit_Key

18、i*8+j = (Keyi»j)&OxO1;for(i=0;i<56;i+) New_Keyi=Bit_KeyKey_Exchangei-1; "void Rotate_Key(bool*Key ,int round) _bool temp64;/void *memcpy( void *to, const void *from, size_t count); 函数从from中复制count个字符到to中,并返回to 指针memcpy(temp, Key, round); memcpy(Key, Key+round, 28-round); memcpy(Key+

19、28-round, temp, round);void Generate_SubKey(bool*lnput, bool* Output) _for(int i二0;i<48;i+ )Outputi=lnputCompressioni-1;/DES函数void DES( cha广Message,char *Final_Result,int type) _bool Right32;/32bitsbool Left32;/32bitsbool Expanded_Right48;扩展后的右消息bool flag32;/ffl于左右消息交换bool Result148;/48bitsbool R

20、esult232;/32bitsint round ,i;In itial_Excha nge(Message 丄 eft,Right);加密算法if(type = Encode)for( round = 0 ; round < 16 ;ound+ )memcpy(flag,Right,32);Expand_Right(Right,Expanded_Right);for( i = 0 ; i<48 ; i+ )Result1i=Expanded_RightiASub_Keyroundi;S_fun ction(Result1 ,Result2);P_function(Result2

21、);for( i = 0 ; i<32 ; i+)Righti = Result2iALefti; memcpy(Left,flag,32);解密算法else if(type = Decode)for( round = 15 ; round >=0 ; round ) memcpy(flag,Left,32);Expa nd_Right(Left,Expa nded_Right);for( i = 0; i<48 ; i+ )Resultl i=Expanded_RightiASub_Keyroundi;S_f unction(Result1 ,Result2);P_func

22、tion(Result2);for( i = 0 ; i<32 ; i+)Lefti = Result2iARighti;memcpy(Right,flag,32);Final_Exchange( Left, Right, Final_Result);void lnitial_Exchange(chaMessage , boorLeft,bool*Right)bool temp64;int i,j;把Message转化成bit形式for(i=0;i<8;i+) for0=O;j<8;j+) tempi*8+j= (Messagei»j)&0x01;for(i=0;i<32;i+)Lefti=templnitiali-1;for(;i<64;i+)Righti-32=templnitiali-1;void Expand_Right(bool*lnput, bool*Output

温馨提示

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

评论

0/150

提交评论