Vigenere密码是一种加密字母文本的方法。它使用了一种简单的 多羟基取代 多字母密码是任何基于替换的密码,使用多个替换字母。原始文本的加密是使用 维格内尔广场或维格内尔桌子 .
- 该表由不同行中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。其余明文以类似的方式加密。
要加密的表-极客
解密 解密是通过转到表中与密钥对应的行,找到密文字母在该行中的位置,然后使用列的标签作为明文来执行的。例如,在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主页上,并帮助其他极客。 如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。