Linux下c語言實現DES和3DES演算法

2021-06-16 07:14:27 字數 4225 閱讀 1192

一、des演算法理論

,請朋友們自己去學習,我的**也是依據這裡的理論寫的。

二、實現環境及檔案

a、環境:redhat linux + c

b、實現檔案:des.h

des.c

makefile

三、**

1、des.h檔案

#ifndef des_h

#define des_h

static int pc_1_table[56]=;

static int pc_2_table[48]=;

static int ls_num_table[16]=;

static int ip_table[64]=;

static int ip_1_table[64]=;

static int e_table[48]=;

static int p_table[32]=;

static int s_box_table[8][4][16]=,

, ,},,

, ,}, ,

, ,}, ,

, ,}, ,

, ,}, ,

, ,}, ,

, ,}, ,

, ,} };

//函式宣告

int do_des(char* strsrc, char* strkey, char* strdest, char flag);

#endif

2、des.c檔案

#include

#include

#include

#include "des.h"

//函式宣告

int do_des(char* strsrc, char* strkey, char* strdest, char flag);

int do_3des(char* strsrc, char* strkey, char* strdest, char flag);

//主函式

int main(int argc, char** argv)

if(strcmp(argv[2],"-s") == 0)

else if(strcmp(argv[1],"-d") == 0)

else

return -1;

} else if(strcmp(argv[2],"-3") == 0)

else if(strcmp(argv[1],"-d") == 0)

else

return -1;

} else

return -1;

return 0; }

//做des加密或解密運算

int do_des(char* strsrc, char* strkey, char* strdest, char flag)

memcpy(bits,r0,32);

memcpy(bits+32,l0,32);

des_ip_1(bits,strtmp);

bittobyte(strtmp,64,byte8);

bytetobcd(byte8,8,strdest);

} else

memcpy(bits,r0,32);

memcpy(bits+32,l0,32);

des_ip_1(bits,strtmp);

bittobyte(strtmp,64,byte8);

bytetobcd(byte8,8,strdest);

} return 0;}

//做3des加密或解密運算

int do_3des(char* strsrc, char* strkey, char* strdest, char flag)

else

return 0;}

//對輸入的位元組串作bcd編碼擴充套件

int bytetobcd(unsigned char* bytes, int count,unsigned char* strbcd)

return (count*2); }

//把輸入的bcd編碼串還原成位元組串

int bcdtobyte(unsigned char* strbcd, int count, unsigned char* bytes)

return (count/2);}

//把位元組串變成位元串

int bytetobit(unsigned char* bytes, int count, unsigned char* strbit)  }

return (count*8); }

//把位元串變成位元組串

int bittobyte(unsigned char* strbit, int count, unsigned char* bytes)

bytes[i] = ctmp; 

} return (count/8);}

//做異或操作

int do_xor(unsigned char* strsrc, int count, unsigned char* strdest)

//des演算法pc-1變換,把64位元的金鑰k變換成56位元

int des_pc_1(unsigned char* strin, unsigned char* strout)

//des演算法pc-2變換,把56位元變換成48位元

int des_pc_2(unsigned char* strin, unsigned char* strout)

//des演算法的迴圈左移位運算

int des_ls(unsigned char* strin, int count, unsigned char* strout)

//des演算法中通過父金鑰產生16個48位元位的子金鑰

int des_gensubkey(unsigned char* strkey, unsigned char strsubkey[16][48+1])

return 0;}

//des演算法ip置換

int des_ip(unsigned char* strin, unsigned char* strout)

//des演算法ip-1置換

int des_ip_1(unsigned char* strin, unsigned char* strout)

//des演算法e變換,將32位元變成48位元

int des_e(unsigned char* strin, unsigned char* strout)

//des演算法p變換

int des_p(unsigned char* strin, unsigned char* strout)

//des演算法s盒變換

int des_s_box(unsigned char* strin, int nsbox, unsigned char* strout)

return 4;}

//des演算法f函式,對ri-1和ki進行運算

int des_f(unsigned char* strr, unsigned char* strk, unsigned char* strout)

3、makefile檔案

all: des

@echo 'compile is ok'

des: des.o

cc -o des des.o

@rm des.o

des.o: des.c

cc -c des.c

四、測試資料

des加密測試資料:

src: 12345678(3132333435363738)

key: 99999999(3939393939393939)

ret: 3b2c7c7e6829aeda

des解密測試資料:

src: 12345678(3b2c7c7e6829aeda)

key: 99999999(3939393939393939)

ret: 3132333435363738

3des加密測試資料:

src: 12345678(3132333435363738)

key: 9999999988888888(39393939393939393838383838383838)

ret: 3b2c7c7e6829aeda

3des解密測試資料:

src: 3b2c7c7e6829aeda

key: 9999999988888888(39393939393939393838383838383838)

ret: 12345678(3132333435363738)

DES演算法的c語言實現

網上找了一部分 稍微修改了下就可以使用了。已上傳github 原理 des演算法把64位的明文輸入塊變為64位的密文輸出塊,它所使用的金鑰也是64位 實際用到了56位,第8 16 24 32 40 48 56 64位是校驗位,使得每個金鑰都有奇數個1 其演算法主要分為兩步 1 初始置換 其功能是把輸...

Linux下C語言實現CopyFile

linux下c語言實現檔案拷貝 function copy file from file1 to file2 how to execute copyfile file1 file2 under linux data 2007 05 09 include fprintf stderr,bufsiz i...

Linux下C語言實現UDP Socket程式設計

該博文參考了linux c socket 程式設計之udp一文,在這裡表示感謝!傳送方 file udp sender.c author henry created on 2019年5月29日17 08 13 主要實現 傳送20個文字訊息,然後再傳送乙個終止訊息 include include in...