📜  维吉尼亚密码

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

维吉尼亚密码

Vigenere Cipher 是一种加密字母文本的方法。它使用一种简单的多字母表替换形式。多字母密码是基于替换的任何密码,使用多个替换字母表。原始文本的加密是使用Vigenère square 或 Vigenère table完成的。

  • 该表由在不同行中写出 26 次的字母组成,与前一个字母相比,每个字母循环向左移动,对应于 26 种可能的凯撒密码。
  • 在加密过程的不同点,密码使用与其中一行不同的字母表。
  • 每个点使用的字母取决于重复的关键字。

例子:

Input : Plaintext :   GEEKSFORGEEKS
             Keyword :  AYUSH
Output : Ciphertext :  GCYCZFMLYLEIM
For generating key, the given keyword is repeated
in a circular manner until it matches the length of 
the plain text.
The keyword "AYUSH" generates the key "AYUSHAYUSHAYU"
The plain text is then encrypted using the process 
explained below.

加密
明文的第一个字母 G 与密钥的第一个字母 A 配对。所以使用 Vigenère 正方形的 G 行和 A 列,即 G。同样,对于明文的第二个字母,使用密钥的第二个字母,E 行的字母,Y 列的字母是 C。明文以类似的方式加密。

要加密的表 – 极客

Vigenère_square_shading


解密
解密的方法是到表中与密钥对应的行,找到该行中密文字母的位置,然后将该列的标签作为明文。例如,在 A 行(来自 AYUSH)中,密文 G 出现在 G 列中,这是第一个明文字母。接下来,我们转到 Y 行(来自 AYUSH),找到在 E 列中找到的密文 C,因此 E 是第二个明文字母。
一个更简单的实现可能是通过将 [AZ] 转换为数字 [0-25] 以代数方式可视化 Vigenère。

Encryption
The plaintext(P) and key(K) are added modulo 26.
Ei = (Pi + Ki) mod 26

Decryption
Di = (Ei - Ki + 26) mod 26

注: D i表示明文第 i 个字符的偏移量。就像A的偏移量是 0 而B的偏移量是 1 等等。
下面是这个想法的实现。

C++
// C++ code to implement Vigenere Cipher
#include
using namespace std;
 
// This function generates the key in
// a cyclic manner until it's length isi'nt
// equal to the length of original text
string generateKey(string str, string key)
{
    int x = str.size();
 
    for (int i = 0; ; i++)
    {
        if (x == i)
            i = 0;
        if (key.size() == str.size())
            break;
        key.push_back(key[i]);
    }
    return key;
}
 
// This function returns the encrypted text
// generated with the help of the key
string cipherText(string str, string key)
{
    string cipher_text;
 
    for (int i = 0; i < str.size(); i++)
    {
        // converting in range 0-25
        char x = (str[i] + key[i]) %26;
 
        // convert into alphabets(ASCII)
        x += 'A';
 
        cipher_text.push_back(x);
    }
    return cipher_text;
}
 
// This function decrypts the encrypted text
// and returns the original text
string originalText(string cipher_text, string key)
{
    string orig_text;
 
    for (int i = 0 ; i < cipher_text.size(); i++)
    {
        // converting in range 0-25
        char x = (cipher_text[i] - key[i] + 26) %26;
 
        // convert into alphabets(ASCII)
        x += 'A';
        orig_text.push_back(x);
    }
    return orig_text;
}
 
// Driver program to test the above function
int main()
{
    string str = "GEEKSFORGEEKS";
    string keyword = "AYUSH";
 
    string key = generateKey(str, keyword);
    string cipher_text = cipherText(str, key);
 
    cout << "Ciphertext : "
         << cipher_text << "\n";
 
    cout << "Original/Decrypted Text : "
         << originalText(cipher_text, key);
    return 0;
}


Java
// Java code to implement Vigenere Cipher
 
