본문 바로가기

Algorithm/암호화 알고리즘

(7)
[암호학] 다중 치환 암호_비제네르(Vigenere) 암호 다중 치환 암호(Polyalphabetic Substitution Cipher) 하나의 문자가 서로 다른 여러 문자로 매핑 비제네르 암호 암호 간격을 문자마다 서로 다른 간격으로 이동시킨 것. 동일한 문자가 각각 다른 문자로 암호화 될 수 있는 다중치환 방식 ex) "ABCDEF" 를 암호화 하기 위해 키로 "BCD"를 사용 1. 키가 평문보다 작다면 평문의 길이만큼 Key를 반복 "BCDBCD" 2. 평문의 각 문자에 매핑되는 Key 문자의 인덱스만큼 문자를 평행 이동 첫 문자가 'A'이고, 매핑되는 Key는 'B' 이므로 'A' + 1 = 'B' 가 암호문자 두번째 문자가 'B' 이고 매핑되는 키는 'C' 이므로 'B' + 2 = 'D' 가 암호문자가 된다. A B C D E F B(+1) C(+2)..
[암호학] 단일치환 암호_Affine 암호 Affine 암호 곱셈 암호와 덧셈 암호를 병합하여 구현한 것으로 2개의 Key를 갖는다. 첫번째 Key는 곱셈 암호의 키로서 역원을 갖는 곱셈 암호의 키 집합인 Z26*의 요소이고, 두번째 Key는 덧셈 암호의 키로서 알파벳 집합 Z26의 요소이다. C = (K1 * P + K2) mod 26 f(x) = (a * x + b) % 26 => 기울기가 a 이고, y 절편이 b인 직선의 방정식 또는 일차 함수 Affine 암호식은 다음과 같은 3가지 조건을 가진다. 1) 곱셈 암호키 a(K1)는 곱셈에 대한 역원을 가져야 하므로 26과 서로소이어야 한다. gcd(a,26) = 1 2) a는 0이 아니어야 하고, 1~25 사이의 값이다 3) b는 0 ~25 사이의 값이다. public class Affine..
[암호학] 모듈로 연산(Modular Artimetic) 모듈로 연산(Modular Artimetic) 나머지를 구하는 연산을 의미 - a mod n = r - a를 n으로 나눈 나머지는 r일 경우 위와 같은 식으로 표기. n은 모듈로라고 부르고 r은 나머지 라고 부른다. - a는 정수, n은 양의 정수, r은 0을 포함한 양의 정수 ex) 12 mod 11 = 1 -12 mod 11 = 10 => 원래는 -1이나 음수가 되면 안되므로 모듈로 11을 더해서 10 합동 (Congruence) 어떤 수로 나눈 나머지가 같을 때 - 3 mod 12 = 3 15 mod 12 = 3 => 3 ≡ 15 (mod12). 3과 15는 모듈로 12에 대해서 합동이다. 공역(Zn) - 어떤 함수를 적용하였을 경우 나올 수 있는 모든 값의 집합 - 합동식에서 모듈로 연산자를 적용..
[암호학] 단일치환 암호_곱셈 암호 곱셈 암호(Multiplicative Cipher) - 문자에 일정한 수(Key)를 곱해서 암호를 생성하는 방식 모듈러 연산 (Modular Arithmetic) - 모듈러 연산 "mod n" 에서 모듈러 곱셈이 역원을 갖기 위한 조건은 모듈러스 n과 서로소인 수만 역원을 가질 수 있 다. - 알파벳의 경우 mod 26 인 집합 Z26 = {0, 1, 2...25} 에서 26과 임의의 수 K의 최대공약수가 1이되면 이들은 서로소가 되고 K는 모듈러 곱셈의 역원을 갖게 된다. 즉, 1, 3, 5, 7, 9, 11, 15,17,19, 21,23, 25 를 Key 로 사용할 수 있다. /// /// 곱셈 암호 /// public class MultiCipher { public static string Encr..
[암호학] 단일치환 암호_랜덤 치환 암호 랜덤 치환 암호(Random Substitution Cipher) - 각 문자마다 랜덤하게 다른 문자를 대응시킨 암호 - 외부에서 랜덤 키를 제공받거나 자체적으로 랜덤 키 테이블을 생성해서 메시지를 암호화, 복호화한다. - 'A~Z 배열'로부터 랜덤하게 문자 하나를 선택해서 이를 순차적으로 매핑 테이블에 저장 > 배열 삭제 후 다음 문자열을 매핑 테이블에 저장 > 모든 문자를 매핑 테이블에 저장할 때 까지 반복 public class RandomCipher { // 랜덤 매핑 테이블 private readonly char[] table; public RandomCipher(string keyTable = null) { // 외부에서 키를 제공할 경우 그 키를 사용 if (keyTable != null) ..
[암호학] 단일치환 암호_ROT13 암호 - 알파벳 문자를 13번 Shift 하여 암/복호화를 수행하는 방식 - Shift Key가 13인 시저암호 - A~Z 문자에 대해 NOPQRTUVWXYZABCDEFGHIJKLM 인 매핑텡이블을 갖는다. public class ROT13Cipher { // ROT13 매핑테이블 private static string ROT = "NOPQRSTUVWXYZABCDERGHIJKLM"; public static string Encrypt(string message) { return Rotate(message); } public static string Decrypt(string cipher) { return Rotate(cipher); } private static string Rotate(string str) ..
[암호학] 단일치환 암호_시저암호 - 치환 암호(Substitution Cipher) : 평문의 문자를 다른 문자로 치환하는 암호 - 단일 치환 암호 : 하나의 문자가 항상 다른 하나의 문자로 매핑 랜덤한 매핑 테이블을 사용하여 치환하는 방식, 일정한 수(Key)를 더해서 암호를 생성하는 덧셈 암호, 일정한 수를 곱해 서 암호를 생성하는 곱셈 암호, 덧셈과 곱셈을 모두 사용하는 암호 등이 있다. - 시저 암호 : 문자를 일정한 간격만큼 이동하여 암호를 생성하는 방식. ex ) A는 3만큼 이동하여 D로 만들고, B를 3만큼 이동하여 E로 만드는 것과 같은 방식 송수신자는 문자를 N만큼 Shift 한다는 것(Shift Key)을 알고 있는 상태에서 메시지를 암,복호화 public class CaesarCipher { private cons..