用於對單字母替換密碼進行字母頻率攻擊的程式


挑戰在於顯示五個可能的最可能的明文,這些明文可以從提供的單字母密碼中解密,利用來自表示給定單字母密碼的字串 Str(大小為 K)的字母頻率攻擊。

讓我們看看頻率攻擊到底是什麼。

頻率分析的根本基礎是,特定字母和字母組合在任何給定文字段落中出現的頻率各不相同。此外,實際上,該語言的每個樣本在字母分佈中都具有共同的模式。為了更清楚起見,

英語字母表有 26 個字母,但並非所有字母在書面英語中使用頻率都相同。某些字母的使用頻率不同。例如,如果您檢查書籍或報紙中的字母,您會注意到字母 E、T、A 和 O 在英語單詞中出現的頻率非常高。但是,英語文字很少使用字母 J、X、Q 或 Z。此事實可用於解密維吉尼亞加密訊息。術語“頻率分析”指的是此方法。

在基本的替換密碼中,明文中找到的每個字母都替換為不同的字母,並且其明文中的任何給定字元都永久地更改為密碼文字中的相同字母。例如,如果每個字母 a 都轉換為字母 X,則包含字母 Y 多次重複的密文訊息將暗示密碼分析員 Y 代表字母 a。

示例 1

讓我們取字串 T,

透過將英語字母按在英語字母表中的頻率降序排列連線起來形成的字串。

String T=ETAOINSHRDLCUMWFGYPBVKJXQZ”
Given string Str = "SGHR HR SGD BNCD";
Output:
THIS IS THE CODE
FTUE UE FTQ OAPQ
LZAK AK LZW UGVW
PDEO EO PDA YKZA
IWXH XH IWT  RDST

問題陳述

實現一個程式,對單字母替換密碼進行字母頻率攻擊。

解決方案方法

為了對單字母替換密碼進行字母頻率攻擊,我們採用以下方法。

解決此問題並對單字母替換密碼進行字母頻率攻擊的方法是應用頻率分析。

一種廣為人知的破解密文的技術或實踐就是頻率分析。它基於對不同字母或字母組合在密文中出現頻率和規律性的研究。各種字母或字母表在所有語言中以不同的速率使用。

例如,取單詞“APPLE”。字母“A”的頻率為 1,因為它只出現了一次,類似地,字母“L”的頻率為 1,字母“E”的頻率也為 1。但字母“P”的頻率為 2,因為它重複了兩次。

這就是我們找到字母頻率的方式。

考慮 26 個字母中的每一個在典型的英語文字中出現的頻率。如果我們將這些從最高頻率到最低頻率進行排序,則最常出現的字母是 E,其次是 T,然後是 A,依此類推 -

“ETAOINSHRDLCUMWFGYPBVKJXQZ”是按頻率順序排列的完整字母列表。

演算法

對單字母替換密碼進行字母頻率攻擊的演算法如下所示

  • 步驟 1 - 開始

  • 步驟 2 - 定義一個函式,使用頻率攻擊或分析方法解密單字母替換密碼

  • 步驟 3 - 儲存最終 5 個可行的解密明文

  • 步驟 4 - 儲存密文中每個字母的頻率

  • 步驟 5 - 遍歷字串 Str

  • 步驟 6 - 迭代範圍 [0, 5]

  • 步驟 7 - 迭代範圍 [0, 26]

  • 步驟 8 - 定義一個臨時字串“cur”以一次或在當前時間建立一個明文

  • 步驟 9 - 現在利用計算出的移位建立第 i 個明文

  • 步驟 10 - 將密碼的第 T 個字母移位 x

  • 步驟 11 - 將計算出的第 k 個字母新增到臨時字串 cur

  • 步驟 12 - 將輸出列印為生成的 5 個可能的明文。

  • 步驟 13 - 停止

示例:C 程式

以下是上述演算法的 C 程式實現,以便對單字母替換密碼進行字母頻率攻擊。

#include <stdio.h>
#include <string.h>
// Define a function to decrypt given monoalphabetic substitution cipher by implementing the method of frequency analysis or an attack
void printTheString(char Str[], int K){

   // this stores the final 5 feasible plaintext //which are deciphered
   char ptext[5][K+1];
   
   // the frequency of every letter in the
   // cipher text is stored
   int fre[26] = { 0 }; 
   
   // The letter frequency of the cipher text is stored in the order of descendence
   int freSorted[26]; 
   
   // this stores the used alphabet 
   int Used[26] = { 0 }; 
   
   // Traversing the given string named Str
   for (int i = 0; i < K; i++) {
      if (Str[i] != ' ') {
         fre[Str[i] - 'A']++;
      }
   } 
   
   // Copying the array of frequency
   for (int i = 0; i < 26; i++) {
      freSorted[i] = fre[i];
   } 
   
   //by concatenating the english letters in //decreasing frequency in the english alphabet , the string T is //obtained
   char T[] = "ETAOINSHRDLCUMWFGYPBVKJXQZ"; 
   
   // Sorting the array in the order of descendence
   for (int i = 0; i < 26; i++) {
      for (int j = i + 1; j < 26; j++) {
         if (freSorted[j] > freSorted[i]) {
            int temp = freSorted[i];
            freSorted[i] = freSorted[j];
            freSorted[j] = temp;
         }
      }
   } 
   
   // Iterating in the range between [0, 5]
   for (int i = 0; i < 5; i++) {
      int ch = -1; 
      
      // Iterating in the range between [0, 26]
      for (int m = 0; m < 26; m++) { 
         if (freSorted[i] == fre[m] && Used[m] == 0) {
            Used[m] = 1;
            ch = m;
            break;
         }
      }
      if (ch == -1)
         break; 
         
      //  here numerical equivalent of letter is stored ith index of array letter_frequency
      int x = T[i] - 'A'; 
      
      //  now probable shift is calculated in the monoalphabetic cipher
      x = x - ch; 
      
      // defining a temporary string cur to create one plaintext at a time or at the current time
      char cur[K+1]; 
      
      //  ith plaintext is generated by making use of the shift calculated 
      for (int T = 0; T < K; T++) { 
      
         // whitespaces is inserted without any //change
         if (Str[T] == ' ') {
            cur[T] = ' ';
            continue;
         } 
         
         // Shifting the Tth cipher letter by x we get
         int y = Str[T] - 'A';
         y =y+x; 
         if (y < 0)
            y =y+ 26;
         if (y > 25)
            y -=26; 
            
         // Adding the kth calculated letter to the temporary string cur 
         cur[T] = 'A' + y;        
      }
      cur[K] = '\0';
      
      // The ith feasible plaintext is printed
      printf("%s\n", cur);
   }
}
int main(){
   char Str[] = "SGHR HR SGD BNCD";
   int K = strlen(Str);
   printTheString(Str, K);
   return 0;
}

輸出

THIS IS THE CODE
FTUE UE FTQ OAPQ
LZAK AK LZW UGVW
PDEO EO PDA YKZA
IWXH XH IWT RDST

結論

同樣,我們可以獲得對單字母替換密碼進行字母頻率攻擊的解決方案。

本文解決了獲取對單字母替換密碼進行字母頻率攻擊的程式的挑戰。

此處提供了 C 程式設計程式碼以及對單字母替換密碼進行字母頻率攻擊的演算法。

更新於:2023 年 7 月 28 日

1K+ 次瀏覽

啟動你的 職業生涯

透過完成課程獲得認證

開始
廣告

© . All rights reserved.