DES加密實現(c語言)

2021-07-02 15:12:23 字數 3498 閱讀 5347

好了,廢話不多說了,見**吧~(ps.命名不是很規範,大家將就下)

#include/*各種函式定義*/

int move_num(int r);

void xor(int *r_b, int *k3, int large);

void s_box(int r_t[32], int r_b[48]);

void erzhuanshiliu(int *k, char *key, int large);

void shizhuaner(int *k, int n, int i, int large);

void round(int r, int k2[56], int k3[48], int r_s[32], int r_b[48], int l[32], int k_c_two[48], int m_c_two[32], int e[48], char c_r[8], char c_l[8]);

void exchange(int *k1, int *k2, int *rule, int n);

void key_move(int k2[56], int n);

/*十進位制轉換成二進位制*/

void shizhuaner(int *k, int n, int i,int large)

/* k是存放二進位制的陣列,n是需要進行轉換的十進位制數,i是第i個十進位制數,large是陣列大小*/

while (n != 0);

while (j >= 0)

return ;

}/*二進位制轉換成十六進製制*/

void erzhuanshiliu(int *k,char *key, int large)

/* k是二進位制陣列,key是存放十六進製制的陣列,large是k陣列的大小*/

} else

}return;

}/*迴圈函式*/

void round(int r, int k2[56], int k3[48], int r_s[32], int r_b[48], int l[32], int k_c_two[48], int m_c_two[32], int e[48], char c_r[8], char c_l[8])

/* r是輪數*/

/* k2是金鑰經過置換1置換完的陣列,k3是金鑰經過置換2置換完的陣列*/

/* r_s是明文處理中r的32大小時的陣列,r_b是明文處理中r的48大小時的陣列,l是明文處理中l的陣列*/

/* k_c_two是金鑰處理中置換2的置換規則陣列,m_c_two是明文處理中置換2的置換規則陣列,e是明文處理中e盒的置換規則陣列*/

/* c_r是各輪密文的r部分,c_l是各輪密文的l部分*/

/* 異或函式 */

void xor(int *r_b, int *k3,int large)

}/* s盒運算函式 */

void s_box(int r_t[32],int r_b[48])

, ,,},

s2[4][16] = ,,,

},s3[4][16] = ,,,

},s4[4][16] = ,,,

},s5[4][16] = ,,,

},s6[4][16] = ,,,

},s7[4][16] = ,,,

},s8[4][16] = ,,,

};for (i = 0; i < 8; i++)

shizhuaner(r_t, jie, i,32); //s盒為十六進製制,須轉換回二進位制進行存放 }}

/*左移函式*/

void key_move(int k2[56], int n)

if (n == 1) //左移1位時,特殊端點值(第27、55)賦值

else //左移2位時,特殊端點值(第27、28、54、55)賦值 }

/* 獲取第r輪左移位數 */

int move_num(int r)

return i; //返回移動的位數

}/* 置換函式 */

void exchange(int *k1, int *k2, int *rule,int n)

return;

}/*主函式*/

int main()

, k_c_two[48] = ,

m_c_one[64] = ,

e[48] = ,

m_c_two[32] = ,

m_c_three[64] = ;

printf("**des加密**\n");

printf("\n");

printf("請輸入加密的金鑰:\n");

for (i = 0; i < 8; i++) //從鍵盤裡獲取輸入的金鑰

g = getchar(); //緩衝掉多於8個字元以外字元和回車符

while (g != '\n')

printf("請輸入需要加密的明文:\n");

for (i = 0; i < 8; i++) //從鍵盤裡獲取輸入的明文

g = getchar(); //緩衝掉多於8個字元以外字元和回車符

while (g != '\n')

printf("\n");

exchange(k1, k2, k_c_one, 56); //金鑰進行置換1處理

exchange(m1, m2, m_c_one, 64); //明文進行金鑰1處理

for (i = 0; i < 32; i++)

l[i] = m2[i]; //明文的l部分

j = 0;

for (i = 32; i < 64; i++)

for (r = 1; r <= 16; r++) //進行16輪的迴圈處理

round(r,k2, k3, r_s, r_b, l, k_c_two, m_c_two, e, c_r, c_l);

for (i = 0; i < 64; i++) //將密文r的部分與密文l的部分合一起

exchange(m1, m2, m_c_three, 64); //進行明文處理的置換3

erzhuanshiliu(m2, c, 64); //二進位制轉換成十六進製制,得到最終密文

printf("這是最終密文:\n");

for (i = 0; i < 16; i++)

printf("%c ", c[i]);

printf("\n");

return 0;

}

以下是測試**和運**況的截圖:

這是我第一次寫部落格(好緊張好刺激啊~~),請各位大大多多指教撒~~

C 實現DES加密

1.定義金鑰變數key 2.定義子金鑰儲存變數subkey 3.將pc 1,pc 2,ip,ip 1,e盒和s盒,p,加密輪資料新建陣列變數儲存 4.定義chartobitset方法進行字串到二進位制數的轉換 5.定義exec函式對資料進行進行擴充套件置換,異或,查s盒置換,p置換的初始操作 6.定...

java web class 加密實現

最近公司讓我研究這方面,所以我自己參考文獻和其他人一些做法,再經過自己的研究,實現了web class加密。我的加密方案其中難點有兩個 rsa 私匙 的隱藏,class檔案的加密儲存方案 經過研究和努力我已經基本上解決了這兩個點。rsa 私匙 的隱藏 採用函式介面,專門生成乙個jar來提供這個私匙和...

C 實現DES對稱加密法

入口引數有三個 key data mode。key為加密解密使用的金鑰,data為加密解密的資料,mode為其工作模式。當模式為加密模式時,明文按照64位進行分組,形成明文組,key用於對資料加密,當模式為解密模式時,key用於對資料解密。實際運用中,金鑰只用到了64位中的56位,這樣才具有高的安全...