class GFG
{
 
// This function generates the key in
// a cyclic manner until it's length isi'nt
// equal to the length of original text
static String generateKey(String str, String key)
{
    int x = str.length();
 
    for (int i = 0; ; i++)
    {
        if (x == i)
            i = 0;
        if (key.length() == str.length())
            break;
        key+=(key.charAt(i));
    }
    return key;
}
 
// This function returns the encrypted text
// generated with the help of the key
static String cipherText(String str, String key)
{
    String cipher_text="";
 
    for (int i = 0; i < str.length(); i++)
    {
        // converting in range 0-25
        int x = (str.charAt(i) + key.charAt(i)) %26;
 
        // convert into alphabets(ASCII)
        x += 'A';
 
        cipher_text+=(char)(x);
    }
    return cipher_text;
}
 
// This function decrypts the encrypted text
// and returns the original text
static String originalText(String cipher_text, String key)
{
    String orig_text="";
 
    for (int i = 0 ; i < cipher_text.length() &&
                            i < key.length(); i++)
    {
        // converting in range 0-25
        int x = (cipher_text.charAt(i) -
                    key.charAt(i) + 26) %26;
 
        // convert into alphabets(ASCII)
        x += 'A';
        orig_text+=(char)(x);
    }
    return orig_text;
}
 
// This function will convert the lower case character to Upper case
static String LowerToUpper(String s)
{
    StringBuffer str =new StringBuffer(s);
    for(int i = 0; i < s.length(); i++)
    {
        if(Character.isLowerCase(s.charAt(i)))
        {
            str.setCharAt(i, Character.toUpperCase(s.charAt(i)));
        }
    }
    s = str.toString();
    return s;
}
 
// Driver code
public static void main(String[] args)
{
    String Str = "GEEKSFORGEEKS";
    String Keyword = "AYUSH";
       
      String str = LowerToUpper(Str);
      String keyword = LowerToUpper(Keyword);
 
    String key = generateKey(str, keyword);
    String cipher_text = cipherText(str, key);
 
    System.out.println("Ciphertext : "
        + cipher_text + "\n");
 
    System.out.println("Original/Decrypted Text : "
        + originalText(cipher_text, key));
    }
}
 
// This code has been contributed by 29AjayKumar


Python3
# Python code to implement
# Vigenere Cipher
 
# This function generates the
# key in a cyclic manner until
# it's length isn't equal to
# the length of original text
def generateKey(string, key):
    key = list(key)
    if len(string) == len(key):
        return(key)
    else:
        for i in range(len(string) -
                       len(key)):
            key.append(key[i % len(key)])
    return("" . join(key))
     
# This function returns the
# encrypted text generated
# with the help of the key
def cipherText(string, key):
    cipher_text = []
    for i in range(len(string)):
        x = (ord(string[i]) +
             ord(key[i])) % 26
        x += ord('A')
        cipher_text.append(chr(x))
    return("" . join(cipher_text))
     
# This function decrypts the
# encrypted text and returns
# the original text
def originalText(cipher_text, key):
    orig_text = []
    for i in range(len(cipher_text)):
        x = (ord(cipher_text[i]) -
             ord(key[i]) + 26) % 26
        x += ord('A')
        orig_text.append(chr(x))
    return("" . join(orig_text))
     
# Driver code
if __name__ == "__main__":
    string = "GEEKSFORGEEKS"
    keyword = "AYUSH"
    key = generateKey(string, keyword)
    cipher_text = cipherText(string,key)
    print("Ciphertext :", cipher_text)
    print("Original/Decrypted Text :",
           originalText(cipher_text, key))
 
# This code is contributed
# by Pratik Somwanshi


C#
// C# code to implement Vigenere Cipher
using System;
     
class GFG
{
 
// This function generates the key in
// a cyclic manner until it's length isi'nt
// equal to the length of original text
static String generateKey(String str, String key)
{
    int x = str.Length;
 
    for (int i = 0; ; i++)
    {
        if (x == i)
            i = 0;
        if (key.Length == str.Length)
            break;
        key+=(key[i]);
    }
    return key;
}
 
// This function returns the encrypted text
// generated with the help of the key
static String cipherText(String str, String key)
{
    String cipher_text="";
 
    for (int i = 0; i < str.Length; i++)
    {
        // converting in range 0-25
        int x = (str[i] + key[i]) %26;
 
        // convert into alphabets(ASCII)
        x += 'A';
 
        cipher_text+=(char)(x);
    }
    return cipher_text;
}
 
// This function decrypts the encrypted text
// and returns the original text
static String originalText(String cipher_text, String key)
{
    String orig_text="";
 
    for (int i = 0 ; i < cipher_text.Length &&
                            i < key.Length; i++)
    {
        // converting in range 0-25
        int x = (cipher_text[i] -
                    key[i] + 26) %26;
 
        // convert into alphabets(ASCII)
        x += 'A';
        orig_text+=(char)(x);
    }
    return orig_text;
}
 
// Driver code
public static void Main(String[] args)
{
    String str = "GEEKSFORGEEKS";
    String keyword = "AYUSH";
 
    String key = generateKey(str, keyword);
    String cipher_text = cipherText(str, key);
 
    Console.WriteLine("Ciphertext : "
        + cipher_text + "\n");
 
    Console.WriteLine("Original/Decrypted Text : "
        + originalText(cipher_text, key));
    }
}
 
/* This code contributed by PrinciRaj1992 */


Javascript


输出
Ciphertext : GCYCZFMLYLEIM
Original/Decrypted Text : GEEKSFORGEEKS