替代密碼及置換密碼的C語言實現_第1頁
替代密碼及置換密碼的C語言實現_第2頁
替代密碼及置換密碼的C語言實現_第3頁
替代密碼及置換密碼的C語言實現_第4頁
替代密碼及置換密碼的C語言實現_第5頁
已閱讀5頁,還剩5頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、-. z. 實驗一一、實驗名稱:替代密碼和置換密碼的實現二、實驗目的:通過編程實現替代密碼算法和置換密碼算法,加深對古典密碼體系的了解,為以后深入學習密碼學奠定根底。三、實驗內容:A:替代密碼1、實驗原理:使用替代法進展加密,將明文中的字符用其他字符替代后形成密文。最早的替代密碼是由Julius Caesar 創造的Caesar 愷撒密碼,又叫循環移位密碼。它的加密過程可表示為: E(m) = (m+k ) mod n其中,m為明文字母在字母表中的位置數;n為字母表中的字母個數;k為密鑰;E(m)為密文字母在字母表中對應的位置數。解密算法是:m = D(L) =L-kmod 26;2、算法設計

2、:使用兩個函數分別進展加密和解密的過程,在主程序中通過選擇加密還是解密來調用不同函數進展替代密碼的加密和解密過程實現;3、函數接口:加密:int encrypt() printf(輸入明文:n); scanf(%s,a); for(i=0;ai!=0;i+) bi=ai-64; printf(輸入一位密鑰n); scanf(%d,&k); printf(n); for(i=0;bi!=0;i+) mi=(bi+k)%26+64; printf(%s,&m); return 0;解密:int decode() printf(輸入密文:n);scanf(%s,a); for(i=0;ai!=0;i

3、+) bi=ai-64; printf(輸入一位密鑰n); scanf(%d,&k); printf(n); for(i=0;bi!=0;i+) ni=(bi-k)%26+64; printf(%s,n); return 0;程序流程圖:測試結果截圖:加密:解密:B:實驗原理:不改變明文字符,但是把字符在明文中的排列順序改變,來實現明文信息的加密。置換密碼也被稱為換位密碼。本次實驗使用的是矩陣換位法,是將明文中的字母按照給定的順序安排在一個矩陣中,然后又根據密鑰提供的順序重新組合矩陣中的字母,從而形成密文。解密過程是根據密鑰的字母數作為列數,將密文按照列、行的順序寫出,再根據由密鑰給出的矩陣置

4、換產生新的矩陣恢復正常順序,從而恢復明文。2、算法設計:通過選擇加密或解密,使用置換矩陣順序和恢復矩陣順序的兩個函數,分別在主函數中進展調用來實現置換密碼的加密解密實現;3、函數接口:加密:int jiami()int i = 0, j = 0, key_len = 0, te*t_len = 0, row = 0;char keyLENGTH = 0 ;char numberLENGTH = 0 ;char pte*tLENGTH * 10 = 0 ;char cte*tLENGTH * 10 = 0 ;printf(輸入明文:n);scanf(%s, pte*t);i = 0;while

5、(pte*ti != 0)te*t_len+;i+;printf(輸入密鑰:n);scanf(%s, key);i = 0;while (keyi != 0)key_len+;i+;for (i = 0; ikey_len; i+)numberi = 0;for (j = 0; jkey_len; j+)if (keyjkeyi)numberi+;for (i = 0; ikey_len; i+)for (j = i + 1; jkey_len; j+)if (keyj = keyi)numberj+;if (te*t_len%key_len = 0)row = te*t_len / key_

6、len;elserow = te*t_len / key_len + 1;for (i = 0; ikey_len; i+)for (j = 0; jrow; j+)cte*ti*row + j = pte*tnumberi + key_len*j;for (i = 0; ikey_len; i+)for (j = 0; jrow; j+)printf(%c, cte*ti*row + j);return 0;解密:int jiemi()int i = 0, j = 0, key_len = 0, te*t_len = 0, row = 0; char key1LENGTH = 0 ;char

7、 pte*t1LENGTH * 10 = 0 ;char cte*t1LENGTH * 10 = 0 ;char number1LENGTH = 0 ;printf(輸入密文:n);scanf(%s, cte*t1);while (cte*t1i != 0)te*t_len+;i+;printf(輸入密鑰);scanf(%s, key1);i = 0;while (key1i != 0)key_len+;i+;for (i = 0; ikey_len; i+)int j = 0;number1i = 0;for (j = 0; jkey_len; j+)if (key1jkey1i)numbe

