當前位置:編程學習大全網 - 源碼下載 - 查閱des算法的詳細過程

查閱des算法的詳細過程

圖為最詳細的過程?

下面附上壹個完整的C程序,是我自己做的。看壹看。

#包含?" stdio.h "

#包含?" memory.h "

#包含?"時間. h "

#包含?" stdlib.h "

#定義?普通文件打開錯誤?-1

#定義?密鑰_文件_打開_錯誤?-2

#定義?密碼_文件_打開_錯誤?-3

#定義?好嗎?1?

typedef?夏爾?ElemType?

/*初始替換表IP*/

int?IP_Table[64]?=?{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,

56,48,40,32,24,16,8,0,

58,50,42,34,26,18,10,2,

60,52,44,36,28,20,12,4,

62,54,46,38,30,22,14,6};?

/*逆初始替換表IP-1 */

int?IP_1_Table[64]?=?{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,

32,0,40,8,48,16,56,24};

/*擴展替換表E*/

int?E_Table[48]?=?{31,?0,?1,?2,?3,?4,

3,4,?5,?6,?7,?8,

7,8,9,10,11,12,

11,12,13,14,15,16,

15,16,17,18,19,20,

19,20,21,22,23,24,

23,24,25,26,27,28,

27,28,29,30,31,?0};

/*置換函數P*/

int?P_Table[32]?=?{15,6,19,20,28,11,27,16,

0,14,22,25,4,17,30,9,

1,7,23,13,31,26,2,8,

18,12,29,5,21,10,3,24};

/*S框*/

int?S[8][4][16]?=

/*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}}};

/*替換選擇1*/

int?PC_1[56]?=?{56,48,40,32,24,16,8,

0,57,49,41,33,25,17,

9,1,58,50,42,34,26,

18,10,2,59,51,43,35,

62,54,46,38,30,22,14,

6,61,53,45,37,29,21,

13,5,60,52,44,36,28,

20,12,4,27,19,11,3};

/*替換選項2*/

int?PC_2[48]?=?{13,16,10,23,0,4,2,27,

14,5,20,9,22,18,11,3,

25,7,15,6,26,19,12,1,

40,51,30,36,46,54,29,39,

50,44,32,46,43,48,38,55,

33,52,45,41,49,35,28,31};

/*關於左移次數的規定*/

int?MOVE_TIMES[16]?=?{1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};

int?ByteToBit(ElemType?ch,ElemType?位[8]);

int?BitToByte(ElemType?位[8],ElemType?* ch);

int?Char8ToBit64(ElemType?ch[8],ElemType?位[64]);

int?Bit64ToChar8(ElemType?位[64],ElemType?ch[8]);

int?DES_MakeSubKeys(ElemType?key[64],ElemType?子密鑰[16][48]);

int?DES _ PC 1 _ Transform(elem type?鍵[64],?ElemType?tempbts[56]);

int?DES_PC2_Transform(ElemType?鍵[56],?ElemType?tempbts[48]);

int?德斯ROL(ElemType?數據[56],?int?時間);

int?DES_IP_Transform(ElemType?數據[64]);

int?DES _ IP _ 1 _ Transform(elem type?數據[64]);

int?DES_E_Transform(ElemType?數據[48]);

int?DES_P_Transform(ElemType?數據[32]);

int?DES_SBOX(ElemType?數據[48]);

int?DES_XOR(ElemType?R[48],?ElemType?L[48],int?計數);

int?DES_Swap(ElemType?左[32],ElemType?右[32]);

int?DES_EncryptBlock(ElemType?平原街區[8],?ElemType?子項[16][48],?ElemType?密碼塊[8]);

int?DES_DecryptBlock(ElemType?密碼塊[8],?ElemType?子項[16][48],?ElemType?plain block[8]);

int?DES_Encrypt(char?*普通文件,?夏爾?*keyStr,char?* cipher file);

int?DES_Decrypt(char?*密碼文件,?夏爾?*keyStr,char?* plain file);

/*字節轉換為二進制*/

int?ByteToBit(ElemType?ch,?ElemType?位[8]){

int?cnt

for(cnt?=?0;cnt?& lt?8;?cnt++){

*(位+計數)?=?(ch & gt& gtCNT)& amp;1;

}

回歸?0;

}

