소개
Vigenere 암호는 텍스트를 암호화하고 해독하는 데 사용되는 알고리즘입니다. 비게네르 암호(Vigenere cipher)는 일련의 짜여진 시저 암호를 사용하여 알파벳 텍스트를 암호화하는 알고리즘입니다. 키워드의 문자를 기반으로 합니다. 다중 알파벳 대체 암호의 예입니다. 이 알고리즘은 이해하고 구현하기 쉽습니다. 이 알고리즘은 1553년에 처음으로 설명되었습니다. 지오반 바티스타 벨라소 . 텍스트의 암호화 및 암호 해독을 위해 Vigenere 테이블 또는 Vigenere 사각형을 사용합니다. Vigenere 테이블은 Tabula Recta라고도 합니다.
두 가지 방법으로 Vigenere 암호를 수행합니다.
방법 1
vigenere 테이블이 주어지면 이 방법으로 vigenere 테이블(26 * 26 행렬)을 사용하여 암호화 및 복호화를 수행합니다.
예: 일반 텍스트는 'JAVATPOINT'이고 키는 'BEST'입니다.
새 키를 생성하려면 일반 텍스트의 길이가 새 키와 같지 않은 한 지정된 키가 순환 방식으로 반복됩니다.
암호화
자바 해시맵이 뭐야?
일반 텍스트의 첫 번째 문자는 키의 첫 번째 문자와 결합됩니다. 일반 텍스트 'J' 열과 키 'B' 행이 vigenere 테이블의 알파벳 'K'와 교차하므로 암호문의 첫 글자는 'K'입니다.
마찬가지로 일반 텍스트의 두 번째 문자는 키의 두 번째 문자와 결합됩니다. 일반 텍스트 'A' 열과 키 'E' 행이 vigenere 테이블의 알파벳 'E'와 교차하므로 암호문의 두 번째 문자는 'E'입니다.
이 프로세스는 일반 텍스트가 완료될 때까지 계속됩니다.
암호문 = 켄투그박스
암호 해독
리눅스의 cp 명령
암호 해독은 vigenere 테이블의 키 행에 의해 수행됩니다. 먼저 핵심 문자의 행을 선택하고 해당 행에서 암호문 문자의 위치를 찾은 다음 해당 암호문의 열 레이블을 일반 텍스트로 선택합니다.
예를 들어, 키 행에는 'B'가 있고 암호문은 'K'이며 이 암호문 문자는 'J' 열에 나타납니다. 이는 첫 번째 일반 텍스트 문자가 'J'임을 의미합니다.
다음으로 키 행에는 'E'가 있고 암호문은 'E'이며 이 암호문 문자는 'A' 열에 나타납니다. 이는 두 번째 일반 텍스트 문자가 'A'임을 의미합니다.
이 프로세스는 암호문이 완료될 때까지 계속됩니다.
일반 텍스트 = 자바포인트
방법 2
Vigenere 테이블이 제공되지 않으면 Vigenar가 이 방법으로 대수적 공식을 사용하여 암호화 및 암호 해독을 수행합니다(문자(A-Z)를 숫자(0-25)로 변환).
암호화 공식은,
그리고나= (피나+ K나) 26에 반대복호화 공식은,
디나= (E나- 케이나) 26에 반대어떤 경우에도 (D나) 값이 음수(-ve)가 되는 경우, 이 경우 음수 값에 26을 더하게 됩니다.
어디,
E는 암호화를 나타냅니다.
자바 숫자를 문자열로
D는 암호 해독을 나타냅니다.
P는 평문을 나타낸다.
K는 키를 나타냅니다.
참고: 'i'는 아래 표와 같이 문자 i번째 숫자의 오프셋을 나타냅니다.
예: 일반 텍스트는 'JAVATPOINT'이고 키는 'BEST'입니다.
암호화: 그리고나= (피나+ K나) 26에 반대
일반 텍스트 | 제이 | ㅏ | 안에 | ㅏ | 티 | 피 | 영형 | 나 | N | 티 |
일반 텍스트 값(P) | 09 | 00 | 이십 일 | 00 | 19 | 열 다섯 | 14 | 08 | 13 | 19 |
열쇠 | 비 | 그리고 | 에스 | 티 | 비 | 그리고 | 에스 | 티 | 비 | 그리고 |
키값(K) | 01 | 04 | 18 | 19 | 01 | 04 | 18 | 19 | 01 | 04 |
암호문 값(E) | 10 | 04 | 13 | 19 | 이십 | 19 | 06 | 01 | 14 | 23 |
암호문 | 케이 | 그리고 | N | 티 | 안에 | 티 | G | 비 | 영형 | 엑스 |
해독: 디나= (E나- 케이나) 26에 반대
어떤 경우(Di) 값이 음수(-ve)가 되면 이 경우 음수 값에 26을 더하게 됩니다. 암호문의 세 번째 문자와 같습니다.
N = 13 및 S = 18
디나= (E나- 케이나) 26 반대
디나= (13 - 18) 대 26
힙 정렬
디나= 26에 대해 -5
디나= (-5 + 26) 대 26
디나= 21
암호문 | 케이 | 그리고 | N | 티 | 안에 | 티 | G | 비 | 영형 | 엑스 |
암호문 값(E) | 10 | 04 | 13 | 19 | 이십 | 19 | 06 | 01 | 14 | 23 |
열쇠 | 비 | 그리고 | 에스 | 티 | 비 | 그리고 | 에스 | 티 | 비 | 그리고 |
키값(K) | 01 | 04 | 18 | 19 | 01 | 04 | 18 | 19 | 01 | 04 |
일반 텍스트 값(P) | 09 | 00 | 이십 일 | 00 | 19 | 열 다섯 | 14 | 08 | 13 | 19 |
일반 텍스트 | 제이 | ㅏ | 안에 | ㅏ | 티 | 피 | 영형 | 나 | N | 티 |
프로그램:
C 언어
#include #include using namespace std; int main() { Vigenere cipher('VIGENERECIPHER'); string original = 'I AM INDIAN'; string encrypted = cipher.encrypt(original); string decrypted = cipher.decrypt(encrypted); cout << original << endl; cout << 'Encrypted: ' << encrypted << endl; cout << 'Decrypted: ' << decrypted << endl; } class Vigenere { public: string key; Vigenere(string key) { for (int i = 0; i = 'A' && key[i] key += key[i]; else if (key[i]>= 'a' && key[i] key += key[i] + 'A' - 'a'; } } string encrypt(string text) { string out; for (int i = 0, j = 0; i = 'a' && c <= 2 26 'z') c +="A" - 'a'; else if (c continue; out key[j] * 'a') % j="(j" 1) key.length(); } return out; string decrypt(string text) { for (int i="0," && <="z" ) 26) }; pre> <p> <strong>Output:</strong> </p> <pre> I AM INDIAN Encrypted: SDERFGTUJ Decrypted: IAMINDIAN </pre> <hr></=>
=>