维格内尔密码

Vigenere密码是一种加密字母文本的方法。它使用了一种简单的 多羟基取代 多字母密码是任何基于替换的密码,使用多个替换字母。原始文本的加密是使用 维格内尔广场或维格内尔桌子 .

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

例子:

Input : Plaintext :   GEEKSFORGEEKS             Keyword :  AYUSHOutput : Ciphertext :  GCYCZFMLYLEIMFor generating key, the given keyword is repeatedin 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是第二个明文字母。 更多 易于实现 可以通过将[A-Z]转换为数字[0-25]来用代数方法可视化维格纳。

EncryptionThe plaintext(P) and key(K) are added modulo 26.Ei = (Pi + Ki) mod 26DecryptionDi = (Ei - Ki + 26) mod 26

注: D 表示明文第i个字符的偏移量。比如 A. 是0和of B 是1等等。 下面是这个想法的实施。

C++

// C++ code to implement Vigenere Cipher
#include<bits/stdc++.h>
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 << "" ;
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 + "" );
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 + "" );
Console.WriteLine( "Original/Decrypted Text : "
+ originalText(cipher_text, key));
}
}
/* This code contributed by PrinciRaj1992 */


Javascript

<script>
// JavaScript code to implement Vigenere Cipher
// This function generates the key in
// a cyclic manner until it's length isi'nt
// equal to the length of original text
function generateKey(str,key)
{
key=key.split( "" );
if (str.length == key.length)
return key.join( "" );
else
{
let temp=key.length;
for (let i = 0;i<(str.length-temp) ; i++)
{
key.push(key[i % ((key).length)])
}
}
return key.join( "" );
}
// This function returns the encrypted text
// generated with the help of the key
function cipherText(str,key)
{
let cipher_text= "" ;
for (let i = 0; i < str.length; i++)
{
// converting in range 0-25
let x = (str[i].charCodeAt(0) + key[i].charCodeAt(0)) %26;
// convert into alphabets(ASCII)
x += 'A' .charCodeAt(0);
cipher_text+=String.fromCharCode(x);
}
return cipher_text;
}
// This function decrypts the encrypted text
// and returns the original text
function originalText(cipher_text,key)
{
let orig_text= "" ;
for (let i = 0 ; i < cipher_text.length ; i++)
{
// converting in range 0-25
let x = (cipher_text[i].charCodeAt(0) -
key[i].charCodeAt(0) + 26) %26;
// convert into alphabets(ASCII)
x += 'A' .charCodeAt(0);
orig_text+=String.fromCharCode(x);
}
return orig_text;
}
// This function will convert the lower
// case character to Upper case
function LowerToUpper(s)
{
let str =(s).split( "" );
for (let i = 0; i < s.length; i++)
{
if (s[i] == s[i].toLowerCase())
{
str[i] = s[i].toUpperCase();
}
}
s = str.toString();
return s;
}
// Driver code
let str = "GEEKSFORGEEKS" ;
let keyword = "AYUSH" ;
let key = generateKey(str, keyword);
let cipher_text = cipherText(str, key);
document.write( "Ciphertext : "
+ cipher_text + "<br><br>" );
document.write( "Original/Decrypted Text : "
+ originalText(cipher_text, key)+ "<br>" );
// This code is contributed by rag2127
</script>


输出

Ciphertext : GCYCZFMLYLEIMOriginal/Decrypted Text : GEEKSFORGEEKS

参考: https://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher 本文由 阿尤什·坎杜里 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 写极客。组织 或者把你的文章寄去评论-team@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。 如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享