/*二進制到字節*/

int?BitToByte(ElemType?位[8],ElemType?*ch){

int?cnt

for(cnt?=?0;cnt?& lt?8;?cnt++){

*ch?|=?*(位?+?CNT)& lt;& ltcnt

}

回歸?0;

}

/*將長度為8的字符串轉換為二進制位字符串*/

int?Char8ToBit64(ElemType?ch[8],ElemType?位[64]){

int?cnt

for(cnt?=?0;?cnt?& lt?8;?cnt++){

ByteToBit(*(ch+cnt),bit+(CNT & lt;& lt3));

}

回歸?0;

}

/*將二進制位字符串轉換為長度為8的字符串*/

int?Bit64ToChar8(ElemType?位[64],ElemType?ch[8]){

int?cnt

memset(ch,0,8);

for(cnt?=?0;?cnt?& lt?8;?cnt++){

BitToByte(bit+(CNT & lt;& lt3)、ch+CNT);

}

回歸?0;

}

/*生成子項*/

int?DES_MakeSubKeys(ElemType?key[64],ElemType?子項[16][48]){

ElemType?溫度[56];

int?cnt

DES_PC1_Transform(key,temp);/*PC1替換*/

for(cnt?=?0;?cnt?& lt?16;?Cnt++){/*16輪替換,產生16個子鍵*/

DES_ROL(temp,MOVE _ TIMES[CNT]);/*向左循環*/

DES_PC2_Transform(temp,subKeys[CNT]);/*PC2置換以生成子密鑰*/

}

回歸?0;

}

/*密鑰排列1*/

int?DES _ PC 1 _ Transform(elem type?鍵[64],?ElemType?tempbts[56]){

int?cnt?

for(cnt?=?0;?cnt?& lt?56;?cnt++){

tempbts[cnt]?=?key[PC _ 1[CNT]];

}

回歸?0;

}

/*密鑰排列2*/

int?DES_PC2_Transform(ElemType?鍵[56],?ElemType?tempbts[48]){

int?cnt

for(cnt?=?0;?cnt?& lt?48;?cnt++){

tempbts[cnt]?=?key[PC _ 2[CNT]];

}

回歸?0;

}

/*向左循環*/

int?德斯ROL(ElemType?數據[56],?int?時間){

ElemType?溫度[56];

/*保存要循環向右移動的位*/

memcpy(溫度、數據、時間);

memcpy(temp+time,data+28,time);

/*前28位移位*/

memcpy(數據,數據+時間,28次);

memcpy(data+28-time,temp,time);

/*移動最後28位*/

memcpy(數據+28,數據+28+時間,28-時間);

memcpy(data+56-time,temp+time,time);?

回歸?0;

}

/*IP更換*/

int?DES_IP_Transform(ElemType?數據[64]){

int?cnt

ElemType?溫度[64];

for(cnt?=?0;?cnt?& lt?64;?cnt++){

臨時[計數]?=?data[IP _ Table[CNT]];

}

memcpy(數據,溫度,64);

回歸?0;

}

/*IP逆置換*/

int?DES _ IP _ 1 _ Transform(elem type?數據[64]){

int?cnt

ElemType?溫度[64];

for(cnt?=?0;?cnt?& lt?64;?cnt++){

臨時[計數]?=?data[IP _ 1 _ Table[CNT]];

}

memcpy(數據,溫度,64);

回歸?0;

}

/*擴展置換*/

int?DES_E_Transform(ElemType?數據【48】){

int?cnt

ElemType?溫度[48];

for(cnt?=?0;?cnt?& lt?48;?cnt++){

臨時[計數]?=?data[E _ Table[CNT]];

}

memcpy(數據,溫度,48);

回歸?0;

}

/*P置換*/

int?DES_P_Transform(ElemType?數據[32]){

int?cnt

ElemType?溫度[32];

for(cnt?=?0;?cnt?& lt?32;?cnt++){

臨時[計數]?=?data[P _ Table[CNT]];

}

memcpy(數據,溫度,32);

回歸?0;

}

/*異或*/

