📜  关键字密码

📅  最后修改于: 2022-05-13 01:57:07.823000             🧑  作者: Mango

关键字密码

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

加密

输入的第一行包含您要输入的关键字。第二行输入包含您必须加密的字符串。
明文: ABCDEFGHIJKLMNOPQRSTU VWXY Z
加密: KRYPTOSABCDEFGHIJLMNQ UVWXZ
以 KRYPTOS 为关键字,所有 As 变为 Ks,所有 Bs 变为 Rs,以此类推。使用关键字“Kryptos”加密信息“知识就是力量”:
加密信息:知识就是力量
编码消息: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 encrypting 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
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= '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='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 : " <


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 = "GeeksforGeeks";
        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 = "GeeksforGeeks";
        Console.WriteLine("Message before Ciphering : " + message);
 
        // Function call to print ciphered text
        Console.WriteLine("Ciphered Text : " + cipheredIt(message,
                encoded));
    }
}
 
/* This code contributed by PrinciRaj1992 */


Javascript


CPP
// CPP program for decoding the string
// which generate using classical cipher
 
#include
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= '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  enc;
    for(int i=0; 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 Ciphering : GeeksforGeeks
Ciphered Text : EUUDNTILEUUDN

解密

要解码消息,请检查给定消息在使用纯文本加密文本时的位置。
明文: ABCDEFGHIJKLMNOPQRSTU VWXY Z
加密: KRYPTOSABCDEFGHIJLMNQ UVWXZ
消息:PTYBIATLEP
解密文本:已解密
现在,我们如何生成解密的字符串?
我们在加密文本中搜索“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

// CPP program for decoding the string
// which generate using classical cipher
 
#include
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= '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  enc;
    for(int i=0; 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