一、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...