算法设计:如何理解和实现关键字密码?

2021年3月19日13:02:54 发表评论 1,226 次浏览

本文概述

关键字密码单字母替换的一种形式。使用关键字作为密钥,它确定密码字母表与普通字母表的字母匹配。去掉单词中重复的字母,然后用与A、B、C等匹配的关键字生成密码字母表,直到关键字用完,然后其余的密文字母按字母顺序使用,不包括那些已经在密钥中使用的。

加密

输入的第一行包含你要输入的关键字。输入的第二行包含你必须加密的字符串。

纯文本 :

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

加密:

K R Y P T O S A B C D E F G H I J L M N Q U V W X Z

使用KRYPTOS作为关键字, 所有的As变为K, 所有的B变为R, 依此类推。使用关键字" kryptos"对消息"知识就是力量"进行加密:

加密消息:Knowledge is Power

编码的消息:IlmWjbaEb gq NmWbp

例子:

Input :
Keyword : secret
Message : Zombie Here
Output :
Ciphered String : ZLJEFT DTOT

Take the first example, we used "secret" keyword there.
Plain Text : A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
When "secret" keyword is used, the new encypting text becomes :
Encrypting : S E C R T A B D F G H I J K L M N O P Q U V W X Y Z
This means 'A' means 'S', 'B' means 'E' and 'C' means 'C' and so on.
Lets encode the given message "Zombie Here"
ZOMBIE HERE becomes ZLJEFT DTOT

Input :
Keyword : Star War
Message : Attack at dawn
Output :
Ciphered String : SPPSAG SP RSVJ

此方法要注意的几点:

  • 所有消息均以大写形式编码。
  • 尽管可以在其中输入空格, 但关键字中并未考虑空格, 特殊字符和数字。
  • 在加密消息时, 空格, 特殊字符和数字不受影响。

C ++

// CPP program for encoding the string
// using classical cipher
  
#include<bits/stdc++.h>
using namespace std;
  
// Function generates the encoded text
string encoder(string key)
{
     string encoded = "" ;
     // This array represents the
     // 26 letters of alphabets
     bool arr[26] = {0};
  
     // This loop inserts the keyword
     // at the start of the encoded string
     for ( int i=0; i<key.size(); i++)
     {
         if (key[i] >= 'A' && key[i] <= 'Z' )
         {
             // To check whether the character is inserted
             // earlier in the encoded string or not
             if (arr[key[i]-65] == 0)
             {
                 encoded += key[i];
                 arr[key[i]-65] = 1;
             }
         }
         else if (key[i] >= 'a' && key[i] <= 'z' )
         {
             if (arr[key[i]-97] == 0)
             {
                 encoded += key[i] - 32;
                 arr[key[i]-97] = 1;
             }
         }
     }
  
     // This loop inserts the remaining
     // characters in the encoded string.
     for ( int i=0; i<26; i++)
     {
         if (arr[i] == 0)
         {
             arr[i]=1;
             encoded += char (i + 65);
         }
     }
     return encoded;
}
  
// Function that generates encodes(cipher) the message
string cipheredIt(string msg, string encoded)
{
     string cipher= "" ;
  
     // This loop ciphered the message.
     // Spaces, special characters and numbers remain same.
     for ( int i=0; i<msg.size(); i++)
     {
         if (msg[i] >= 'a' && msg[i] <= 'z' )
         {
             int pos = msg[i] - 97;
             cipher += encoded[pos];
         }
         else if (msg[i] >= 'A' && msg[i] <= 'Z' )
         {
             int pos = msg[i] - 65;
             cipher += encoded[pos];
         }
         else
         {
             cipher += msg[i];
         }
     }
     return cipher;
}
  
// Driver code
int main()
{
     // Hold the Keyword
     string key;
     key = "Computer" ;
     cout << "Keyword : " <<key << endl;
  
     // Function call to generate encoded text
     string encoded = encoder(key);
  
     // Message that need to encode
     string message = "lsbin" ;
     cout << "Message before Ciphering : " << message << endl;
  
     // Function call to print ciphered text
     cout << "Ciphered Text : " << cipheredIt(message, encoded) << endl;
  
     return 0;
}

Java

// Java program for encoding the string
// using classical cipher
  
class GFG 
{
  
