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

本文概述

  • C ++
  • Java
  • C#
关键字密码是单字母替换的一种形式。使用关键字作为密钥,它确定密码字母表与普通字母表的字母匹配。去掉单词中重复的字母,然后用与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 DTOTTake 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 DTOTInput : 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 cipherclass 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 HEREInput : 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。你可以考虑大写, 小写和数字。
攻击关键字密码的方法:在不知道的情况下攻击关键字密码的最佳方法
关键字是通过已知的明文攻击、频率分析和发现关键字(通常密码分析人员会结合这三种技术)。关键字发现允许立即解密,因为可以立即创建表。
如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请写评论。

    推荐阅读