2014년 7월 26일 토요일

공개키 암호 방식, SSL/TLS, Open SSL

[고대? 암호화 방식들]

http://en.wikipedia.org/wiki/Scytale
http://en.wikipedia.org/wiki/Caesar_cipher





[공개키 암호 방식 설명 link 모음]
http://charlie0301.blogspot.kr/2014/07/link-public-key-infrastructure.html

: 디지털 서명 & 메시지 암호화
http://technet.microsoft.com/ko-kr/library/aa998077

* 공개키, 개인키 암호화 방식을 통해 메세지가 송신자에게서 전달된 것임을 확인하는 디지털 서명과 메세지를 암호화, 복호화 하기 위해 서로간 세션키를 전달하는 것이 기본 내용.

* 공개키 암호화/복호화 시 계산의 복잡성으로 다소 큰 비용이 발생하여
   임시 세션키를 사용하여 메세지를 암호화 하고 세션키를 공개키로 암호화 하여 비용 절감.



[X.509]
http://en.wikipedia.org/wiki/X.509
Public Key Infrastructure (PKI)와 Privilege Management Infrastructure (PMI)의 ITU의 표준으로 public key certificates에 대해서도 언급하고 있음.

* 즉 인증서는 공개키와 키의 정보를 함께 포함하고 있음.

$ openssl x509 -in freesoft-certificate.pem -noout -text
Certificate:
   Data:
       Version: 1 (0x0)
       Serial Number: 7829 (0x1e95)
       Signature Algorithm: md5WithRSAEncryption
       Issuer: C=ZA, ST=Western Cape, L=Cape Town, O=Thawte Consulting cc,
               OU=Certification Services Division,
               CN=Thawte Server CA/emailAddress=server-certs@thawte.com
       Validity   
           Not Before: Jul  9 16:04:02 1998 GMT
           Not After : Jul  9 16:04:02 1999 GMT
       Subject: C=US, ST=Maryland, L=Pasadena, O=Brent Baccala,
                OU=FreeSoft, CN=www.freesoft.org/emailAddress=baccala@freesoft.org
       Subject Public Key Info:
           Public Key Algorithm: rsaEncryption
           RSA Public Key: (1024 bit)
               Modulus (1024 bit):
                   00:b4:31:98:0a:c4:bc:62:c1:88:aa:dc:b0:c8:bb:
                   33:35:19:d5:0c:64:b9:3d:41:b2:96:fc:f3:31:e1:
                   66:36:d0:8e:56:12:44:ba:75:eb:e8:1c:9c:5b:66:
                   70:33:52:14:c9:ec:4f:91:51:70:39:de:53:85:17:
                   16:94:6e:ee:f4:d5:6f:d5:ca:b3:47:5e:1b:0c:7b:
                   c5:cc:2b:6b:c1:90:c3:16:31:0d:bf:7a:c7:47:77:
                   8f:a0:21:c7:4c:d0:16:65:00:c1:0f:d7:b8:80:e3:
                   d2:75:6b:c1:ea:9e:5c:5c:ea:7d:c1:a1:10:bc:b8:
                   e8:35:1c:9e:27:52:7e:41:8f
               Exponent: 65537 (0x10001)
   Signature Algorithm: md5WithRSAEncryption
       93:5f:8f:5f:c5:af:bf:0a:ab:a5:6d:fb:24:5f:b6:59:5d:9d:
       92:2e:4a:1b:8b:ac:7d:99:17:5d:cd:19:f6:ad:ef:63:2f:92:
       ab:2f:4b:cf:0a:13:90:ee:2c:0e:43:03:be:f6:ea:8e:9c:67:
       d0:a2:40:03:f7:ef:6a:15:09:79:a9:46:ed:b7:16:1b:41:72:
       0d:19:aa:ad:dd:9a:df:ab:97:50:65:f5:5e:85:a6:ef:19:d1:
       5a:de:9d:ea:63:cd:cb:cc:6d:5d:01:85:b5:6d:c8:f3:d9:f7:
       8f:0e:fc:ba:1f:34:e9:96:6e:6c:cf:f2:ef:9b:bf:de:b5:22:
       68:9f