     // Function generates the encoded text
     static String encoder( char [] key) 
     {
         String encoded = "" ;
          
         // This array represents the
         // 26 letters of alphabets
         boolean [] arr = new boolean [ 26 ];
  
         // This loop inserts the keyword
         // at the start of the encoded string
         for ( int i = 0 ; i < key.length; i++) 
         {
             if (key[i] >= 'A' && key[i] <= 'Z' )
             {
                 // To check whether the character is inserted
                 // earlier in the encoded string or not
                 if (arr[key[i] - 65 ] == false ) 
                 {
                     encoded += ( char ) key[i];
                     arr[key[i] - 65 ] = true ;
                 }
             } 
             else if (key[i] >= 'a' && key[i] <= 'z' ) 
             {
                 if (arr[key[i] - 97 ] == false )
                 {
                     encoded += ( char ) (key[i] - 32 );
                     arr[key[i] - 97 ] = true ;
                 }
             }
         }
  
         // This loop inserts the remaining
         // characters in the encoded string.
         for ( int i = 0 ; i < 26 ; i++) 
         {
             if (arr[i] == false )
             {
                 arr[i] = true ;
                 encoded += ( char ) (i + 65 );
             }
         }
         return encoded;
     }
  
     // Function that generates encodes(cipher) the message
     static String cipheredIt(String msg, String encoded)
     {
         String cipher = "" ;
  
         // This loop ciphered the message.
         // Spaces, special characters and numbers remain same.
         for ( int i = 0 ; i < msg.length(); i++)
         {
             if (msg.charAt(i) >= 'a' && msg.charAt(i) <= 'z' )
             {
                 int pos = msg.charAt(i) - 97 ;
                 cipher += encoded.charAt(pos);
             }
             else if (msg.charAt(i) >= 'A' && msg.charAt(i) <= 'Z' )
             {
                 int pos = msg.charAt(i) - 65 ;
                 cipher += encoded.charAt(pos);
             }
             else
             {
                 cipher += msg.charAt(i);
             }
         }
         return cipher;
     }
  
     // Driver code
     public static void main(String[] args)
     {
         // Hold the Keyword
         String key;
         key = "Computer" ;
         System.out.println( "Keyword : " + key);
  
         // Function call to generate encoded text
         String encoded = encoder(key.toCharArray());
  
         // Message that need to encode
         String message = "lsbin" ;
         System.out.println( "Message before Ciphering : " + message);
  
         // Function call to print ciphered text
         System.out.println( "Ciphered Text : " + cipheredIt(message, encoded));
     }
}
  
// This code is contributed by 29AjayKumar

C#

// C# program for encoding the string
// using classical cipher
using System;
      
class GFG 
{
  
     // Function generates the encoded text
     static String encoder( char [] key) 
     {
         String encoded = "" ;
          
         // This array represents the
         // 26 letters of alphabets
         Boolean[] arr = new Boolean[26];
  
         // This loop inserts the keyword
         // at the start of the encoded string
         for ( int i = 0; i < key.Length; i++) 
         {
             if (key[i] >= 'A' && key[i] <= 'Z' )
             {
                 // To check whether the character is inserted
                 // earlier in the encoded string or not
                 if (arr[key[i] - 65] == false ) 
                 {
                     encoded += ( char ) key[i];
                     arr[key[i] - 65] = true ;
                 }
             } 
             else if (key[i] >= 'a' && key[i] <= 'z' ) 
             {
                 if (arr[key[i] - 97] == false )
                 {
                     encoded += ( char ) (key[i] - 32);
                     arr[key[i] - 97] = true ;
                 }
             }
         }
  
         // This loop inserts the remaining
         // characters in the encoded string.
         for ( int i = 0; i < 26; i++) 
         {
             if (arr[i] == false )
             {
                 arr[i] = true ;
                 encoded += ( char ) (i + 65);
             }
         }
         return encoded;
     }
  
     // Function that generates encodes(cipher) the message
     static String cipheredIt(String msg, String encoded)
     {
         String cipher = "" ;
  
         // This loop ciphered the message.
         // Spaces, special characters and numbers remain same.
         for ( int i = 0; i < msg.Length; i++)
         {
             if (msg[i] >= 'a' && msg[i] <= 'z' )
             {
                 int pos = msg[i] - 97;
                 cipher += encoded[pos];
             }
             else if (msg[i] >= 'A' && msg[i] <= 'Z' )
             {
                 int pos = msg[i] - 65;
                 cipher += encoded[pos];
             }
             else
             {
                 cipher += msg[i];
             }
         }
         return cipher;
     }
  