int?DES_XOR(ElemType?R[48],?ElemType?L[48]?,int?計數){

int?cnt

for(cnt?=?0;?cnt?& lt?數數;?cnt++){

R[cnt]?^=?l[CNT];

}

回歸?0;

}

/*S盒更換*/

int?DES_SBOX(ElemType?數據【48】){

int?cnt

int?行,行,輸出;

int?cur1,cur2

for(cnt?=?0;?cnt?& lt?8;?cnt++){

cur1?=?CNT * 6;

cur2?=?cnt & lt& lt2;

/*計算S框中的行和列*/

線?=?(data[cur 1]& lt;& lt1)?+?data[cur 1+5];

劃?=?(data[cur 1+1]& lt;& lt3)?+?(data[cur 1+2]& lt;& lt2)

+?(data[cur 1+3]& lt;& lt1)?+?data[cur 1+4];

輸出?=?s[CNT][line][row];

/*到二進制*/

數據[cur2]?=?(輸出& amp0X08)>& gt3;

data[cur2+1]?=?(輸出& amp0X04)>& gt2;

數據[cur2+2]?=?(輸出& amp0X02)>& gt1;

數據[cur2+3]?=?輸出與輸出。0x 01;

}

回歸?0;

}

/*交換*/

int?DES_Swap(ElemType?左[32],?ElemType?右[32]){

ElemType?溫度[32];

memcpy(溫度,左側,32);

memcpy(左,右,32);

memcpy(右,溫度,32);

回歸?0;

}

/*加密單個數據包*/

int?DES_EncryptBlock(ElemType?平原街區[8],?ElemType?子項[16][48],?ElemType?密碼塊[8]){

ElemType?平原位[64];

ElemType?版權[48];

int?cnt

Char8ToBit64(plainBlock,plain bits);

/*初始替換(IP替換)*/

DES _ IP _ Transform(plain bits);

/*16次叠代*/

for(cnt?=?0;?cnt?& lt?16;?cnt++){?

memcpy(版權所有,plainBits+32,32);

/*將右半部分從32位擴展到48位*/

DES_E_Transform(版權所有);

/*將右半部分與子密鑰進行異或運算*/

DES_XOR(版權所有,subKeys[cnt],48);?

/* XOR結果進入S盒並輸出32位結果*/

DES_SBOX(版權所有);

/*P置換*/

DES_P_Transform(版權所有);

/*對明文的左右部分進行異或運算*/

DES_XOR(plainBits,版權,32);

如果(cnt?!=?15){

/*最後完成左右部分的交換*/

DES_Swap(plainBits,plain bits+32);

}

}

/*逆初始排列(IP 1排列)*/

DES _ IP _ 1 _ Transform(plain bits);

Bit64ToChar8(明文位,密碼塊);

回歸?0;

}

/*解密單個數據包*/

int?DES_DecryptBlock(ElemType?密碼塊[8],?ElemType?子項[16][48],ElemType?plainBlock[8]){

ElemType?密碼位[64];

ElemType?版權[48];

int?cnt

Char8ToBit64(密碼塊,密碼位);?

/*初始替換(IP替換)*/

DES_IP_Transform(密碼位);

/*16次叠代*/

for(cnt?=?15;?cnt?& gt=?0;?cnt - ){

memcpy(版權,cipherBits+32,32);

/*將右半部分從32位擴展到48位*/

DES_E_Transform(版權所有);

/*將右半部分與子密鑰進行異或運算*/

DES_XOR(版權所有,subKeys[cnt],48);

/* XOR結果進入S盒並輸出32位結果*/

DES_SBOX(版權所有);

/*P置換*/

DES_P_Transform(版權所有);

/*對明文的左右部分進行異或運算*/

DES_XOR(cipherBits,版權,32);

如果(cnt?!=?0){

/*最後完成左右部分的交換*/

DES_Swap(密碼位,密碼位+32);

}

}

/*逆初始排列(IP 1排列)*/

DES_IP_1_Transform(密碼位);

Bit64ToChar8(cipherBits,plain block);

回歸?0;

}

/*加密文件*/

