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