PARI/GP 를 사용해 디피 헬만 키 교환 방식을 실제 연산으로 확인해 본다.
여기서 소수(prime)라는 수가 정말 중요하다.
이 소수의 규칙을 찾은 사람은 아직까지 없다.
위키피디아에는 소수라는 값은 파이라는 값과 연관 있다고 나와있다.
이 파이는 원이라는 수와 연관이 있으므로 자연현상과 관련있다는 점을 알 수 있다.
1. 소수 구하기
1) isprime(양수) : 이 값이 소수인지 알 수 있다. (참 : 1 거짓 : 0 반환)
2) nextprime(양수) : 어떤 수보다 크거나 같은 수 중에 가장 가까운 소수 반환
2. 랜덤한 수 구하기
1) random(양수) : 0 ~ 어떠한 수 내의 랜덤한 값 반환
이 수를 사용하여 로또 번호를 랜덤으로 뽑을 수도 있다.
for(n=1, 6, print(random(45)+1)) |
다음과 같이 입력하면 로또번호 6개를 받을 수 있을 것이다.
2. 함수 작성하기
예제로 함수를 사용해 nextprime()를 실제 구현해 본다.
마지막에 print(n) 대신 return n이나 그냥 n을 사용해도 무관하다.
참고로 우리가 작업한 기록은 모두 gp_history.txt에 저장된다.
3. 모듈로 연산
a - c = b * k 와 같은 연산이 있을 때
모듈로 연산하기 위해선 c = Mod(a, b)를 사용한다.
출력이 Mod(c,b)로 출력되는데 c만 구하기 위해선 lift(Mod(a,b))를 사용한다.
4. 제너레이터 생성기
Z5 = {0,1,2,3,4} 라 할 때
이는 즉 0보단 크거나 같고 5보단 작은 수를 의미한다.
이때 이 때 Z5에서 0을 제외한 어떤 수 x를 선택한 뒤 x^n mod 5 연산을 한 값이 Z5에 있는 모든 값이 나오게 되면 이는 제너레이터라고 한다.
또는 x^n mod 5에서 값이 1이 나 올 때 이 때 n이 phi(x)과 같으면 이를 제너레이터이라 한다.
이를 표현하기 위해 order을 사용한다.
phi(x) = 4
order(2) = 4
order(3) = 4
order(4) = 2
이다. 따라서 2와, 3는 제너레이터이지만 4는 제너레이터가 아니다.
이 때 가장 근접한 제너레이터를 찾기 위해선 Znprimroot를 사용하면 된다.
제너레이터의 개수를 알기 위해선 eulerphi(eulerphi(x)) 를사용하면 된다.
5. 디피 헬만 키 교환
위의 수행을 통해 제너레이터가 2라는 것은알수있다.
이때 여기서 0보다 크고 5보단 작은 어떤 수를 주었을 때
그 수가 나오기 위해선 제너레이터를 몇 승을 해야 선택한 수가 나오는 가?
이 문제가 난제이다.
4 == 2 ^ n mod(5)
여기서는 n이 2라는 것을 쉽게 알 수 있다.
하지만 mod 값이 크고, 선택한 값이 클 경우 문제가 굉장히 어려워진다.
1) 엄청 큰 소수 구하기 : 10^ 50 + 151
2) 제너레이터 선택 : 11
tip) 제너레이터로 만들 수 있는 개수
4) 개인키 선택 및 확인
znlog를 사용해 찾기 어려운 값인지 확인한다. 찾지못할경우 어려운 수
이 10^50은 바닷물에 콧물을 빠뜨린 뒤 찾는 것과 비슷하다고 한다.
5) 비밀키는 g^nm mod p 이다.
이것을 깨기 위해 위키피디아를 보면 index calculus 와 같은 방법을 사용하지만 아직도 깨기 힘들다고 한다.
'보안 > 프로그램' 카테고리의 다른 글
PARI / GP 를 사용한 빅데이터 연산 : Logistic Regression을 사용한 악성코드 분석 (0) | 2015.03.30 |
---|---|
PARI / GP 를 사용한 빅데이터 연산 : RSA 암호화 및 복호화 (0) | 2015.03.23 |
PARI / GP 를 사용한 빅데이터 연산 : 기본 명령어 (0) | 2015.03.12 |
wbin 윈도우즈에서 리눅스프로그램을 사용하자.!! (0) | 2014.12.01 |
adb 프로그램 (0) | 2014.12.01 |