http://technet.microsoft.com/en-us/library/cc737264(v=ws.10).aspx





[Secure Scokets Layer(SSL)/Transport Layer Security(TLS)]

http://en.wikipedia.org/wiki/Transport_Layer_Security
http://ko.wikipedia.org/wiki/%ED%8A%B8%EB%9E%9C%EC%8A%A4%ED%8F%AC%ED%8A%B8_%EB%A0%88%EC%9D%B4%EC%96%B4_%EB%B3%B4%EC%95%88

인터넷 상에서 server, client간 communication 보안을 위해 설계된 protocol으로
암호화된 연결 및 데이터 무결성을 확보해 줌.

SSL specification은 1994, 1995, 1996년에 Nescape Communications에 의해 개발되었고 TLS는 IETF(Internet Engineering Task Force)에 의해 SSL을 기반하여 정의 됨.

: Authentication flow
https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=4&cad=rja&uact=8&ved=0CD8QFjAD&url=http%3A%2F%2Fmarcof.tistory.com%2Fattachment%2Fcfile25.uf%40144CA5344DDE672A3331AD.ppt&ei=Bq_DU6HINcLClAW6hoGoDg&usg=AFQjCNFQ3mOybIaplRiShYaYpWdqogYg-A&sig2=Ghmtl1v8oEE-rEk8hlrZkw&bvm=bv.70810081,d.dGI


- 앞장 1,2번을 통해 server, client 서로 random data를 주고 받음
- 서버는 4번을 통해 자신이 가지고 있는 인증서를 전달(CA의 개인키로 암호화 된)
 : client는 일반적으로 CA의 공개키를 가지고 있다.
- Client는 Server, client random data를 사용하여 Master Secret을 생성
- 생성된 Master Secret를 서버 공개키를 사용하여 암호화 후 전달(8번)
- Server, Client는 Master Secret를 사용하여 임시키(Session Key)를 생성함.
- 이후 Server, Client는 Session Key를 사용하여 - 데이터를 암호화/복호화 함. (대칭키 암호화 방식)

* client는 일반적인 서버를 인증하는 CA의 공개키(public key)를 가지고 있고, 서버는 CA로 부터 CA의 개인키(private key)로 암호화된 서버의 인증서를 가지고 있음.
 => 즉 client는 가지고 있는 CA의 공개키로 서버로 부터 받은 인증서를 복호화 하여 서버를 검증 함.

* server, client는 random data를 서로 공유하고 server, client에서 사용할 임시키(Session key)를 만들기 위한 Master Secret를  client에서 생성하여 전달함.
 : random data기반하여 clent가 master secret를 생성하는 공식은 다른 자료 참고


[SSL 관련 참조 링크]

SSL과 인증서
http://opentutorials.org/course/228/4894

암호화 역사 (KISA)
http://seed.kisa.or.kr/iwt/ko/intro/EgovHistory.do



[OpenSSL]

OpenSSL (Wikipedia)
http://en.wikipedia.org/wiki/OpenSSL

OpenSSL 설치 및 사용
http://www.solanara.net/solanara/openssl

OpenSSL 인증서 생성
http://www.embedded101.com/Blogs/PaoloPatierno/tabid/106/entryid/366/MQTT-over-SSL-TLS-with-the-M2Mqtt-library-and-the-Mosquitto-broker.aspx
http://golmong.tistory.com/112


- SSL/TLS protocol을 open-source 기반으로 구현한 software library
- Eric Andrew Young, Tim Hudson이 만든 SSLeay library를 기반으로 1998년 시작되었음.
- License : Dual licensed (Apache License 1.0 + BSD License)