8、r1i+;for (i = 0; ikey_len; i+)int j = 0;for (j = i + 1; jkey_len; j+)if (key1j = key1i)number1j+;if (te*t_len%key_len = 0)row = te*t_len / key_len;elserow = te*t_len / key_len + 1;for (i = 0; ikey_len; i+)for (j = 0; jrow; j+)pte*t1number1i + key_len*j = cte*t1i*row + j;for (i = 0; ikey_len; i+)for

9、(j = 0; jrow; j+)printf(%c, pte*t1i*row + j);return 0;程序流程圖:測試結果截圖:三、實驗總結: 1、在進展替代密碼實現的時候,總是出現程序終止,然后一步步調試,還用了斷點測試,最后發現是循環的終止條件設置錯誤,最后經過了改正,程序能夠從正常運行; 2、在進展置換實驗的時候,設置的數組總是出錯,數量缺乏或排序錯誤,感覺對這一方面的代碼實現有很大的缺乏,置換數組方面忘記了很多概念,應該進展轉么的復習; 3、經過這一次的實驗,對古典密碼中的替代密碼和置換密碼有了一定的了解,感覺對于密碼學有了很濃厚的興趣,想要進一步了解一些密碼的算法和實現的方法;

10、 4、感覺一個假期沒有編程,忘記了很多語句和各種根本知識,感覺應該再系統地復習一遍,再多加練習。四、問題答復:替代密碼:分析密文中的字母頻率后將可以對照破解;可能嚴重偏離標準頻率,參加文章少于100個字母,則對它的解密就會比擬困難。 改良:在單一愷撒密碼的根底上擴展出多表密碼,稱為維吉尼亞密碼。引入了密鑰的概念,即根據密鑰來決定用哪一行的密表來進展替換,可以對抗字頻統計。五、實驗代碼:替代密碼: #include #include #includeint k,i=0;char a100;char b100,m100,n100;int encrypt() printf(輸入明文:n); scan

11、f(%s,a); for(i=0;ai!=0;i+) bi=ai-64; printf(輸入一位密鑰n); scanf(%d,&k); printf(n); for(i=0;bi!=0;i+) mi=(bi+k)%26+64; printf(%s,&m); return 0;int decode() printf(輸入密文:n);scanf(%s,a); for(i=0;ai!=0;i+) bi=ai-64; printf(輸入一位密鑰n); scanf(%d,&k); printf(n); for(i=0;bi!=0;i+) ni=(bi-k)%26+64; printf(%s,n); re

12、turn 0;int main()int c;printf(加密選擇1,解密選擇2 n);scanf(%d,&c);if(c=1)encrypt(); if(c=2)decode();return 0;B、置換密碼:#include#include#defineLENGTH 26int jiami()int i = 0, j = 0, key_len = 0, te*t_len = 0, row = 0;char keyLENGTH = 0 ;char numberLENGTH = 0 ;char pte*tLENGTH * 10 = 0 ;char cte*tLENGTH * 10 = 0

13、;printf(輸入明文:n);scanf(%s, pte*t);i = 0;while (pte*ti != 0)te*t_len+;i+;printf(輸入密鑰:n);scanf(%s, key);i = 0;while (keyi != 0)key_len+;i+;for (i = 0; ikey_len; i+)numberi = 0;for (j = 0; jkey_len; j+)if (keyjkeyi)numberi+;for (i = 0; ikey_len; i+)for (j = i + 1; jkey_len; j+)if (keyj = keyi)numberj+;i

14、f (te*t_len%key_len = 0)row = te*t_len / key_len;elserow = te*t_len / key_len + 1;for (i = 0; ikey_len; i+)for (j = 0; jrow; j+)cte*ti*row + j = pte*tnumberi + key_len*j;for (i = 0; ikey_len; i+)for (j = 0; jrow; j+)printf(%c, cte*ti*row + j);return 0;int jiemi()int i = 0, j = 0, key_len = 0, te*t_l

15、en = 0, row = 0; char key1LENGTH = 0 ;char pte*t1LENGTH * 10 = 0 ;char cte*t1LENGTH * 10 = 0 ;char number1LENGTH = 0 ;printf(輸入密文:n);scanf(%s, cte*t1);while (cte*t1i != 0)te*t_len+;i+;printf(輸入密鑰);scanf(%s, key1);i = 0;while (key1i != 0)key_len+;i+;for (i = 0; ikey_len; i+)int j = 0;number1i = 0;for (j = 0; jkey_len; j+)if (key1jkey1i)number1i+;for (i = 0; ikey_len; i+)int j = 0;for (j = i + 1; jkey_len; j+)if (key1j = key1i)number1j+;if (te*t_len%key_len = 0)row = te*t_len / key_len;elserow = te*t_len / key_len + 1;for (i = 0; ikey_len; i+

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論