中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

經典密碼學——行置換加密法

發布時間:2020-07-07 11:24:56 來源:網絡 閱讀:1207 作者:rock4you 欄目:安全技術

 

很多教材上對于行置換密碼、列置換密碼的定義都不是完全相同,甚至核心思想根本不一樣。筆者就自己學習的經歷,簡單介紹一種一些教材上所謂的“行置換密碼”的算法,大家一起交流、探討。

 

利用這種加密方法,明文按行填寫在一個矩陣中,而明文則是以預定的順序按列讀取生成的。例如如果矩陣是4列5行,那么明文“encryption algorithm”(省去空格后)可以如下寫入該矩陣:

2 3 1 4
e n c r
y p t i
o n a l
g o r i
t h m s

 

按一定的順序讀取列以生成密文。

對于這個示例,如果讀取順序為遞增順序,則明文就是:“ctarm eyogt npnoh rilis”(添加空格只是為了便于觀察)。這種加密法的密鑰是列數和讀取列的順序。如果列數很多,記起來可能會比較困難,因此它可以表示成一個關鍵詞,該關鍵詞的長度等于列數,而其字母順序決定讀取列的順序。

例如,關鍵詞“general”有7個字母,意味著矩陣有7列。由于“a”是“general”中字母順序最低的,因此數字1放在第6列;從左往右,第一個“e”為其次,所以數字2放在第2列;第二個“e”則是使數字3放在第4列。最后的順序如下:

g  e  n  e  r  a  l

4  2  6  3  7  1  5

_______________________________________________________________________________________

This scheme is to write the message in a rectangle, row by row, and read the message off, column by column, but permute the order of the columns.The order of the columns then becomes the key to the algorithm.For example, 

            Key:    4   3   1   2   5   6   7

      Plaintext:    a   t   t   a   c   k   p

                    o   s   t   p   o   n   e

                    d   u   n   t   i   l   t

                    w   o   a   m   x   y   z

     Ciphertext:  ttna aptm tsuo aodw coix knly petz (再次強調,空格只是為了便于觀察)

Thus, in this example, the key is 4312567.To encrypt, start with the column that is labeled 1, in this case column 3. Write down all the letters in that column.

**************************************************************************************

上述的是一次加密,也可把上述密文當做新一輪加密的明文,再次進行行置換加密。

 

參考資料:

《Cryptography and Network Security Principles and Practice, Fifth Edition》

                                               ————William Stallings