- 지원하는 알고리즘들
 . Ciphers
  > AES, Blowfish, Camellia, SEED, CAST-128, DES, IDEA, RC2, RC4, RC5, Triple DES, GOST 28147-89[7]
 . Cryptographic hash functions
  > MD5, MD4, MD2, SHA-1, SHA-2, RIPEMD-160, MDC-2, GOST R 34.11-94
 . Public-key cryptography
  > RSA, DSA, Diffie–Hellman key exchange, Elliptic curve, GOST R 34.10-2001

- 그외
. libReSSL : Heartbleed 이슈로 OpenBSD 쪽에서 OpenSsl 1.0.1g에서 fork 하여 개발, 불필요 부분 대거 삭제
. BoringSSL : 2014년 Google이 OpenSSL와 libReSSL 개발자와 협력하기 위해 OpenSSL을 fork함.

2014년 7월 14일 월요일

Tizen상에서 MQTT client 컴파일 하기 (with OpenSSL library)

Tizen 상에서 MQTT client들 중에서 C/C++ API들을 제공하는 solution 들을 테스트 하려 함.

대표적인 것은 Eclipse Paho와 libmosquitto 이며  (http://mqtt.org/wiki/doku.php/libraries)
대략 봤을 때는 두 solution들의 feature는 거의 유사하지만
코드 상으로는 libmosquitto가 다소 simple한 것 같아보임
(libmosquitto LOC 대략 7264, Paho LOC 대략 18395)..
(하지만 Paho도 simple한 것은 사실, 하지만 워낙 MQTT protocol 자체가 simple 하니...)

MQTT client를 테스트 해보려면
. 위 client library를 컴파일 해야 하고
. library 컴파일에 필요한 OpenSSL library를 컴파일 해야 하고
. application을 만들어 sample code를 포팅해야 함.



[MQTT client library compile]

1. Paho, libmosquitto를 tizen shared library로 컴파일 하기 위해서는
tizen sdk > File > New > Tizen Native Project > Library > Shared Library 프로젝트를 생성한다.


2. library 파일들을 inc, src 폴더로 복사한다.
 . Paho : sample 을 제외한 library 파일들을 복사
 . libmosquitto : python, js 파일들을 제외하고 복사

3. project setting
 . SSL/TLS 지원을 위해 preprocessor, include path 설정
  : Project properties > C/C++ Build > Settings > C++ Compiler/C Compiler > Preprocessor/Symbols
    >  Paho project : "OPEN_SSL", libmosquitto : "WITH_TLS" 설정
  : Project properties > C/C++ Build > Settings > C++ Compiler/C Compiler > Includes 에 OpenSSL source의 include path 설정 (아래)



[OpenSSL library compile]

Paho, libmosquitto에서 SSL/TLS 설정을 사용하고자 할 경우
Tizen에서 돌아가야할 OpenSSL의 libssl.so, libcrypto.so 가 필요함.
Tizen platform내의 OpenSSL shared library를 사용할 수 있겠지만
방법을 모르는 관계로 so를 만들어서 app과 함께 deploy해서 사용할 생각임.

일단 OpenSSL 최신버전을 다운 받을 수 있겠지만 Tizen용으로 빌드를 해야 하기에 git repository에 있는 것을 다운받아 컴파일 하자.
참고
 - Tizen GBS : https://source.tizen.org/ko/documentation/reference/git-build-system
 - GBS 빌드 방법 (by 서주영님)
    . source code download : http://seoz.egloos.com/3896390
    . GBS 설정 : http://seoz.egloos.com/3900549
 - cocos2d-x 포팅 후기 (by 이재홍님) : http://pyrasis.com/cocos2d-x/2013/05/19/cocos2d-x-tizen-port-post-mortem/


1. gerrit 등록 및 GBS 설정
 . gbs.conf는 는 tizen 홈피에 있는 것을 받아서 계정 정보(id, password) 추가
 . buildconf 주석'#' 처리
 . 서주영님 게시물 GBS 설정 3번 항목에 따라 URL 수정

2. OpenSSL repository clone
 . 일단 framework/security/openssl 를 다운 받았음... 사실 OpenSSL repository는 framework, platform 두개가 있는데 차이를 모르겠고 platform은 dependency가 있어 그냥 framework을 다운 받음.

3. 빌드 (gbs build -A armv7l)

빌드된 결과물은 rpm으로 나오겠지만 일단 so만 필요하므로
.gbs.conf 의 buildroot 경로에서 빌드 결과물 중 libssl.so, libcrypto.so 를
밑의 폴더에서  tizen app의 lib 폴더로 복사

~/GBS-ROOT-profile.tizen/local/BUILD-ROOTS/scratch.armv7l.0/home/abuild/rpmbuild/BUILD/openssl-1.0.0f

* 빌드 option 참고 (위쪽 서주영님 포스팅 발췌)

만약 빌드가 잘 안 되거나 GBS 설정 파일의 url을 바꾼 경우라면 아래와 같이 --clean 옵션을 이용하여 빌드를 하시기 바랍니다.

gbs build -A i586 --clean

만약 다운로드 받은 타이젠 소스코드를 수정하셨다면 아래와 같이 --include-all 옵션을 주어야 합니다.
GBS는 git에 커밋(commit)이 된 소스코드를 이용하여 빌드를 하기 때문에 소스코드를 수정했다면 git에 커밋을 해야 GBS로 빌드할 수 있습니다.
만약 커밋을 하지 않고 소스코드를 빌드하고 싶다면 --include-all 옵션을 주어야 합니다.

gbs build -A i586 --include-all

빌드 시 아키텍처를 선택하지 않았다면 기본적으로 i586으로 빌드가 되며 arm으로 빌드를 하려면 -A 옵션과 함께 armv7l을 인자로 주어야 합니다. (마지막의 l은 L의 소문자입니다.)

$ gbs build -A armv7l


[MQTT sample client app compile & run]

일단 MQTT client sample application을 만들어야 하므로
간단한 Tizen Form-based Application project를 만들어서
client 소스코드를 복사한다.

Paho의 경우 src/samples 내 pubsync.c, MQTTAsync_publish.c, MQTTAsync_subscribe.c 를 사용하고 mosquitto는 소스코드의 client 폴더 내 pub, sub sample를 사용

. 확장자를 cpp로 바꾸고
. main 함수의 이름을 바꾸고 header를 만들어 expose (단 naming mangling 방지를 위해 extern C 사용)
. sample들이 loop을 사용하므로 Tizen thread를 만들어 별도 thread에서 돌아가게 해야 함.
. application event handler에서 thread를 생성해서 실행하도록 코드 작성


그리고 application에서 위에서 만든 libpaho.so, libmosquitto.so 를 사용해야 하므로
application project에서 library project를 reference 하고 include path, library path & library 설정이 필요함 이 부분은 아래 링크에서 잘 설명 되어 있음.

- 오픈소스를 활용한 Tizen 용 web server 포팅 : http://tizenschools.com/?p=40
 . library들이 함께 사용하는 library들 - libdl, libssl, libcrypto

- 또한 SSL/TLS 를 사용하고자 할 경우 CA의 인증서가 필요하므로 이를 App과 함께 배포하고자 shared/data에 복사하고 mosquitto_tls_set, mosquitto_tls_opts_set 설정 함.
 * app과 자동배포가 안되는지 app에서 shared/data에 인증서가 없다. 그냥 public space에 인증서를 sdb pull로 밀어 넣고 해당 path로 접근하게 함.

2014년 7월 8일 화요일

python 문법 중 특이점 대충 정리

python으로 된 코드를 봐야할 상황이 생겨
점프 투 파이썬(https://wikidocs.net/book/1)와
python documentation(https://docs.python.org/3.4/tutorial/index.html)을 보며
특이한 점만 대충 정리함.

문법이 스크립트언어 치곤 기존 c, c++과 유사하고 군더더기 없이 간결함.


[Coding Style]

http://legacy.python.org/dev/peps/pep-0008/

주요 style 권고들
  • Use 4-space indentation, and no tabs. (들여쓰기는 tab이 아닌 4개의 space)
  • Wrap lines so that they don’t exceed 79 characters. (한줄에 79 영문자 너비)
  • Use blank lines to separate functions and classes, and larger blocks of code inside functions. (한줄 띄우기로 function들, class들 구분)
  • When possible, put comments on a line of their own.
  • Use docstrings.
  • Use spaces around operators and after commas, but not directly inside bracketing constructs: a = f(1, 2) + g(3, 4). (콤마, 뒤에 한칸 띄워라)
  • Name your classes and functions consistently; the convention is to use CamelCase for classes and lower_case_with_underscores for functions and methods. Always use self as the name for the first method argument (see A First Look at Classes for more on classes and methods). (클래스 이름은 붙여서 쓰되 첫글자는 대문자, function/method는 소문자와 '_'의 조합, method들의 첫 argument는 'self'임)
  • Don’t use fancy encodings if your code is meant to be used in international environments. Python’s default, UTF-8, or even plain ASCII work best in any case. (UTF-8 encoding 기본 사용)
  • Likewise, don’t use non-ASCII characters in identifiers if there is only the slightest chance people speaking a different language will read or maintain the code.


[String]

. 짝만 맞으면 ', " 를 혼용해서 사용 가능

>>> 'spam eggs'  # single quotes
'spam eggs'
>>> 'doesn\'t'  # use \' to escape the single quote...
"doesn't"
>>> "doesn't"  # ...or use double quotes instead
"doesn't"
>>> '"Yes," he said.'
'"Yes," he said.'
>>> "\"Yes,\" he said."
'"Yes," he said.'
>>> '"Isn\'t," she said.'
'"Isn\'t," she said.'


[Flow Control]

'{', '}' 가 없고 ':'와 들여쓰기를 사용 함.

>>> x = int(input("Please enter an integer: "))
Please enter an integer: 42
>>> if x < 0:
...     x = 0
...     print('Negative changed to zero')
... elif x == 0:
...     print('Zero')
... elif x == 1:
...     print('Single')
... else:
...     print('More')
...

for each 지원

>>> # Measure some strings:
... words = ['cat', 'window', 'defenestrate']
>>> for w in words:
...     print(w, len(w))
...
cat 3
window 6
defenestrate 12

range(start, stop[, step]) 함수가 있어 for문에서 활용 가능

range(5, 10)
   5 through 9

range(0, 10, 3)
   0, 3, 6, 9

range(-10, -100, -30)
  -10, -40, -70

continue, break와는 다르게
아무것도 안하고 넘어가는 pass가 있음
C에서 ';'와 같은...

>>> class MyEmptyClass:
...     pass
...


[Function]

'def 함수이름(argument) : '로 시작

>>> def fib(n):    # write Fibonacci series up to n
...     """Print a Fibonacci series up to n."""
...     a, b = 0, 1
...     while a < n:
...         print(a, end=' ')
...         a, b = b, a+b
...     print()
...
>>> # Now call the function we just defined:
... fib(2000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597

default argument는 존재하고 사용법 비슷

Arbitrary Argument는 '*'를 argument 앞에 붙임. C는 '...'

>>> def concat(*args, sep="/"):
...    return sep.join(args)
...
>>> concat("earth", "mars", "venus")
'earth/mars/venus'
>>> concat("earth", "mars", "venus", sep=".")
'earth.mars.venus'

Lambda 존재

>>> def make_incrementor(n):
...     return lambda x: x + n
...
>>> f = make_incrementor(42)
>>> f(0)
42
>>> f(1)
43


[Module]

xxxx.py로 저장을 하고 module의 이름은 __name__ 변수에 저장됨.

> fibo.py

# Fibonacci numbers module

def fib(n):    # write Fibonacci series up to n
    a, b = 0, 1
    while b < n:
        print(b, end=' ')
        a, b = b, a+b
    print()

def fib2(n): # return Fibonacci series up to n
    result = []
    a, b = 0, 1
    while b < n:
        result.append(b)
        a, b = b, a+b
    return result

>>> import fibo

>>> fibo.fib(1000)
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fibo.fib2(100)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__
'fibo'

script로 실행 시 "__main__" 값이 저장되므로
이를 이용해서 스크립트 실행 관련 처리를 할 수 있음.

python fibo.py <arguments>

if __name__ == "__main__":
    import sys
    fib(int(sys.argv[1]))

$ python fibo.py 50
1 1 2 3 5 8 13 21 34

import로는 실행 안됨.

>>> import fibo
>>>


[Scope]

scope를 확인할 수 있는 예제 scope_test()를 실행할 시점에는 global scope에 spam이 없음.
do_local()에서는 scope_test()내의 spam을 수정하는 것이 아니라 do_local()내의 spam을 수정하는 거고 do_nonlocal()에서는 nonlocal이 scope_test()의 spam에 binding을 시킴.
그리고 do_global()의 glocal keyword는 global scope의 spam에 binding 하게 되어 global scope에 spam 변수를 assign?

def scope_test():
    def do_local():
        spam = "local spam"
    def do_nonlocal():
        nonlocal spam
        spam = "nonlocal spam"
    def do_global():
        global spam
        spam = "global spam"
    spam = "test spam"
    do_local()
    print("After local assignment:", spam)
    do_nonlocal()
    print("After nonlocal assignment:", spam)
    do_global()
    print("After global assignment:", spam)

scope_test()
print("In global scope:", spam)


[class]

class ClassName:
    <statement-1>
    .
    .
    .
    <statement-N>

생성자 : __init__
소멸자 : __del__
모든 method의 첫번째 argument는 self

class Bag:
    def __init__(self):
        self.data = []
    def add(self, x):
        self.data.append(x)
    def addtwice(self, x):
        self.add(x)
        self.add(x)

상속 :
'class child(parent[, parent]*) :'

class DerivedClassName(BaseClassName):
    <statement-1>
    .
    .
    .
    <statement-N>

private variable 없음.
다만 '__'를 붙여서 private 처럼 생각하고 사용하는 방법은 있음.

class Mapping:
    def __init__(self, iterable):
        self.items_list = []
        self.__update(iterable)

    def update(self, iterable):
        for item in iterable:
            self.items_list.append(item)

    __update = update   # private copy of original update() method

class MappingSubclass(Mapping):

    def update(self, keys, values):
        # provides new signature for update()
        # but does not break __init__()
        for item in zip(keys, values):
            self.items_list.append(item)

연산자 오버로딩 :
def __add__(self, other) :



[Exception Handling]

try, except(as) 로 에러를 catch함.
raise로 exception 발생 시킬 수 있음.

import sys

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except IOError as err:
    print("I/O error: {0}".format(err))
except ValueError:
    print("Could not convert data to an integer.")
except:
    print("Unexpected error:", sys.exc_info()[0])
    raise

clean-up 코드를 위한 finally 있음.

>>> try:
...     raise KeyboardInterrupt
... finally:
...     print('Goodbye, world!')
...
Goodbye, world!
KeyboardInterrupt





2014년 7월 5일 토요일

[link] 공개키 암호 방식 (Public Key Infrastructure) 설명 link들 모음

SSL/TLS 관련 내용을 찾아보다 공개키 암호 방식 관련 내용이 나와 찾아봄.
여러번 배워도 항상 이해하지 못하고 까먹었던 관계로 괜찮은 링크를 정리함.


[공개 키 암호 방식, wikipedia]

http://ko.wikipedia.org/wiki/%EA%B3%B5%EA%B0%9C_%ED%82%A4_%EC%95%94%ED%98%B8_%EB%B0%A9%EC%8B%9D

공개 키 암호 방식의 원리는 위 링크에서 다음과 같이 설명하고 있음.
초기 암호화 방식의 경우 소수를 골라 비밀 키(private key)를 만들고 비밀키의 곱을 공개 키(public key)를 사용함.  충분히 큰수의 소인수 분해를 하기에는 시간과 비용이 많이 소요 되므로 안정성이 완벽하지는 않지만 보장됨. 


공개 키 암호 방식은 출제자만이 알고 있는 특정한 종류의 정보(비밀 키) 없이는 매우 풀기 어려운 수학적 문제(공개 키)를 바탕으로 만들어진다. 키를 만드는 사람은 이 문제(공개 키)를 일반에 공개하고 특정한 정보(비밀 키)는 자신만이 알수 있도록 숨긴다. 그러면 어떤 사람이건 이 문제를 이용해 메시지를 암호화하면 키를 만든 사람만이 이 문제를 풀어 원래 메시지를 해독할 수 있다.
RSA 암호와 같은 초기 암호들은 두 개의 큰 소수를 곱한 숫자를 문제로 사용하였다. 사용자는 임의의 큰 소수를 두 개 골라 비밀 키로 삼고 그 곱한 값을 공개 키로 공개한다. 큰 수의 소인수분해는 대단히 풀기 어려운 문제에 속하기 때문에 다른 사람들은 비밀 키를 알 수 없을 것이라는 사실이 보장된다. 그러나 최근 이 분야의 연구가 크게 진전되어 RSA의 안전성을 보장하기 위해서는 수천비트 이상의 큰 소수를 키로 사용해야 한다.
또 다른 종류의 문제로는 a와 c가 알려진 상태에서 방정식 ab = c의 해 b를 구하는 문제가 있다. 실수나 복소수에 대해서는 로그 함수를 이용해 이 문제를 쉽게 풀 수 있다. 그러나 유한군에서는 이런 문제를 풀기가 어려운 것으로 알려져 있으며 이런 문제를 이산 로그 문제라 부른다. 타원곡선암호를 비롯한 여러 가지 공개 키 암호들이 이산 로그 문제를 바탕으로 만들어져 있다.


[RSA 원리에 대한 자세하고 친절한 수학적 설명]
http://www.parkjonghyuk.net/lecture/modernCrypto/lecturenote/chap05.pdf

위 링크의 PT에서는 RSA의 수학적 설명이 친절하게 조곤조곤 설명해 주고 있음. 중학교 때 배웠던 내용이 기억이 안날 경우 아래 슬라이드를 보면서 파악하면 좋을 듯


[공개 키 암호화 이해]
http://technet.microsoft.com/ko-kr/library/aa998077

동작 방식과 디지털서명, 메세지 암호화에 대해 그림과 상세한 설명을 제공하고 있음.시간을 두고 읽어보는게 좋겠다.
각 절차에 대한 설명과 과정에서 사용되는 방법에 대한 설명이 있음.
예를 들어 서명에서 해시를 사용하는 이유와 메세지 암호화 시 공개 키가 아닌 일회성 세션 키(대칭 키)를 사용하는 이유가 암호화/복호화시 비용 절감이라는 것들에 대해서도 자세히 설명해 주고 있음.

(그림)


[공개 키 기반 암호화와 공인인증관련 설명]
http://crazia.tistory.com/entry/PKI-PKI-%EC%9D%98-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90-%EA%B0%84%EB%8B%A8-%EC%84%A4%EB%AA%85

공개 키 기반 설명과 실제 사용하고 있는 공인인증과 공개 키 기반 암호화의 매칭도 설명해주고 있음.