本文概述
- C ++
- Java
- 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
此方法要注意的几点:
- 所有消息均以大写形式编码。
- 尽管可以在其中输入空格, 但关键字中并未考虑空格, 特殊字符和数字。
- 在加密消息时, 空格, 特殊字符和数字不受影响。
// 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。你可以考虑大写, 小写和数字。
攻击关键字密码的方法:在不知道的情况下攻击关键字密码的最佳方法
关键字是通过已知的明文攻击、频率分析和发现关键字(通常密码分析人员会结合这三种技术)。关键字发现允许立即解密,因为可以立即创建表。
如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请写评论。
推荐阅读
- C语言中的scanset是什么(如何使用?)
- 算法(如何打印字符串的所有子序列())
- PHP IntlChar charFromName()函数如何使用(示例)
- C++中的析构函数可以私有吗(私有析构函数如何使用?)
- win7系统32位最新推荐
- windows7sp1原版最新推荐
- 系统之家windows7系统gho镜像最新推荐
- win xp sp3纯净版最新推荐
- win7旗舰版iso系统最新推荐