이산로그 편집하기

이동: 둘러보기, 검색

경고: 로그인하지 않았습니다. 편집을 하면 IP 주소가 공개되게 됩니다. 로그인하거나 계정을 생성하면 편집자가 아이디(ID)으로 기록되고, 다른 장점도 있습니다.

편집을 되돌릴 수 있습니다. 이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 저장해주세요.
최신판 당신의 편집
1번째 줄: 1번째 줄:
 
'''이산로그'''<!--이산 로그-->(discrete logarithms)는 일반 로그와 비슷하게 군론에서 정의된 연산으로, 1보다 큰 자연수 <math> a \ </math>, <math> \ m </math>
 
'''이산로그'''<!--이산 로그-->(discrete logarithms)는 일반 로그와 비슷하게 군론에서 정의된 연산으로, 1보다 큰 자연수 <math> a \ </math>, <math> \ m </math>
, 정수 <math> b \ </math> 에 대하여 방정식 <math> a^{x} \ = \ b </math>만족하는 정수 <math> x \ </math>를 가리킨다. [[이산로그]]를 계산하는 다항식 시간(polynomial time) 알고리즘이 알려져 있지 않아 이산로그는 현대 암호에 응용되고 있다.<ref name="위키백과">〈[https://ko.wikipedia.org/wiki/%EC%9D%B4%EC%82%B0_%EB%A1%9C%EA%B7%B8?action=edit 이산_로그]〉, 《위키백과》</ref> '''이산대수'''<!--이산 대수-->(離散對數)라고도 한다.<ref>로그(logarithm)를 대수(對數)라 부르기도 하므로, 이산대수와 이산로그는 같은 말이다.</ref>
+
, 정수 <math> b \ </math> 에 대하여 방정식 <math> a^{x} \ = \ b </math> 만족하는 정수 <math> x \ </math>를 가리킨다. [[이산로그]]를 계산하는 다항식 시간(polynomial time) 알고리즘이 알려져 있지 않아 이산로그는 현대 암호에 응용되고 있다.<ref name="위키백과">〈[https://ko.wikipedia.org/wiki/%EC%9D%B4%EC%82%B0_%EB%A1%9C%EA%B7%B8?action=edit 이산_로그]〉, 《위키백과》</ref> '''이산대수'''(離散對數)라고도 한다.<ref>로그(logarithm)를 대수(對數)라 부르기도 하므로, 이산대수와 이산로그는 같은 말이다.</ref>
  
 
== 개념 ==
 
== 개념 ==
<math> a^{x} \ = \ b </math> 일 때 <math> x \ = \ log_{a}b </math> 이다. 실수에서 <math> a \ , \ b </math>가 주어지고 <math> a^{x} \ = \ b </math>를 만족하는 <math> x \ </math>, 즉 <math> log_{a}b \ </math>를 간단하게 계산할 수 있다. 그러나 <math> Z_{p} </math>에서 주어진 <math> a \ , \ b </math>에 대해 <math> a^{x} \ = \ b </math>를 만족하는 <math> x \ </math>를 찾는 것이 바로 이산로그 문제이다. 이산로그 문제에서 <math> p \ </math>는 [[소수]], <math> a \ </math>는 <math> p \ </math>의 [[원시근]]인 것이 좋다. <ref name="secmem"></ref>
+
<math> a^{x} \ = \ b </math> 일 때 <math> x \ = \ log_{a}b </math> 이다. 실수에서 <math> a \ , \ b </math>가 주어지고 <math> a^{x} \ = \ b </math>를 만족하는 <math> x \ </math>, 즉 <math> log_{a}b \ </math>를 간단하게 계산할 수 있다. 그러나 <math> Z_{p} </math>에서 주어진 <math> a \ , \ b </math>에 대해 <math> a^{x} \ = \ b </math>를 만족하는 <math> x \ </math>를 찾는 것이 바로 이산로그 문제이다. 이산 로그 문제에서 <math> p \ </math>는 [[소수]], <math> a \ </math>는 <math> p \ </math>의 [[원시근]]인 것이 좋다. <ref name="secmem"></ref>
  
 
이산대수의 역함수인 이산 거듭제곱은 효율적으로 계산할 수 있지만, 이산대수 계산은 어려운 것으로 알려진 군이 존재한다. (이산 거듭제곱의 경우 제곱을 여러번 반복해서 효율적으로 계산하는 방법등이 있다.) 일부 암호는 이런 비대칭성을 바탕으로 설계되기도 한다. 일반 이산대수를 구하는 문제는 일반 이산대수 문제(generalized discrete logarithm problem, 혹은 줄여서GDLP)라고 부르며, 현재까지 이에 대한 효율적인 알고리즘을 찾지 못하고 있다. 암호학에서 <math>G</math>는 보통 순환군 <math>{Z_p}^{*}</math>를 사용한다. 최근에는 유한체에서 정의된 [[타원 곡선]]의 순환 부분군을 암호에 적용하기 위해 많은 연구가 진행되고 있다.<ref name="꼬막"></ref>
 
이산대수의 역함수인 이산 거듭제곱은 효율적으로 계산할 수 있지만, 이산대수 계산은 어려운 것으로 알려진 군이 존재한다. (이산 거듭제곱의 경우 제곱을 여러번 반복해서 효율적으로 계산하는 방법등이 있다.) 일부 암호는 이런 비대칭성을 바탕으로 설계되기도 한다. 일반 이산대수를 구하는 문제는 일반 이산대수 문제(generalized discrete logarithm problem, 혹은 줄여서GDLP)라고 부르며, 현재까지 이에 대한 효율적인 알고리즘을 찾지 못하고 있다. 암호학에서 <math>G</math>는 보통 순환군 <math>{Z_p}^{*}</math>를 사용한다. 최근에는 유한체에서 정의된 [[타원 곡선]]의 순환 부분군을 암호에 적용하기 위해 많은 연구가 진행되고 있다.<ref name="꼬막"></ref>
14번째 줄: 14번째 줄:
  
 
== 특징 ==
 
== 특징 ==
아직까지 이산로그 문제에 대한 효율적인 계산법은 나오지 않았다.(여기서 효율적인 계산법이라고 하는 것은 참고로 이산로그 문제는 NP-complete에 속하는 문제는 아니기에 효율적인 계산법이 나올 가능성은 충분히 있다. 또한 Quantum Computer에서는 P에 속함이 증명되어 있다. 이산로그는 Elgamal Encryption, Diffie-Hellman 키 교환, Digital Siganature Algorithm 등과 같이 암호화, 키 교환, 인증 등의 각종 암호 분야에서 쓰이고 있다. 만약 이산로그 문제가 효율적으로 풀리게 된다면 위에서 언급한 암호 시스템이 안전하지 않게 된다. 또한, 비록 일반적인 이산로그에 대한 풀이법 자체는 아직 찾지 못했다고 하더라도 a,b,p를 적절하게 택하지 못하는 구현의 실수로 인해 기밀성이 지켜지지 않는 경우도 있다. <ref name="secmem">〈[http://www.secmem.org/blog/2019/05/17/%EC%9D%B4%EC%82%B0-%EB%A1%9C%EA%B7%B8/ 이산-로그]〉, 《secmem》</ref>
+
아직까지 이산 로그 문제에 대한 효율적인 계산법은 나오지 않았다.(여기서 효율적인 계산법이라고 하는 것은 참고로 이산 로그 문제는 NP-complete에 속하는 문제는 아니기에 효율적인 계산법이 나올 가능성은 충분히 있다. 또한 Quantum Computer에서는 P에 속함이 증명되어 있다. 이산 로그는 Elgamal Encryption, Diffie-Hellman 키 교환, Digital Siganature Algorithm 등과 같이 암호화, 키 교환, 인증 등의 각종 암호 분야에서 쓰이고 있다. 만약 이산 로그 문제가 효율적으로 풀리게 된다면 위에서 언급한 암호 시스템이 안전하지 않게 된다. 또한, 비록 일반적인 이산 로그에 대한 풀이법 자체는 아직 찾지 못했다고 하더라도 a,b,p를 적절하게 택하지 못하는 구현의 실수로 인해 기밀성이 지켜지지 않는 경우도 있다. <ref name="secmem">〈[http://www.secmem.org/blog/2019/05/17/%EC%9D%B4%EC%82%B0-%EB%A1%9C%EA%B7%B8/ 이산-로그]〉, 《secmem》</ref>
  
 
; Safe Prime
 
; Safe Prime
Pohlig-Hellman Algorithm에서 볼 수 있듯 <math> p - 1 \ </math>의 소인수 중 그다지 큰 것이 없으면 이산로그를 굉장히 쉽게 구할 수 있다. 이를 막기 위해 <math> p \ </math>를 safe prime으로 택하는 것이 좋다. safe prime은 <math> p \ = \ 2q + 1 </math> 꼴의 소수를 의미합니다.2048-bit의 safe prime을 택하기 위해서는 1024-bit의 prime <math> q \ </math>를 임의로 택한다. 그리고 <math> p \ = \ 2q + 1 </math> 이 소수인지 확인하는 방법으로 만들어낼 수 있다. <math> p \ = \ 2q + 1 </math>이 소수일 확률은 소수 정리에 의해 <math> 1 \ / \ ln(2q + 1) </math>에 근사하기 때문에 대략 2048개의 <math> q \ </math>를 잡으면 safe prime을 만들어낼 수 있다.<ref name="secmem"></ref>
+
Pohlig-Hellman Algorithm에서 볼 수 있듯 <math> p - 1 \ </math>의 소인수 중 그다지 큰 것이 없으면 이산 로그를 굉장히 쉽게 구할 수 있다. 이를 막기 위해 <math> p \ </math>를 safe prime으로 택하는 것이 좋다. safe prime은 <math> p \ = \ 2q + 1 </math> 꼴의 소수를 의미합니다.2048-bit의 safe prime을 택하기 위해서는 1024-bit의 prime <math> q \ </math>를 임의로 택한다. 그리고 <math> p \ = \ 2q + 1 </math> 이 소수인지 확인하는 방법으로 만들어낼 수 있다. <math> p \ = \ 2q + 1 </math>이 소수일 확률은 소수 정리에 의해 <math> 1 \ / \ ln(2q + 1) </math>에 근사하기 때문에 대략 2048개의 <math> q \ </math>를 잡으면 safe prime을 만들어낼 수 있다.<ref name="secmem"></ref>
  
 
===이산대수 문제===
 
===이산대수 문제===
33번째 줄: 33번째 줄:
  
 
* '''Baby-step giant-step Algorithm (아기걸음 거인걸음)'''
 
* '''Baby-step giant-step Algorithm (아기걸음 거인걸음)'''
알고리즘의 이름은 생소할 수 있지만 일종의 MITM(Meet In The Middle) 알고리즘으로, 이 알고리즘을 통해 시간복잡도를  <math> O(p) \ </math>에서  <math> O(p^{0.5}) \ </math>로 떨어 뜨릴 수 있다. 해쉬를 이용할 경우  <math> O(p^{0.5}) \ </math>, 정렬을 이용할 경우  <math> O(p^{0.5}lgp) \ </math>에 이산로그 문제를 해결할 수 있다. 정렬을 이용한 예시 코드는 아래와 같다.
+
알고리즘의 이름은 생소할 수 있지만 일종의 MITM(Meet In The Middle) 알고리즘으로, 이 알고리즘을 통해 시간복잡도를  <math> O(p) \ </math>에서  <math> O(p^{0.5}) \ </math>로 떨어 뜨릴 수 있다. 해쉬를 이용할 경우  <math> O(p^{0.5}) \ </math>, 정렬을 이용할 경우  <math> O(p^{0.5}lgp) \ </math>에 이산 로그 문제를 해결할 수 있다. 정렬을 이용한 예시 코드는 아래와 같다.
 
  def egcd(a1, a2):
 
  def egcd(a1, a2):
 
   x1, x2 = 1, 0
 
   x1, x2 = 1, 0
243번째 줄: 243번째 줄:
  
 
===엘가말===  
 
===엘가말===  
[[엘가말]](EIGamal)은 1985년 이산대수 문제에 바탕을 둔 공개키 암호 시스템이다. 아래는 엘가말 암호 알고리즘을 이용하여 송신인 갑이 수신인 을에게 메시지를 전달하는 절차를 설명한 것이다.
+
[[엘가말]](EIGamal)은 1985년 이산 대수 문제에 바탕을 둔 공개키 암호시스템이다. 아래는 엘가말 암호 알고리즘을 이용하여 송신인 갑이 수신인 을에게 메시지를 전달하는 절차를 설명한 것이다.
  
 
* 준비과정  
 
* 준비과정  
263번째 줄: 263번째 줄:
  
 
===디피 헬만===
 
===디피 헬만===
[[디피 헬만]] 알고리즘(Diffie-Hellman Algorithm)은 상대방의 공개키와 나의 개인키를 이용하여 계산을 하면 비밀키가 나온다. 그 후 나와 상대방은 비밀키를 사용하여 데이터를 암호화한 후 전달하면 된다. 이러한 DH 알고리즘은 '키 교환(key exchange)' 알고리즘으로 대칭키를 공유하는데 사용한다. 이는 암호화나 서명을 위한 것이 아니며, 이산대수 문제(Discrete Logarithm Problem)(혹은 이산로그)라는 방식을 이용하는데 <math>y=g^{x} \,\bmod\, p</math>일때 <math>g</math>와 <math>x</math>와 <math>p</math>를 안다면 <math>y</math>는 구하기 쉽지만 <math>g</math>와 <math>y</math>와 <math>p</math>를 알땐 <math>x</math>를 구하기는 어렵다는 방식에 착안하여 만들어진 알고리즘이다.
+
[[디피 헬만]] 알고리즘(Diffie-Hellman Algorithm)은 상대방의 공개키와 나의 개인키를 이용하여 계산을 하면 비밀키가 나온다. 그 후 나와 상대방은 비밀키를 사용하여 데이터를 암호화한 후 전달하면 된다. 이러한 DH 알고리즘은 '키 교환(key exchange)' 알고리즘으로 대칭키를 공유하는데 사용한다. 이는 암호화나 서명을 위한 것이 아니며, 이산 대수 문제(Discrete Logarithm Problem)(혹은 이산 로그)라는 방식을 이용하는데 <math>y=g^{x} \,\bmod\, p</math>일때 <math>g</math>와 <math>x</math>와 <math>p</math>를 안다면 <math>y</math>는 구하기 쉽지만 <math>g</math>와 <math>y</math>와 <math>p</math>를 알땐 <math>x</math>를 구하기는 어렵다는 방식에 착안하여 만들어진 알고리즘이다.
  
 
* 동작원리
 
* 동작원리
286번째 줄: 286번째 줄:
  
 
== 암호학 ==
 
== 암호학 ==
암호학에서는 이산로그의 효율적 [[알고리즘]]이 존재하지는 않는다. 하지만 그 반대 방향인 거듭제곱 연산은 간단히 계산할 수 있다는 일방항 함수의 아이디어를 RSA에서와 마찬가지로 이용한 것이다. 만약 이산로그 문제를 계산할 수 있다면 원래 비밀번호를 알아낼 수 있다. 이 때문에 이산로그의 비효율성은 보안성에 중요 역할을 한다. 엘가말 암호와 전자 서명 알고리즘 등의 암호 체계에서도 비슷한 방법을 이용한다. 타원 곡선 암호에서는 유한체에서 정의된 타원 곡선의 순환 부분군의 이산로그 문제를 활용한다.<ref name="위키백과"></ref>
+
암호학에서는 이산 로그의 효율적 [[알고리즘]]이 존재하지는 않는다. 하지만 그 반대 방향인 거듭제곱 연산은 간단히 계산할 수 있다는 일방항 함수의 아이디어를 RSA에서와 마찬가지로 이용한 것이다. 만약 이산 로그 문제를 계산할 수 있다면 원래 비밀 숫자를 알아낼 수 있다. 이 때문에 이산 로그의 비효율성은 보안성에 중요 역할을 한다. 엘가말 암호와 전자 서명 알고리즘 등의 암호 체계에서도 비슷한 방법을 이용한다. 타원 곡선 암호에서는 유한체에서 정의된 타원 곡선의 순환 부분군의 이산 로그 문제를 활용한다.<ref name="위키백과"></ref>
  
 
===타원곡선암호===
 
===타원곡선암호===

해시넷에서의 모든 기여는 다른 기여자가 편집, 수정, 삭제할 수 있다는 점을 유의해 주세요. 만약 여기에 동의하지 않는다면, 문서를 저장하지 말아 주세요.
또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다 (자세한 사항은 해시넷:저작권 문서를 보세요). 저작권이 있는 내용을 허가 없이 저장하지 마세요!

취소 | 편집 도움말 (새 창에서 열림)