     // Driver code
     public static void Main(String[] args)
     {
         // Hold the Keyword
         String key;
         key = "Computer" ;
         Console.WriteLine( "Keyword : " + key);
  
         // Function call to generate encoded text
         String encoded = encoder(key.ToCharArray());
  
         // Message that need to encode
         String message = "lsbin" ;
         Console.WriteLine( "Message before Ciphering : " + message);
  
         // Function call to print ciphered text
         Console.WriteLine( "Ciphered Text : " + cipheredIt(message, encoded));
     }
}
  
/* This code contributed by PrinciRaj1992 */

输出如下:

Keyword : Computer
Message before Ciphering : lsbin
Ciphered Text : 

解密

要解码消息, 请检查给定消息在使用纯文本加密文本中的位置。

纯文本 :A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

加密:K R Y P T O S A B C D E F G H I J L M N Q U V W X Z

消息:PTYBIATLEP

解密文字:DECIPHERED

现在, 我们如何生成解密后的字符串?

我们在"加密文本"中搜索" P", 并将其位置与纯文本字母进行比较, 然后生成该字母。因此, " P"变成" D", " T"变成" E", " Y"变成" C", 依此类推。

例子:

Input :
Keyword : secret
Message : zljeft dtOT
Output :
Deciphered String : ZOMBIE HERE

Input :
Keyword : joker0O7hack123
Message : QjTijl
Output :
Deciphered String : BATMAN
// CPP program for decoding the string
// which generate using classical cipher
  
#include<bits/stdc++.h>
using namespace std;
  
// Original Set of letters
string plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ;
  
// Function generates the encoded text
string encoder(string key)
{
     string encoded = "" ;
     bool arr[26] = {0};
  
     // This loop inserts the keyword
     // at the start of the encoded string
     for ( int i=0; i<key.size(); i++)
     {
         if (key[i] >= 'A' && key[i] <= 'Z' )
         {
             // To check whether the character is inserted
             // earlier in the encoded string or not
             if (arr[key[i]-65] == 0)
             {
                 encoded += key[i];
                 arr[key[i]-65] = 1;
             }
         }
         else if (key[i] >= 'a' && key[i] <= 'z' )
         {
             if (arr[key[i]-97] == 0)
             {
                 encoded += key[i] - 32;
                 arr[key[i]-97] = 1;
             }
         }
     }
  
     // This loop inserts the remaining
     // characters in the encoded string.
     for ( int i=0; i<26; i++)
     {
         if (arr[i] == 0)
         {
             arr[i]=1;
             encoded += char (i + 65);
         }
     }
     return encoded;
}
  
// This function will decode the message
string decipheredIt(string msg, string encoded)
{
     // Hold the position of every character (A-Z)
     // from encoded string
     map < char , int > enc;
     for ( int i=0; i<encoded.size(); i++)
     {
         enc[encoded[i]]=i;
     }
  
     string decipher= "" ;
  
     // This loop deciphered the message.
     // Spaces, special characters and numbers remain same.
     for ( int i=0; i<msg.size(); i++)
     {
         if (msg[i] >= 'a' && msg[i] <= 'z' )
         {
             int pos = enc[msg[i]-32];
             decipher += plaintext[pos];
         }
         else if (msg[i] >= 'A' && msg[i] <= 'Z' )
         {
             int pos = enc[msg[i]];
             decipher += plaintext[pos];
         }
         else
         {
             decipher += msg[i];
         }
     }
     return decipher;
}
  
// Driver code
int main()
{
     // Hold the Keyword
     string key;
     key = "Computer" ;
     cout << "Keyword : " << key << endl;
  
     // Function call to generate encoded text
     string encoded = encoder(key);
  
     // Message that need to decode
     string message = "EUUDN TIL EUUDN" ;
     cout << "Message before Deciphering : " << message << endl;
  
     // Function call to print deciphered text
     cout << "Deciphered Text : " << decipheredIt(message, encoded) << endl;
  
     return 0;
}

输出如下:

Keyword : Computer
Message before Deciphering : EUUDN TIL EUUDN
Deciphered Text : GEEKS FOR GEEKS

你可以提高这个古典密码:关键字也。在这里, 我们仅采用纯文本形式的A-Z。你可以考虑大写, 小写和数字。

攻击关键字密码的方法:在不知道的情况下攻击关键字密码的最佳方法

关键字是通过已知的明文攻击、频率分析和发现关键字(通常密码分析人员会结合这三种技术)。关键字发现允许立即解密,因为可以立即创建表。

如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请写评论。

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: