經(jīng)典密碼學(xué)——行置換加密法

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

創(chuàng)新互聯(lián)是專業(yè)的淮濱網(wǎng)站建設(shè)公司,淮濱接單;提供網(wǎng)站制作、成都網(wǎng)站制作,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行淮濱網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!

 

利用這種加密方法,明文按行填寫在一個(gè)矩陣中,而明文則是以預(yù)定的順序按列讀取生成的。例如如果矩陣是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

 

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

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

例如,關(guān)鍵詞“general”有7個(gè)字母,意味著矩陣有7列。由于“a”是“general”中字母順序最低的,因此數(shù)字1放在第6列;從左往右,第一個(gè)“e”為其次,所以數(shù)字2放在第2列;第二個(gè)“e”則是使數(shù)字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 (再次強(qiáng)調(diào),空格只是為了便于觀察)

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.

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

上述的是一次加密,也可把上述密文當(dāng)做新一輪加密的明文,再次進(jìn)行行置換加密。

 

參考資料:

《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}; //標(biāo)記是否已經(jīng)被轉(zhuǎn)換為數(shù)字 
  13. int num_key[100]= {0};//把密鑰換成數(shù)字 
  14. int num[100];//臨時(shí)矩陣,存放使順序遞增的下標(biāo)序號(hào) 
  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("請輸入想生成的隨機(jī)密鑰的長度:"); 
  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隨機(jī)產(chǎ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];//臨時(shí)矩陣,為了更方便的把密文轉(zhuǎn)換出來 
  52. //這個(gè)數(shù)組必須設(shè)置為全局的,在函數(shù)中聲明的話申請內(nèi)存會(huì)出錯(cuò)!!! 
  53. void encryption() 
  54.     ///轉(zhuǎn)換:把密鑰字符串排序,變成數(shù)字 
  55.     int k=1; 
  56.     int i, j, m; 
  57.     int small;//每輪循環(huán)給"最小"的字母編號(hào)(未編號(hào)的、靠前的、序號(hào)小的字母為最小) 
  58.     for(i=0; i<l; i++) //把字母換成從1開始的數(shù)字 
  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)//沒轉(zhuǎn)換則繼續(xù) 
  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++) //忽略非字母字符,把大寫轉(zhuǎn)換為小寫 
  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");//不能整除時(shí)補(bǔ)上無效字符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()//解密函數(shù) 
  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”文件,里面必須全部是英文字母,可大小寫混雜,但是不能出現(xiàn)其他字符,如空格、回車換行、數(shù)字等。

 

文章名稱:經(jīng)典密碼學(xué)——行置換加密法
網(wǎng)頁地址:http://muchs.cn/article30/pdhiso.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣ChatGPT、營銷型網(wǎng)站建設(shè)外貿(mào)網(wǎng)站建設(shè)、云服務(wù)器、動(dòng)態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)