Vigenere Cipher는 알파벳 텍스트를 암호화하는 방법입니다. 간단한 형태를 사용합니다. 다중 알파벳 대체 . 다중 알파벳 암호는 다중 치환 알파벳을 사용하는 치환을 기반으로 하는 모든 암호입니다. 원본 텍스트의 암호화는 다음을 사용하여 수행됩니다. Vigenère 광장 또는 Vigenère 테이블 .
- 테이블은 서로 다른 행에 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로 사용됩니다. 일반 텍스트의 나머지 부분도 비슷한 방식으로 암호화됩니다.
암호화할 테이블 - 긱스
해독:
해독은 키에 해당하는 테이블의 행으로 이동하여 이 행에서 암호문 문자의 위치를 찾은 다음 열의 레이블을 일반 텍스트로 사용하여 수행됩니다. 예를 들어 행 A(AYUSH의)에서 암호문 G는 첫 번째 일반 텍스트 문자인 열 G에 나타납니다. 다음으로 Y행(AYUSH에서)으로 이동하여 E열에 있는 암호문 C를 찾습니다. 따라서 E는 두 번째 일반 텍스트 문자입니다.
더 쉬운 구현 [A-Z]를 숫자 [0-25]로 변환하여 Vigenère를 대수적으로 시각화하는 것이 될 수 있습니다.
Encryption
The plaintext(P) and key(K) are added modulo 26.
Ei = (Pi + Ki) mod 26
Decryption
Di = (Ei - Ki) mod 26
메모: 디나는 일반 텍스트의 i번째 문자의 오프셋을 나타냅니다. 오프셋과 마찬가지로 에이 은 0이고 비 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 isn't // 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'; if (any_of(str.begin() str.end() ::islower)) transform(str.begin() str.end() str.begin() ::toupper); if (any_of(keyword.begin() keyword.end() ::islower)) transform(keyword.begin() keyword.end() keyword.begin() ::toupper); 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
Python def generate_key(msg key): key = list(key) if len(msg) == len(key): return key else: for i in range(len(msg) - len(key)): key.append(key[i % len(key)]) return ''.join(key) def encrypt_vigenere(msg key): encrypted_text = [] key = generate_key(msg key) for i in range(len(msg)): char = msg[i] if char.isupper(): encrypted_char = chr((ord(char) + ord(key[i]) - 2 * ord('A')) % 26 + ord('A')) elif char.islower(): encrypted_char = chr((ord(char) + ord(key[i]) - 2 * ord('a')) % 26 + ord('a')) else: encrypted_char = char encrypted_text.append(encrypted_char) return ''.join(encrypted_text) def decrypt_vigenere(msg key): decrypted_text = [] key = generate_key(msg key) for i in range(len(msg)): char = msg[i] if char.isupper(): decrypted_char = chr((ord(char) - ord(key[i]) + 26) % 26 + ord('A')) elif char.islower(): decrypted_char = chr((ord(char) - ord(key[i]) + 26) % 26 + ord('a')) else: decrypted_char = char decrypted_text.append(decrypted_char) return ''.join(decrypted_text) # Example usage text_to_encrypt = 'Hello World!' key = 'KEY' encrypted_text = encrypt_vigenere(text_to_encrypt key) print(f'Encrypted Text: {encrypted_text}') decrypted_text = decrypt_vigenere(encrypted_text key) print(f'Decrypted Text: {decrypted_text}') #previous code was only support the upper case letters #this code can be apply on both
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'; str = str.ToUpper(); keyword = keyword.ToUpper(); 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 // JavaScript 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 function generateKey(strkey) { 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(strkey) { 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_textkey) { 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'; str = str.toUpperCase(); keyword = keyword.toUpperCase(); let key = generateKey(str keyword); let cipher_text = cipherText(str key); console.log('Ciphertext : ' + cipher_text + '
'); console.log('Original/Decrypted Text : ' + originalText(cipher_text key)+'
');
산출
Ciphertext : GCYCZFMLYLEIM Original/Decrypted Text : GEEKSFORGEEKS
시간복잡도 : O(n) 여기서 n은 문자열의 길이입니다(여기서는 str).
공간 복잡도 :O(n) 여기서 n은 문자열의 길이입니다(여기서는 str).