《Classical And Contemporary Cryptology》      ————Richard Spillman

 

 

  1. //Z26上的行置換密碼 
  2. #include<stdio.h> 
  3. #include<string.h> 
  4. #include<stdlib.h> 
  5. #include<time.h> 
  6. int length;//明文長度 
  7. char plain[100000]; 
  8. char cipher[100000]; 
  9. char out[100000]; 
  10. int l;//密鑰長度 
  11. int key[100];//密鑰 
  12. int done_key[100]= {0}; //標記是否已經被轉換為數字 
  13. int num_key[100]= {0};//把密鑰換成數字 
  14. int num[100];//臨時矩陣,存放使順序遞增的下標序號 
  15. void gen();//密鑰生成算法 
  16. void encryption(); 
  17. void decryption(); 
  18. int length_str(int a[]); 
  19. int main() 
  20.     int i; 
  21.     FILE *fp; 
  22.     fp=fopen("plain.txt""r"); 
  23.     fscanf(fp, "%s", plain);//從文件讀入明文 
  24.     fclose(fp); 
  25.     length=strlen(plain); 
  26.     gen(); 
  27.     encryption(); 
  28.     printf("以上正確"); 
  29.     decryption(); 
  30.      for(i=0;i<length;i++) 
  31.     { 
  32.         printf("%c", out[i]); 
  33.     } 
  34.     return 0; 
  35.  
  36. void gen()//密鑰生成算法 
  37.     int i; 
  38.     printf("請輸入想生成的隨機密鑰的長度:"); 
  39.     scanf("%d", &l); 
  40.     srand(time(0)); 
  41.     for(i=0; i<l; i++) 
  42.     { 
  43.         key[i]=rand()%26; 
  44.     } 
  45.     printf("\n隨機產生的密鑰串為:"); 
  46.     for(i=0; i<l; i++) 
  47.     { 
  48.         printf("%c ", key[i]+97); 
  49.     } 
  50.     printf("\n\n"); 
  51. char a[50000][100];//臨時矩陣,為了更方便的把密文轉換出來 
  52. //這個數組必須設置為全局的,在函數中聲明的話申請內存會出錯!!! 
  53. void encryption() 
  54.     ///轉換:把密鑰字符串排序,變成數字 
  55.     int k=1; 
  56.     int i, j, m; 
  57.     int small;//每輪循環給"最小"的字母編號(未編號的、靠前的、序號小的字母為最小) 
  58.     for(i=0; i<l; i++) //把字母換成從1開始的數字 
  59.     { 
  60.         m=0; 
  61.         while(done_key[m]==1) 
  62.             m++; 
  63.         small=m; 
  64.         for(j=0; j<l; j++) 
  65.         { 
  66.             if(done_key[j]==0)//沒轉換則繼續 
  67.                 if(key[j]<key[small]) 
  68.                     small=j; 
  69.         } 
  70.         num_key[small]=k; 
  71.         done_key[small]=1; 
  72.         k++; 
  73.     }// 
  74.     printf("The order of the key is :\n"); 
  75.     for(i=0; i<l; i++) 
  76.     { 
  77.         printf("%d ", num_key[i]); 
  78.     } 
  79.     printf("\n"); 
  80.     for(i=0; i<length; i++) //忽略非字母字符,把大寫轉換為小寫 
  81.     { 
  82.         if(plain[i]>=65&&plain[i]<=90) 
  83.         { 
  84.             plain[i]+=32; 
  85.         } 
  86.     } 
  87.     while(length%l) 
  88.     { 
  89.         strcat(plain,"p");//不能整除時補上無效字符p 
  90.         length++; 
  91.     } 
  92.     //生成密文矩陣 
  93.     k=0; 
  94.  
  95.     for(i=0; i<length/l; i++) //行 
  96.         for(j=0; j<l; j++) //列 
  97.         { 
  98.             a[i][j]=plain[k++]; 
  99.         } 
  100.     k=0; 
  101.     for(i=0;i<l;i++)//列 
  102.     { 
  103.         for(j=0;j<l;j++) 
  104.             if(num_key[j]==i+1) 
  105.                 num[i]=j; 
  106.     } 
  107.     k=0; 
  108.     for(m=0;m<l;m++)//列 
  109.         for(j=0;j<length/l;j++)//行 
  110.             cipher[k++]=a[j][num[m]]; 
  111. char b[50000][100]; 
  112. void decryption()//解密函數 
  113.     int i, j, k; 
  114.     k=0; 
  115.     for(i=0;i<l;i++)//num[i]作為列 
  116.         for(j=0;j<length/l;j++)//行 
  117.             b[j][num[i]]=cipher[k++]; 
  118.     k=0; 
  119.     for(i=0;i<length/l;i++)//行 
  120.         for(j=0;j<l;j++)//列 
  121.             out[k++]=b[i][j]; 

 //同文件夾下需要有“plain.txt”文件,里面必須全部是英文字母,可大小寫混雜,但是不能出現其他字符,如空格、回車換行、數字等。

 

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

呈贡县| 丰宁| 山阳县| 赞皇县| 资讯| 纳雍县| 蒙山县| 长宁区| 张家口市| 东丽区| 贵定县| 兴化市| 定边县| 舒兰市| 巫山县| 和政县| 伊金霍洛旗| 柳州市| 临洮县| 承德县| 阜南县| 乐平市| 平原县| 桂阳县| 涟源市| 南川市| 阳东县| 荥经县| 云浮市| 永和县| 宝鸡市| 玉环县| 理塘县| 宁国市| 历史| 芦山县| 成安县| 南部县| 松江区| 和硕县| 灌南县|