狠狠干影院/欧美午夜电影在线观看/高黄文/国产精品一区二区在线观看完整版

古典密碼實驗報告

| 瀏覽次數:

 實

 驗

 報

 告 一、 實驗室名稱:

 SimpleSPC 信息安全云實驗系統 二、 實驗項目名稱:

 古典密碼——置換密碼 三、 實驗學時:

 1 學時 四、 實驗原理:

 1) 算法原理

 a) 置換密碼算法是不改變明文字符,而是按照某一規則重新排列消息中的比特或字符順序,才而實現明文信息的加密。將明文中的字母按照給定的順序安排在一個矩陣中,然后用根據密鑰提供的順序重新組合矩陣中的字母,從而形成密文。其解密過程是根據密鑰的字母數作為列數,將密文按照列、行的順序寫出,再根據密鑰給出的矩陣置換產生新的矩陣,從而恢復明文。

 b) 置換密碼(Permutation Cipher),又稱換位密碼。算法實施時,明文的字母保持相同,但順序會被打亂。置換只不過是一個簡單的換位,每個置換都可以用一個置換矩陣 Ek 來表示。每個置換都有一個與之對應的逆置換 Dk。置換密碼的特點是僅有一個發送方和接受方知道的加密置換(用于加密)及對應的逆置換(用于解密)。它是對明文 L 長字母組中的字母位置進行重新排列,而每個字母本身并不改變。

 c) 設 n 為一固定整數,P、C 和 K 分別為明文空間、密文空間和密鑰空間。明/密文是長度為 n 的字符序列,分別記為 X(x1,x2,…,xn)屬于 P 和 Y(y1,y2,…,yn)屬于 C ,K 是定義在{1,2,…,n}的所有置換組成的集合。對任何一個密鑰(即一個置換),定義置換如下:

 加密置換為:

  解密置換為:

  上式中,是的逆置換,密鑰空間 K 的大小為 n!

 2) 算法參數

  置換密碼算法主要有 c、m、k、n 四個參數。c 為密文,m 是明文,k 為密鑰,n 為模數。

 3) 算法流程

  算法流程。如圖所示

  五、 實驗目的:

 1)

 學習置換密碼的原理

 2)

 學習置換密碼的算法實現

 六、 實驗內容:

 1.在虛擬機上運行置換密碼.exe 可執行文件,根據提示輸入明文和密鑰,同時檢查輸出的解密后的結果是否與明文一致。

 2.學習掌握置換密碼的原理,并根據明文和密鑰計算出對應的加密文,并與程序輸出的結果進行比對,掌握其加密解密的過程。

 3.看懂實驗程序代碼,如有需要可在其上進行優化。

 七、 實驗器材(設備、虛擬機名稱):

 Windows 7

 工具:C:\tools\密碼學課程\01 密碼學算法\02 古典密碼\01 置換密碼

 八、 實驗步驟:

 1、查看置換密碼算法運行結果并學習其核心算法

 1.1

 點擊【置換密碼.exe】,選擇對明文【asdfgh】使用密鑰【qwerty】進行加密,程序運行結果。如下圖所示

  但是在實驗中發現,當密鑰中包含相同字符時,加密和解密結果會出現問題,如下圖所示:

 在觀察程序代碼后,發現應該是加密表生成出現問題,因此在實驗中我重新修改了程序中計算加密表部分的代碼,利用雙層循環,對于每一個字符,計算比其小的字符或者和它一樣但是出現在其左側的字符個數,得到的序列便是加密表的內容,將程序按照上述思路修改后測試運行正確。

 1.2

 更新后的置換密碼的核心算法如下所示。

 #include<iostream> #include<algorithm> using namespace std; char a[20][6], b[20][6], c[20][6], m[102], key[6], ky[6], mw[102], bb[102]; int zh[6], zh1[6]; int j, len, length, e, f; void

 ISD_zhihuan_zhihuan(int le) {

 int i, s = 0;

 if (le % 6 == 0)

  //明文長度是6的倍數時

 {

  for (j = 0; j<(le / 6); j++)

 for (i = 0; i<6; i++, s++)

 {

  a[j][i] = m[s];

 }

 }

 else

  //明文長度不是6的倍數時

 {

  for (j = 0; j<((le - le % 6) / 6); j++)

 for (i = 0; i<6; i++, s++)

 {

  a[j][i] = m[s];

 }

  j++;

  int w = 0;

  for (int l = le - le % 6; l<le; l++, w++)

  {

 a[j][w] = m[l];

  }

  for (int ll = le % 6; ll<6; ll++)

  {

 a[j][ll] = "X";

 //數組后補x使數組長度為6的倍數

  }

 }

 length = 6 * j; } int ISD_zhihuan_encrypt() {

 cout << endl << "請輸入密鑰,要求是6位字母:";

 cin >> key;

 for (int p = 0; p < 6; p++)

 {

  ky[p] = key[p];

 }

 //生成置換表

  for (int i = 0; i < 6; i++) {

  zh[i] = 1;

  for (int j = 0; j < 6; j++) {

 if (key[j] < key[i] || (j < i&&key[j] == key[i])) {

  zh[i]++;

 }

  }

 }

 cout << endl << "加密后的結果為:";

 int q = 0;

 for (int g = 0; g <= j; g++)

  for (int h = 0; h < 6; h++, q++)

  {

 b[g][h] = a[g][zh[h] - 1];

 //明文進行置換

 bb[q] = b[g][h];

 cout << bb[q];

  }

 return 0; }

 int ISD_zhihuan_decrypt()

 {

  int ss[6] = { 1,2,3,4,5,6 };

  for (int w = 0; w<6; w++)

  {

 for (int p = 0; p<6; p++)

 {

  if (ss[w] == zh[p])

 zh1[w] = p + 1;

  //計算逆置換表

 }

  }

  cout << endl << "解密后的結果為:";

 int

 t = 0;

  for (int g = 0; g <= j; g++)

 for (int h = 0; h<6; h++, t++)

 {

  c[g][h] = b[g][zh1[h] - 1];

  //明文進行逆置換

  mw[t] = c[g][h];

 }

  return 0;

 }

  void

  main()

 {

  cout << endl;

  cout << "請輸入明文:";

  int k = 0;

  cin >> m;

  while (m[k] != "\0")

 //計算明文長度

 k++;

 len = k;

  cout << "明文長度len=" << len << endl;

  ISD_zhihuan_zhihuan(len);

  ISD_zhihuan_encrypt();

  ISD_zhihuan_decrypt();

  for (int d = 0; d<len + 6; d++)

 cout << mw[d];

  //輸出解密后的明文

  int y, yy;

  for (yy = 0; yy<len; yy++)

  {

 if (mw[yy] == m[yy])

  y = 1;

 else

  y = 0;

  }

  if (y = 1)

 cout << endl << "CRYPT_OK" << endl;

  if (y = 0)

 cout << endl << "CRYPT_ERROR" << endl;

 }

  九、 實驗結果及分析:

 測試修改后的程序,結果正確,如下圖所示:

  下面對結果進行分析:

 對于輸入的密鑰 miaooh 計算每個字符的加密置換表值為 4 3 1 5 6 2 因此可獲得加密結果為 evlyao 驗證輸出結果正確 計算每個字符的解密置換表值為 3 6 2 1 4 5 因此可獲得解密結果為 loveya

 十、 實驗結論:

 置換密碼作為傳統古典密碼的一種,思想比較簡單,即將明文按照密鑰的長度一行一行地寫成一個矩陣,然后每一行按密鑰的順序將明文讀出獲得的即為加密文。但是由于置換密碼只是將明文簡單地作順序改變,字符并沒有變化,因此破譯起來比較容易,安全性較低。

 十一、 總結心得體會

 作為第一個實驗,熟悉了實驗的操作環境,并學會了置換密碼的原理,嘗試對明文進行加密并將其解密。通過查看程序源碼對加密方法了解更加透徹,在將源碼進行修改后解決了密鑰中包含相同字符結果出錯的問題,收獲很大,為以后其他加密算法的學習作準備。

 實

 驗

 報

 告

 學生姓名 李昕宜 學號 201500130052 指導老師

 實驗地點 N3 實驗時間 2018/3/19 班級 一班

 一、 實驗室名稱:

 SimpleSPC 信息安全云實驗系統 二、 實驗項目名稱:

 古典密碼——Vigenere 密碼 三、 實驗學時:

 1 學時 四、 實驗原理:

 1)

 算法原理

 a) Vigenere 密碼是由法國密碼學家 Blaise de Vigenere 于 1858 年提出的一種代換密碼,它是多表代換密碼的典型代表。

 b) 定義:設 m 為某一固定的正整數,P、C 和 K 分別為明文空間、密文空間和密鑰空間,并且 P=K=C=(Z26)m,對一個密鑰 k=(k1,k2,…,km),定義維吉尼亞密碼的加解密算法如下:

 Vigenere 密碼加密算法:

 ek(x1,x2,…,xm)=(x1+k1,x2+k2,…,xm+km)

 Vigenere 密碼解密算法:

 dk(y1,y2,…,ym)=(y1-k1,y2-k2,…,ym-km)。

 其中 k=(k1,k2,…,km)是一個長為 m 的密鑰字,密鑰空間的大小為 26m,所以對一個相對小的 m,窮舉密鑰也需要很長的時間。如 m=7,則密鑰空間大小超過 8×109,所以手工搜索非常困難。當明文的長度超過 m 時,可將明文串按長度 m分局,然后對每一組使用密鑰 k 加密。

 2) 算法參數

 Vigenere 密碼算法主要有 c、m、k 三個個參數。c 為密文,m 是明文,k 為密鑰。

 3) 算法流程

 算法流程如下。如圖所示

  五、 實驗目的:

 1)

 學習維吉尼亞算法的原理

 2)

 學習維吉尼亞算法的實現

 六、 實驗內容:

 1.在虛擬機上運行 Vigenere.exe 可執行文件,根據提示輸入明文和密鑰,同時檢查輸出的解密后的結果是否與明文一致。

 2.學習掌握維吉尼亞算法的原理,并根據明文和密鑰計算出對應的加密文,并與程序輸出的結果進行比對,掌握其加密解密的過程。

 3.看懂實驗程序代碼,如有需要可在其上進行優化。

 七、 實驗器材(設備、虛擬機名稱):

 Windows 7

 工具:C:\tools\密碼學課程\01 密碼學算法\02 古典密碼\03 vigenere 密碼算法

 八、 實驗步驟:

 一、查看維吉尼亞密碼算法運行結果并學習其核心算法

 1.1

 點擊文件【Vigenere.exe】,輸入指令【v】,輸入明文【xipuyangguang】,即可得到密鑰和密文和明文,如圖 1 所示

 圖 1

 1.2

 維吉尼亞密碼的核心算法如下所示。

 根據實驗中已給代碼進行分析了解了維吉尼亞密碼的實現步驟,將主程序中沒有用到的生命變量去掉,加入一些交互語句得到如下代碼:

 #include <ctype.h> #include <stdio.h> #include <conio.h> #include <string.h> #include <iostream> using namespace std; void ISD_Vigenere_crypt(char m[], char k[], char r[]) {

 int i, j, s = 0;

 j = strlen(k);

 for (i = 0; m[i]; i++)

  m[i] = tolower(m[i]);

 for (i = 0; k[i]; i++)

  k[i] = tolower(k[i]);

 for (i = 0; m[i]; i++)

  if (isalpha(m[i]))

  {

 r[i] = (m[i] - "a" + k[s%j] - "a") % 26 + "a";

  s++;

 /*s用來跳過明文中的空格字符*/

  }

  else

 r[i] = m[i];

 r[i] = 0;

 /*密文字符串結束符*/ } void ISD_Vigenere_decrypt(char c[], char k[], char m[]) {

 int i, j, s = 0;

 j = strlen(k);

 for (i = 0; c[i]; i++)

  c[i] = tolower(c[i]);

 for (i = 0; k[i]; i++)

  k[i] = tolower(k[i]);

 for (i = 0; c[i]; i++)

  if (isalpha(c[i]))

  {

 m[i] = (c[i] - k[s%j] + 26) % 26 + "a";

 s++;

  }

  else

 m[i] = c[i];

 m[i] = 0; } void main(int argc, char *argv[]) {

 char m[1024];

 printf("古典密碼算法演示程序");

 char command;

 printf("\n");

 cout << "輸入v:維吉尼亞加密!\n";

 cout << "輸入h:獲得幫助!\n";

 cout << "輸入e:退出程序!\n";

 cout << "請輸入指令:"; loop: cin >> command;

 switch

  (command)

 {

  case "v":

  {

 char k[] = "best";

  cout<< "\ninput plain text:";

 cin>>m;

 char c[80];

 char d[80];

 ISD_Vigenere_crypt(m, k, c);

 ISD_Vigenere_decrypt(c, k, d);

 cout << "明文:

 ";

 puts(m);

 cout << "密鑰:

 ";

 puts(k);

 cout << "加密結果:

 ";

 puts(c);

 cout << "解密結果:

 ";

 puts(d);

 goto loop;

  }

  case "e":

  {

 return;

  }

  case "h":

  ;

  {

 cout << "輸入v:維吉尼亞加密!\n";

 cout << "輸入h:獲得幫助!\n";

 cout << "輸入e:退出程序!\n";

 goto loop;

  }

  default:

 goto loop;

 } }

 九、 實驗結果及分析:

 測試程序,結果正確,如下圖所示:

  明文 nomo

 reco

 unti

 ngdo

 llar

 s 密鑰 be s t

 best

 best

 best

 best

 b 加密 os eh

 siuh

  vrlb

 okvh mpsk

 t 解密 nomo

 reco

 unti

 ngdo

 llar

 s 驗證結果與輸出一致,正確

 十、 實驗結論:

 維吉尼亞密碼加密方法是根據密鑰內容,對輸入的明文的字母進行替換,在密鑰長度大于 1 的情況下,通常來說相同的字母也會由于對應的密鑰字符不同而被不同的字符所替換,因此在一定程度上來說保證了加密技術的安全性,但是若已知密鑰的長度且有足夠多樣本的情況下,同樣也可以做詞頻分析從而破譯密碼。

 十一、 總結及心得體會

 維吉尼亞密碼作為古典密碼中的一種,加密原理簡單易懂,程序實現也沒有太大的困難,并且在密鑰長度較長時加密安全性也可以有一定保證,較難破譯,但用頻率分析法可以破譯已知密鑰長度的密文,因此對于現代技術來說容易破譯,但通過學習維吉尼亞密碼學到了其加密的原理和基于統計破譯密碼的思想,收獲很大。

 實

 驗

 報

 告

 學生姓名 李昕宜 學號 201500130052 指導老師

 實驗地點 N3 實驗時間 2018/3/20 班級 一班

 一、 實驗室名稱:

 SimpleSPC 信息安全云實驗系統 二、 實驗項目名稱:

 古典密碼——代換密碼 三、 實驗學時:

 1 學時 四、 實驗原理:

 1) 單表代換密碼

 a) 加法密碼

 A 和 B 是有 n 個字母的字母表。

 定義一個由 A 到 B 的映射:f:A→B

 f(ai )= bi=aj

 j=i+k mod n

 加法密碼是用明文字母在字母表中后面第 k 個字母來代替。

 K=3 時是著名的凱撒密碼。

 愷撒密碼——歷史上第一個密碼技術

 “愷撒密碼”是古羅馬愷撒大帝在營救西塞羅戰役時用來保護重要軍情的加密系統(《高盧戰記》)。

 b) 乘法密碼

  A 和 B 是有 n 個字母的字母表。?定義一個由 A 到 B 的映射:f:A→B f(ai )= bi= aj j=ik mod n 其中,(n,k)=1。注意:只有(n,k)=1,才能正確解密。

 c) 密鑰詞組代替密碼

 隨機選一個詞語,去掉其中的重復字母,寫到矩陣的第一行,從明文字母表中去掉這第一行的字母,其余字母順序寫入矩陣。然后按列取出字母構成密文字母表

 2) 多表代換密碼

 單表代替密碼的安全性不高,一個原因是一個明文字母只由一個密文字母代替。可以利用頻率分析來破譯。故產生了更為安全的多表代換密碼,即構造多個密文字母表,在密鑰的控制下用以一系列代換表依次對明文消息的字母序列進行代換。著名的多表代替密碼有 Vigenere 密碼等。

 a) Vernam 密碼

 明文、密文、密鑰都表示為二進制位:

 M=m1,m2,… ,mn K =k1,k2,… ,kn C =c1,c2,… ,cn

 b) Playfair 密碼

 用密鑰控制生成矩陣,然后每兩個字母為單位進行代換。

 c) Hill 密碼(乘積密碼)

 建立在矩陣相乘的基礎上,但不能抵抗已知明文攻擊。

 五、 實驗目的:

 1)

 學習代換密碼的原理

 2)

 學習代換密碼的算法實現

 六、 實驗內容:

 1.在虛擬機上運行代換密碼.exe 可執行文件,根據提示輸入明文和密鑰,同時輸入之前得到的密文和密鑰檢查輸出的解密后的結果是否與明文一致。

  2.學習掌握代換密碼的基本思想,了解其分類和不同代換密碼之間的區別與共同點,并根據明文和密鑰計算出對應的加密文,并與程序輸出的結果進行比對,掌握其加密解密的過程。

 3.看懂實驗程序代碼,如有需要可在其上進行優化。

 七、 實驗器材(設備、虛擬機名稱):

 Window 7

 工具:C:\tools\密碼學課程\01 密碼學算法\02 古典密碼\04 代換密碼

 八、 實驗步驟:

 一、查看代換密碼算法運行結果并學習核心算法

 1.1

 運行可執行程序,結果如下(注意:這里輸入的字符串位數最多不超過 5個)。如圖 1 所示

 圖 1

 1.2 源碼閱讀 在實驗中發現提供的源碼和代換密碼.exe 文件無法對應,因此我根據可執行文件進行試驗觀察發現,程序是將待加密明文中的每一個字符的 ASCII 碼與密鑰的值相加,加密結果就是 ASCII 碼和對應的字符,根據這個思路寫的程序如下所示:

 #include <string> #include <iostream> using namespace std; int main()

 {

 cout << "請輸入待加密的明文:" << endl;

 string m;

 char c[10]="";

 int k;

 cin >> m;

 cout << "請輸入密鑰:"<<endl;

 cin >> k;

 int i = 0;

 for (; i < m.length(); i++) {

  c[i] = m[i] + k;

 }

 c[i] = "\n";

 cout <<"密文為:"<<endl<< c << endl<<"請輸入待解密的密文:"<<endl;

 string com;

 cin >> com;

 cout << "請輸入密鑰:" << endl;

 cin >> k;

 cout << "解密后的明文為:" << endl;

 char ming[10]="";

 i = 0;

 for (; i < com.length(); i++) {

  ming[i] = c[i] - k;

 }

 ming[i] = "\n";

 cout << ming << endl;

 return 0; }

  九、 實驗結果及分析:

 測試修改后的程序,結果正確,如下圖所示:

 ‘d’+20=’x’ ‘b’+20=’v’ ‘c’+20=’w’ ‘a’+20=’u’

 十、 實驗結論:

 在本次實驗中了解到代換密碼分為單表代換密碼和多表代換密碼,其中多表代換密碼中由于用多個代換表進行加密,因此安全性要比單表代換密碼更強。代換密碼的思想是要首先建立一個代換表(即密鑰),加密時需要將加密的明文依次通過查表,替換為相應的字符,明文字符被逐個替換后生成密文,需要注意的是將代換密碼和置換密碼進行區分,置換密碼只是更換明文中字符的順序,只是進行位置的置換。而之前學到的維吉尼亞密碼是代換密碼的一種。

 十一、 總結及心得體會:

 本次實驗中接觸到的代換密碼我們已經很熟悉了,因為維吉尼亞密碼是多表代換中重要的一種,同時我們還需要將其和之前學到的置換密碼區分開,實驗中發現,若將多表代換密碼的技術和置換密碼的技術結合起來得到的加密技術的安全性應該有很高的保證。

 實

 驗

 報

 告

 學生姓名 李昕宜 學號 201500130052 指導老師

 實驗地點 N3 實驗時間 2018/3/20 班級 一班

 一、 實驗室名稱:

 SimpleSPC 信息安全云實驗系統 二、 實驗項目名稱:

 古典密碼——移位密碼 三、 實驗學時:

 1 學時 四、 實驗原理:

 1) 算法原理

 a) 移位密碼就是對 26 個字母進行移位操作,可以移動任意位數,這樣就實現了對明文的加密,移位操作簡單易行,因此,加密解密比較簡單。

 b) 移位密碼的基本思想:移位密碼算法 c=m+k(mod 26),k 可以使 0<k<26 的任意整數。加密算法:x=x+k(mod26),解密算法 x=x-k(mod 26)。當 K=3,時,為凱撒密碼。

 2) 算法參數

 移位密碼算法主要有 c、m、k 三個參數。c 為密文,m 是明文,k 為密鑰。

 3) 算法流程

 算法流程如下。如圖所示

 五、 實驗目的:

 1)

 學習移位密碼的原理

 2)

 學習移密碼的實現

 六、 實驗內容:

 1.在虛擬機上運行移位密碼.exe 可執行文件,根據提示輸入明文和密鑰,同時檢查輸出的解密后的結果是否與明文一致。

 2.學習掌握移位密碼的原理,并根據明文和密鑰計算出對應的加密文,并與程序輸出的結果進行比對,掌握其加密解密的過程。

 3.看懂實驗程序代碼,如有需要可在其上進行優化。

 七、 實驗器材(設備、虛擬機名稱):

 Windows 7

 工具:C:\tools\密碼學課程\01 密碼學算法\02 古典密碼\06 移位密碼算法

 八、 實驗步驟:

 一、查看移位密碼算法運行結果并學習核心算法

 1.1 點擊【移位密碼.exe】,選擇【0】對明文進行加密。如圖 1 所示

 圖 1

 1.2 重新運行程序,選擇【1】,對密文進行解密。如圖 2 所示

  圖 2

 1.3 移位密碼的核心算法如下所示。

 //#include "stdafx.h" #include <iostream> #include "conio.h" #include <string> using namespace std; void ISD_yiwei_Secret(string &code, int k) {

 int i;

 for (i = 0; i<code.length(); i++)

 {

  if ((code[i] + k)>"z")

  {

 code[i] = ((code[i] + k) % "z") + "a" - 1;

  }

  else

  {

 code[i] = code[i] + k;

 }

  code[i] = code[i] - 32;

 } } void ISD_yiwei_Public(string &code, int k) {

 int i;

 for (i = 0; i<code.length(); i++)

 {

  if ((code[i] - k)<"A")

  {

 code[i] = "Z" - ("A" - (code[i] - k)) + 1;

  }

  else

  {

 code[i] = code[i] - k;

  }

  code[i] = code[i] + 32;

 } } int main() {

 int k;

 string code;

 cout << "請選擇 \n移位加密:0 , 解密 : 1 : ";

  int n;

 cin >> n;

 switch (n)

 {

  case 0:

  cout << "\n請輸入密匙(0 ~ 26), k = ";

 cin >> k;

  cout << "\n請輸入原文:" << endl;

  cin >> code;

  ISD_yiwei_Secret(code, k);

  cout << "\n密文為:\n" << code << endl;

  break;

  case 1:

  cout << "\n請輸入密文:" << endl;

  cin >> code;

  cout << "\n請輸入密匙(0 ~ 26), k = ";

  cin >> k;

  ISD_yiwei_Public(code, k);

  cout << "\n原文為:\n" << code << endl;

 break;

  default:

 cerr << "輸入錯誤! \n";

 }

 while (!_kbhit());

 return 0; }

 九、 實驗結果及分析:

  測試修改后的程序,結果正確,如下圖所示:

 在加密過程中對于每個字符進行(ASCII 值+13)%26+’A’的計算,可證明加密結果正確。同樣解密過程中上式加號變減號,且轉換為對應字母的小寫字母,可以驗證結果正確。程序無誤。

 十、 實驗結論:

 移位密碼實際上是代換密碼的一個特例,其思想比較簡單,密鑰空間較小,屬于單表代換密碼,即每個字符對應的加密字符都是固定對應的,實現起來也比較簡單,可對字符的 ASCII 碼值進行操作得到加密的結果。

 十一、 總結及心得體會:

 移位密碼中的凱撒密碼是我們之前已熟悉的經典古典密碼之一,移位密碼的思想實在凱撒密碼的基礎上進行了擴展,但思想仍比較簡單,其加密和解密都比較容易實現,通過讀程序源碼對算法的原理有了更深的理解。

推薦訪問: 古典 密碼 實驗

【古典密碼實驗報告】相關推薦

工作總結最新推薦

NEW