int?DES_Encrypt(char?*普通文件,?夏爾?*keyStr,char?*密碼文件){

文件?*普通,*密碼;

int?數數;

ElemType?明文塊[8],密碼塊[8],密鑰塊[8];

ElemType?bKey[64];

ElemType?子項[16][48];

如果((平原?=?fopen(plainFile,“rb”)?==?NULL){

回歸?普通文件打開錯誤;

}

如果((密碼?=?fopen(cipherFile,“wb”)?==?NULL){

回歸?密碼_文件_打開_錯誤;

}

/*設置密鑰*/

memcpy(keyBlock,keyStr,8);

/*將密鑰轉換為二進制流*/

Char8ToBit64(keyBlock,bKey);

/*生成子項*/

DES_MakeSubKeys(bKey,subKeys);

而(!feof(plain)){

/*壹次讀取8個字節,返回成功讀取的字節數*/

如果((算嗎?=?fread(plainBlock,sizeof(char),8,plain))?==?8){

DES_EncryptBlock(plainBlock,subKeys,cipher block);

fwrite(cipherBlock,sizeof(char),8,密碼);

}

}

如果(計數){

/*填充*/

memset(plainBlock?+?計數,' \0 ',7?-?計數);

/*最後壹個字符保存包括最後壹個字符在內的填充字符數*/

平原街區[7]?=?8?-?數數;

DES_EncryptBlock(plainBlock,subKeys,cipher block);

fwrite(cipherBlock,sizeof(char),8,密碼);

}

fclose(素色);

fclose(密碼);

回歸?OK;

}

/*解密文件*/

int?DES_Decrypt(char?*密碼文件,?夏爾?*keyStr,char?*plainFile){

文件?*素色,?*密碼;

int?數數,次數?=?0;

龍?fileLen

ElemType?明文塊[8],密碼塊[8],密鑰塊[8];

ElemType?bKey[64];

ElemType?子項[16][48];

如果((密碼?=?fopen(cipherFile,“rb”)?==?NULL){

回歸?密碼_文件_打開_錯誤;

}

如果((平原?=?fopen(plainFile,“wb”)?==?NULL){

回歸?普通文件打開錯誤;

}

/*設置密鑰*/

memcpy(keyBlock,keyStr,8);

/*將密鑰轉換為二進制流*/

Char8ToBit64(keyBlock,bKey);

/*生成子項*/

DES_MakeSubKeys(bKey,subKeys);

/*取文件長度?*/

fseek(cipher,0,SEEK _ END);/*尾文件指針*/

fileLen?=?ftell(密碼);?/*獲取文件指針的當前位置*/

倒帶(密碼);?/*將文件指針重定向到文件頭*/

while(1){

/*密文的字節數必須是8的整數倍*/

fread(cipherBlock,sizeof(char),8,密碼);

DES_DecryptBlock(cipherBlock,subKeys,plain block);

時代?+=?8;

如果(次?& lt?fileLen){

fwrite(plainBlock,sizeof(char),8,plain);

}

否則{

打破;

}

}

/*判斷末端是否填充*/

if(plainBlock[7]?& lt?8){

對於(伯爵?=?8?-?普通砌塊[7];?數數?& lt?7;?count++){

if(plainBlock[count]?!=?'\0'){

打破;

}

}

}

如果(算嗎?==?7){/*已填充*/

fwrite(plainBlock,sizeof(char),8?-?plainBlock[7],平原);

}

Else{/*無填充*/

fwrite(plainBlock,sizeof(char),8,plain);

}

fclose(素色);

fclose(密碼);

回歸?OK;

}

int?主()

{

clock_t?甲、乙;

答?=?clock();

DES_Encrypt("1.txt "," key.txt "," 2 . txt ");

b?=?clock();

Printf("加密需要%d毫秒\n ",b-a);

系統(“暫停”);

答?=?clock();

DES_Decrypt("2.txt "," key.txt "," 3 . txt ");

b?=?clock();

Printf("解密需要%d毫秒\n ",b-a);

getchar();

回歸?0;

}

  • 上一篇:chrome瀏覽器fitler中的XHR作用是什麽
  • 下一篇:芯片理論公式源代碼
  • copyright 2024編程學習大全網