암호화 프로그래밍(Cryptography Programming)

권도균
대전 광역시 유성구 가정동 34
데이콤 연구소 전자지불 프로토콜 연구팀
E-mail : dgguen@madang.dacom.co.kr
URL : http://madang.dacom.co.kr/dgguen/
Abstract:
인터넷상에서의 보안을 확보하는 길가운데 정보를 암호화해서 보안을 확보하는 방법이 점 점 중요한 요소로 부각되고 있다. WWW보안(WWW Security)프로토콜, 전자우편보안 (PGP, PEM, S/MIME), 네트웍레이어보안(Ipsec, SSL, GSSAPI)등 암호화를 응용한 보안응용시스 팀들 이 많이 등장하고 있다. 이런 모든 암호화응용시스팀에는 기본적인 암호화 프로그래 밍기법이 공통적으로 사용되고 있다. 이런 암호화응용시스팀을 만들기위한 공통적인 기술인 암호화프로그 래밍을 설명한다.

Keywords:
Cryptography, programming, RSA, DES, Signature

목차

1. 서론- 방화벽으로 해결할수 없는 숨바꼭질
1.1 Internet Attack
1.2 방지법
1.3 암호화 시스팀
2. 암호화 응용시스팀
2.1 Transport Layer Security : IPSec, SSL, GSSAPI, PCT
2.2 Secure-Mail
2.3 Secure-Shell(SSH)
2.4 WWW Security
2.5 Secure-Phone
2.6 Desktop-Security Tool
3. 암호화 개념
3.1 Symmetric Cryptography
3.2 Asymmetric Cryptography
3.3 Message Diegest
3.4 Digital Signature
3.5 암호화 알고리즘과 키이 길이
4. 암호화 라이브러리
4.1 RSAEURO/RSAREF
4.2 Microsoft CryptAPI
4.3 SSLeay
4.4 PGP
4.5 JAVA Crypto
5. 암호화 프로그래밍 - RSAEURO/RSAREF중심으로
5.1 Symmetric Cryptography Programming
5.2 Asymmetric Cryptography Programming
5.3 Message Digest Programming
5.4 Digital Signature Programming
5.5 High Level API
5.6 암호화 프로토콜
5.7 기타 고려할 점
6. 결론

 

1. 서론- 방화벽으로 해결할수 없는 숨바꼭질

컴퓨터 보안은 두가지 방향에서 접근할 수 있다. 시스팀보안과 자료의 보안이다. 그러나 실제로 컴퓨터 보안을 생각할때 긍국적으로는 자료의 보안을 목적으로 하는 경우가 많다. 즉 시스팀보안 역시 시스팀자체, 즉 디스크, 오퍼레이팅시스팀등의 파괴를 방지하는 일보다 는 실제로 그 시스팀 내부에 있는 정보 혹은 자료가 누설되지 않도록 하는 것이 주된 목적 이 되고 있다. 오늘날에는 백업기술의 발달, 컴퓨터 하드웨어등의 발달로 시스팀자체보다는 그 속에 들어있는 정보가 더 비 싸기 때문일 것이다.
일예로 96년 9월에 밝혀진 미국CIA의 유럽연합정부 컴퓨터시스팀 해킹사건은 전세계적 으로 논 란이 되는 컴퓨터보안의 중요성을 다시 한번 일깨워주는 사건이라 하겠다. 미국은 유럽정부의 컴퓨터를 해킹해서 얻은 정보를 바탕으로 유럽과의 통상협상에서 유리한 위치 를 확보했으며 최 근의 통상협상에서 많은 것을 얻었다고 한다.

국내에는 보안하면 방화벽(Firewall)을 최대의 해결책이라고 생각하는 경향이 있다. 그러 나 방 화벽(firewall)은 가장 초보적인 보안 해결책이라고 말할수 있겠다. 방화벽은 마치 건물 주위에 담 장을 쌓는 것과 같다. 그러나 문이 없는 건물은 있을수 없으므로 문을 만들어야 하며, 이 문이 바 로 보안의 허점이 될수 있다. 담을 쌓는다고 사람이 왔다 갔다 하지 않는 것은 아니듯이 방화벽 이 있다고해서 정보가 네트웍을 타고 해당 컴퓨터와 통신하지 않는것 은 아니므로 방화벽은 가장 초보적인 보안시스팀이라고 할수 있을 것이다. 방화벽식의 보 안을 해결하려한다면, 가장 좋은 방법은 바로 해당 컴퓨터의 랜카드/모든 통신포트를 제거 하고 네트웍으로부터 분리시켜 혼자두 는 방법이다. 이런 방화벽이 해결하지 못하는 숨바 꼭질을 바로 암호화 기술로 보완 해결해야 한다.

1.1 Internet Attack

인터넷상의 보안침투는 앞에서 이야기한 대로 두가지로 볼수 있다. 하나는 시스팀내 부에 불법적인 사용권(계정)을 획득해 시스팀을 불법적으로 사용하면서 정보를 얻는 방 법이고, 두번째는 네트웍상에 전송되는 정보를 가로채는 방법(sniffing)으로 정보를 획득 하는 방법이 있 을수 있다. 일반적으로 해커는 이 두가지 방법을 서로 복합적으로 이 용해 정보를 얻어내는 방 식을 취한다. 즉 네트웍상에서 오가는 데이타를 가로채서 특 정 컴퓨터의 사용자와 패스워드를 취득한 후 해당 컴퓨터에 로긴해서 수퍼유저 권한을 알아내면 더 많은 정보를 얻어낼수가 있으므 로 더 많은 정보를 얻어낸다. 특히 후자 의 경우 즉 네트웍 스니핑(sniffing)은 방화벽으로는 전 혀 보호하지 못한다. 네트웍을 타고 전송되는 정보는 주로 전자메일, 텔넷(telnet), 파일전송 (FTP), WWW검색등의 정보 인데 이 가운데 텔넷, 파일전송등은 사용자계정과 패스워드가 노출 될수 있는 형태로 전송이 되므로 시스팀의 사용권을 획득 당할수 있는 가능성이 더욱 커진다.
96년 9월에 국내에서 일어난 인터넷 해킹(sniffing)을 이용한 홈뱅킹도용사건은 이런 예의 사건 이라고 할수 있다. 엄밀한 의미에서 그 사건은 스니핑이라고 할수 없긴 하지 만 스니핑과 매우 유사한 방법이라고 할수 있다.

1.2 방지법

이런 네트웍해킹을 방지하는 가장 좋은 방법은 앞에서 이야기 한 대로 네트웍을 전혀 쓰지 않는 것이다. 전자메일도 사용하지 않고, 네트웍을 전혀 연결하지않고 컴퓨터를 콘솔에서 혼자만 쓰는 것이다. 가장 안전한 방법이긴하지만 현실적이진 못한 방법이라 하겠다. 다음 대안은 방화벽을 설치하여 일정한 법칙을 따라 제약을 가한 보안시스팀 을 사용하는 방법이 있을수 있지만 여전히 네트웍상의 정보의 보호와 시스팀보호에서 는 만족스러운 해결책이라고 보긴 어렵다.
가장 안전한 방식은 모든 정보를 암호화하는 방법이다. 그것도 상당히 강력한 암호 화기술과 상당히 긴 키이(Key)로 암호화를 해서 저장하거나 전송하는 방법이다. 이렇 게 해 둘 경운에는 누군가가 내 컴퓨터 파일이나 전송되는 정보를 훔쳐보거나 취득할 까를 두려워 할 필요가 없다. 키이(Key) 없이는 어쨋든 해당 정보를 해독할수가 없을 테니까. 그러나 암호화 방식에도 그 구현방식에따라 여러가지 허점이 발생하기도 하지 만, 현재로는 일반적인 고도의 보안시스팀을 위한 가장 적절한 해결책으로 알려져 있 고 이용되고 있다. 특히 정보를 네트웍, 그것도 개방된 TCP/IP와 같은 안전하지 못한 네트웍을 통해 전송하는 전자우편이나 텔넷과 같은 응용시스팀에는 암호화이외에는 다 른 대안이 없다고 할수 있을 것이다.
최근 알려진 텔넷과 같은 시스팀에 응용되는 S/Key혹은 One Time Password와 같은 방 식은 암호화방식이라고 할수는 없고 다만 패스워드를 클라이언트와 서버가 상호 약속 에 의해 자주 변경하는 방식을 말한다. 이는 다만 패스워드를 매번 변경함으로써 패스 워드를 스니핑해서 취득했다하더라도 다음에는 다른 패스워드가 유효하므로 과거의 패 스워드로는 시스팀에 로긴할수 없기때문에 시스팀을 보호할수 있는 시스팀이다. 그러 나 이것은 다만 패스워드를 자주 바꾸는 방법이기때문에 패스워드이외의 다른 정보의 보호에는 도움이 되지 않는다. One Time Password등은 일반적으로 네트웍응용시스팀보 다는 로칼시스팀에 로긴하는 방법에서 IC카드와 응용해서 많이 사용하는 방법으로 네 트웍상의 스니핑에는 적합하지 않는 방법이라고 할수 있다.
예를 들어 설명하면 누군가가 인터넷상에서 S/Key를 이용해 PC통신에 들어왔다고 치 자. 그리고 그것은 누군가가 스니핑해서 정보를 훔쳐보고 있다고 가정하면, PC통신에 서 다시 이사람은 특정은행의 홈뱅킹으로 들어가서 계좌이채를 하고 비밀번호를 입력 한다고 하면 이 사람의 PC통신용 패스워드는 보호되겠지만 그 이외에 PC통신을 사용 한 내용이나 홈뱅킹에 들어가서 입출력한 모든 내용은 다 노출이 되고 말게 된다.

1.3 암호화 시스팀

네트웍상에서 주고받는 정보 혹은 컴퓨터에 저장된 정보를 보호하는 암호화시스 팀에서 중심적으로 고려하는 주된 관점은 다음 세가지이다. 기밀성은 자료의 내용을 원치않는 제 3자에게 노출되지 않도록 방지하는 것을 말한다. 이를 위해서는 자료의 내용을 암호화하는 방법을 사용한다.
통합성은 자료의 내용을 노출되지는 않는다하더라도 제 3자가 자료의 내용을 수 정하거나 첨가하거나 순서를 바꾸거나하는 것을 방지하기위한 기술이다. 이런 것 을 방지하기위해서 주로 메세지의 체크섬 혹은 메시지 다이제스트(Message Digest) 를 구해 둠으로써 메시지의 수정여부를 나중에 확인할 수 있도록 하는 것이다.
부인방지(Non-Repudiation) 혹은 송신자 신분확인방법은 메시지는 디지탈 형태로 만들어져 있으므로 쉽게 위조할수 있으며 위조된 디지탈 정보를 확인 할 길이 없 다. 그러나 전자서명을 사용하면, 수신자의 입장에서는 메시지의 송신자의 신분을 확인할수 있으며 송신자는 자신이 전자서명을 해서 보낸 내용을 부인할수 없게 된다.
우리는 앞으로 이런 암호화/메시지통합성체크/전자서명등의 기본적인 기능을 뒤 에 실제로 프로그래밍하면서 하나 하나 확인 해 나갈 것이다.

2. 암호화 응용시스팀

암호화기술은 모든 정보통신 분야에 적용할수 있다. 디지탈 정보를 다루는 모든 응용분야 에서 보안이 필요한 분야에는 모두 적용할 수 있게된다. 현재 컴퓨터응용시스팀들가운데 암호화기술이 적극적으로 응용되는 분야를 나열해 보았다.

2.1 Transport Layer Security : IPSec, SSL, GSSAPI, PCT

TCP/IP네트웍 프로토콜이 전적으로 보안에 대한 대책이 없는 프로토콜이었다. 그래서 많은 보안응용시스팀들이 등장하였다. 그러나 각각의 응용시스팀이 보안프로토콜을 적용하다가 보니까 차라리 IP레이어에서 보안이 보장되면 즉 Secure Channel이 보장되면 응용시스팀은 보안문제를 쉽게 해결할 수 있지 않을까하는 발상에서 Transport Layer에서의 Security가 많 이 논의되고 있다.
이 분야의 대표적인 프로토콜로서는 IPSec이다. IP레이어를의 패킷을 암호화해서 전달하 는 아이디어로서 패킷을 암호화하기위한 ESP(Encapsulated Security Payload)프로토콜과 패킷의 인증을 위한 AH(Authentication Header)프로토콜이 중심이다. 대부분의 비대칭형암호화를 이 용한 프로토콜이 그렇듯이 IPSec역시 키교환 혹은 키관리가 골치거리이다. IPSec을 위한 키교환프로토콜로는 ISAKMP/Oakley, SKIP, Photuris등이 제안되고 또 구현되어 있다.
IPSec은 NRL에서 IPv6를 구현하면서 IPSec을 구현했고, IPv4에서도 구현했다. ISAKMP/Oakley는 시스코시스팀(Cisco System)에서 구현하였으며 http://www.cisco.com/public/library/isakmp.html 과 http://web.mit.edu/network/isakmp 에서 구 할수 있다. SKIP은 INCOG와 SUN에서 구현해서 http://skip.incog.com/ 에서 구할수 있다.
IPSec은 향후 IPv6혹은 IPng에 내장되어 향후 일반적으로 사용할수 있을 것이다. IPSec과 관련된 일반적인 정보는 http://www.cs.arizona.edu/xkernel/www/ipsec/ipsec.html 에서 구할수 있 다.
SSL(Secure Socket Layer)은 보안문제에 대해 좀더 일반론적인 접근을 시도했으며 넷스케이 프 네비게이터에 적용되면서 성공적으로 보급된 프로토콜이다. IPSec은 IP datagram즉 각 각의 패킷을 암호화하는데 집중했다면 SSL은 세션, 혹은 채널을 암호화하는 방법을 선택 했다. 그러므로 IPSec은 구현하긴 어렵지만 IP를 사용하는 대부분의 응용시스팀에 적용할 수 있다. 예를 들면 IP broadcasting같은 분야에도 적용할수 있지만 SSL은 연결된 세션만을 지원한다. 그러나 대부분의 네트웍 응용시스팀들에게 잘 적용할수 있었다. 현재 SSL을 이용한 SSL WWW Bowser(Netscape, Microsot Explore), SSL telnet, SSL ftp, SSL News등 다 양한 응용시스팀들이 등장하고 있다. Netscape사는 SSLref라이브러리를 공개했으나 미국외에서 는 아쉽게도 사용할수 없다. 다만 호주의 Eric Young 이 만든 SSLeay가 있다. SSL에 관한 정보는 http://home.netscape.com/newsref/std/SSL.html 에서 얻을수 있다.
이외에도 GSSAPI(rfc-1508, rfc-1509 )는 Generic Security Service Application Programming Interface의 약어로서 암호화 시스팀을 만들기위한 응용시스팀의 프로그래밍 인터패이스를 표준화해서 정의하자는 아이디어에서 출발했으나 현재 구현된 사례가 많지 않다. GSSAPI 관련정보는 http://www.dstc.qut.edu.au/~barton/work/project.html 에 있다.
gssapi구조도

또한 마이크로소프트는 PCT(Private Communication Technology) 프로토콜을 제안했고 최근 PCT 1.0은 SSL 2.0, 3.0과 호환을 유지한다. 관련정보는 http://www.microsoft.com/intdev/security/faq4.htm에 있다.

2.2 전자우편 보안

현재 인터넷을 사용하는 사용자가 가장 많이 사용하는 도구가운데 하나는 바로 전자우편이 다. 많은 사람들이 전자우편을 통해 개인적이거나 사업과 관련된 일들을 하고 있다. 정보 화가 가속될수록 전자우편의 중요성은 점점 강조될 것이다. 또 사용량도 늘어갈 것이며 다 루는 내용도 점차 경제적인거나 정치/외교적인 중요한 내용들이 될 것이다. 이런 관점에서 보안 전자우편시스팀은 매우 중요하게 생각되어져 왔고, 일찍부터 몇몇 시스팀들이 개발되 어 왔다. 대표적인 보안 전자우편시스팀이 바로 PGP(Pretty Good Privacy)( http://www.ifi.uio.no/~staalesc/PGP/)다. PGP는 짐머맨(Zimmermann) 을 중심으로 한 인터넷상의 자원자들이 만든 제품이다. PGP의 가장 큰 특징은 대칭형 암호화알고리즘으 로 DES를 사용하지 않고 IDEA를 사용한다는 것과, RSA Public Key인증구조가 PEM등 국 제표준과는 달리 사이버스패이스의 문화와 밀접하게 비슷한 Trust of Web이라는 구조를 가 지고 있는 점들이다. IETF에서 인터넷 보안 메일표준으로 제정한 프로토콜은 PEM(Privacy Enhanced Mail, RFC1421 - 1424)이다. PEM은 CA(Certificate Authority)등을 요구 하 며 그 사양이 방대하고 복잡해 현실적으로 사용되지 못하고 몇가지 형태로 단순화 되어갔 다. 그 가운데 대표적인 것이 바로 RIPEM(Riordan's Internet Privacy Enhanced Mail)이다. RIPEM은 PEM의 복잡한 사양을 단순화했으며 구현사례도 많이 나와 상당히 보급되기도 했다(http://www.cs.indiana.edu/ripem/ripem-faq). 그러다가 PEM, RIPEM의 복잡성을 단순하게 만들기위해 메일사양보다는 문서의 양식(MIME)만을 정의한 MOSS( )가 제안되었으나 MOSS사양은 너무 유동적이어서 이 사양만으로는 호환성을 유지하기가 쉽지않을 정도 였 다. 최근에는 미국 RSA사가 S/MIME이라는 MOSS와 비슷하지만 상호 호환성에 촛점을 맞 춘 사양을 제안했고 상당수 구현되어 전자우편 보안으로 최근 많이 보급되고 있다. 다음 인용은 S/MIME의 FAQ가운데 한 항목을 번역한 것이다. PGP, PEM, MOSS, S/MIME등을 간략히 비교한 항목이다.
* S/MIME과 PGP, PEM, MOSS와 다른점은 무었인가?

이들 모두는 전자우편의 보안 기법의 일종이다. 모두다 authentication과 privacy를 보장한다. PGP, PEM, MOSS는 각각이 서로 매우 상이하다. 그러므로 이들을 S/MIME과 각각 비교해야 할 것같다. PGP는 사양(specification)이면서 응용프로그램(application)이라고 봐야 할 것 같다. PGP는 사용 자들이 서로 키를 교환하고 서로 인증(trust)을 확립하는 체계이다. 이런 "web of trust"구조는 비 공 식적이기때문에 작은 그룹에는 적용하기 쉽다. 그러나 많은 수의 사람들이 포함된 그룹에서는 관리하기가 쉽지 않게된다. 그러나 S/MIME은 PGP보다는 적응성이 좋고 좀더 보안성이 좋다. S/MIME은 작은 그룹의 사용자들간의 신뢰 구조를 쉽게 구축할 수 있을뿐 아니라 큰 그룹을 구 성하는데도 쉽게 적응하는 구조를 가지고 있다. S/MIME은 많은 전자우편 응용프로그램에 접 목될수 있고 그렇게 하는것이 쉽다. PEM은 IETF RFC 1421-1424까지 정의되어 있다. PEM은 초기의 전자메일 보안 표준이다. PEM은 주로 메시지 포멧과 인증구조를 정의한 것이다. PEM메시지는 7bit텍스트 메시지를 기 반으로 되어있는데 반해 S/MIME은 MIME바이나리 attachment로 동작하도록 설계되었다. 인증 구조를 구성하는 것도 flexible하게 되어있고, 작은 워킹그룹들의 구조를 만드는데 매우 쉽게되 어 있으면서도 인증그룹의 규모에 적합한 대안을 가지고 있다. MOSS는 PEM의 제약을 극복하기위해 만들어진 것으로서 MIME메시지로만 표현하고 나머지 사양은 자유롭게 사용하도록 한 것이다. 그러나 MOSS는 많은 구현 option을 가지고 있어서 두 사람의 MOSS메일 프로그램을 구현하는 사람이 상호 호환되는 프로그램을 만들기가 매우 어렵 게 되어있다. MOSS는 사양(Specification)이라기 보다는 어떤 구조(Framework)정도를 정의했다 고 보는것이 더 좋겠다. 그러나 S/MIME은 상호호완성에 역점을 두고 전자우편에 촛점을 두고 만 들어진 것이다.

2.3 Secure-Shell(SSH)

앞에서 이야기 했듯이 텔넷 혹은 rlogin등은 스니핑기법에 의해 매우 취약한 응용시스팀이 다. 이런 점을 보완하기위해 S/Key등도 제안되었지만 전적인 대안은 될수가 없다. 그러나 SSH, Secure-Telnet, SSLtelnet등과 같이 텔넷 전체 세션을 암호화해서 사용하는 프로토콜들이 제안되었고 실제 사용한다. 이가운데 SSH는 핀란드의 DataFellows (http://www.datafellows.com/) 에서 상용화해서 상당한 보급이 이루어진 제품이다. 이들 Secure-Shell은 로긴명과 패스워드만을 보호하는 것이 아니라(Authentication) 로긴한후 사용 하는 모든 세션을 보호하는 역할(Confidentiality)을 하므로 텔넷상에서의 보안에 완벽한 대안 이라고 할수 있다.

2.4 WWW Security

WWW Security분야는 IETF의 Security Area의 WTS(Web Transaction Security)워킹그룹에서 표 준을 논의 하고 있다. 그동안 EIT의 S-HTTP와 Netscape의 SSL그리고 W3C컨소시움의 SEA등의 프로토콜이 제안되고 논의되고 있으나 현재 S-HTTP만이 working draft상태이다. WWW Security분야에서는 무엇보다도 브라우져를 만드는 회사들(Netscape.Microsoft등)이 선 택하는 보안 프로토콜에의해 표준이 좌지우지된다는 단점이 있다. 현재 Netscape사는 SSL 을 Microsoft사역시 SSL과 PCT를 지원하고 있다. SSL은 현재 버젼이 3.0 사양까지 발표되 어 있으며, PCT는 현재 버젼이 1.0 사양이 발표되어 있다. 그러나 IETF에서는 S-HTTP를 논의하고 있는 중다. 이 분야에 대한 자세한 정보는 http://madang.dacom.co.kr/dgguen/seminar/wwwpay.html을 참고하기 바란다.

2.5 Secure-Phone

암호화된 음성통신 시스팀은 둘로 구분할수 있다. 전통적인 전화시스팀에서 보안을 가미한 전화시스팀이 있을수 있고, 컴퓨터네트웍상에서의 음성통신에 보안을 가미한 시스팀이 있 을수 있다. 전자로는 Bell-Northern 연구소에서 만든 Secure-ISDN전화기 프로토타입이 1987 년에 발표된적이 있고, 미국의 NSA가 설계한 STU-III라는 암호화전화기가 1994년에 IEEE 저널에 발표되었었고 AT&T와 GE가 약 30--40만대 생산해 미국방성관련기관에서 사용한 다고 한다 (Applied Cryptography Second Edition P566).
컴퓨터 네트웍상에서의 음성통신은 일반적으로 Internet Phone등이 알려져 있으나 암호화기 술을 도입한 것은 아니다. 비슷하게 인터넷상에서 음성통신을 가능하게하는 소프트웨어이 면서 암호화기술을 적용해 보안화한 것으로는 Speak Freely와 Netfone(UNIX), Nautilus(http://www.lila.com/nautilus), PGPFone(http://web.mit.edu/network/pgpfone)등이 있다.

2.6 Desktop-Security Tool

일반적으로 자신이 사용하는 개인용 컴퓨터의 파일들을 암호화해서 저장하는 암호화도구들 을 말한다. 이곳에서는 주로 대칭형 암호화 알고리즘만을 사용하며 주로 윈도우즈의 파일 관리자와 연동해서 돌아가도록 만든다. 대표적인 제품으로는 RSA사의 RSA Secure PC(http://www.rsa.com/PRODUCTS/end_user.html)와 핀란드의 DataFellows사의 F-Secure Desktop (http://www.datafellows.com/f-secure/desktop/)등 여러 종류가 있다.

3. 암호화 개념

자 이제는 앞에서 장황하고 길게 이야기한 보안시스팀을 만들기위한 기본기술 즉 암호화란 과연 무엇인가를 알아보도록 하자. 여기서는 암호화기술 알고리즘의 종류와 기능등의 기본 적인 사항을 알아보고 다음부터는 해당 암호화를 실제로 프로그래밍할수 있는 도구들과 프 로그래밍 방법을 알아보도록 하자.

3.1 대칭형 암호알고리즘(Symmetric Cryptography)

대칭형암호 알고리즘은 다음 그림처럼 암호화할때 사용한 키(key)를 암호화된 자료를 복호 화할때 같은 키(key)를 사용하는 것을 말한다. 즉
        Ek( M ) = C
        Dk( C ) = M
여기서 동일한 k키이를 사용해 암호화와 복호화를 하는 암호화 방식을 말한다.
대칭형 암호화 방식은 크게 두가지로 나누어 볼수 있다. 하나는 블럭 암호화(Block Ciper) 와 스트림 암호화(Stream Ciper)로 구분된다.
블럭암호화알고리즘은 암호화할때 자료를 고정된 일정량의 블럭단위로 암호화하기때문에 전체 암호화자료의 크기가 해당 블럭의 배수가 되어야하는 것을 말한다. 블럭 암호화 알 고리즘으로는 등이 있다.

스트림암호화 알고리즘은 자료를 암호화할때 블럭단위로 하지 않는 방법을 말한다. 즉 암 호화하는 자료의 구성과 크기가 다양하고 예측할수 없는 환경일때 적합한 암호화 방법이다.
스트림 암호화 알고리즘으로는

등이 있다.

대칭형 암호화알고리즘의 역사는 오래되었고 다양한 알고리즘이 개발되어 있다. 그러나 블럭 암호화알고리즘의 단점은 네트웍 환경에서는 사용하기가 어렵다는 사실이다. 즉 자료 (M)를 특정비밀키(K)로 암호화해서 암호화된 자료(E)를 네트웍을 통해 다른 곳에 전달했다 고 치자 암호화된 자료 (E)는 암호화가 되었기때문에 안전하게 전달할수 있을 것이다. 그러 나 암호화된 자료(E)를 받은 측에서 이를 풀기위해서는 비밀키(K)가 있어야 할 것이다. 그 러나 이 비밀키(K)를 어떻게 안전하게 전달할 수 있는가하는 숙제가 생긴다. 이런 문제는 대칭형 암호화 기법의 단점이 된다.

3.2 비대칭형 암호화 알고리즘(Asymmetric Cryptography)

비대칭형 암호화기법은 자료를 암호화할때 사용하는 키이와 복호화할때 사용하는 키이가 서로 다 른 암호화기법을 말한다. 즉 키이가 쌍으로 존재해 한쪽으로 암호화를 하면 다른 키이로만 복호화가 가능하게 된 다. 일반적으로 비대 칭형 암호화시스팀을 이용할때 두개의 키이 가운데 하나는 일반에게 공개하고 하나의 키이는 자 신만이 안전하게 보 관한다. 이때 일반에게 공개된 키이를 가지고 퍼블릭키이(Public Key)라고하고, 자신이 가지고 있 는 키이를 개인키 (Private Key)라고 부른다.
만일 외부의 어떤 다른 사람이 어떤 자료(M)를 네트웍을 통해 안전하게 전달하기 위해 비대칭 형 암호화 알고리즘 을 사용한다고 할때 그는 나의 퍼블릭키이(Public Key)를 이용해 자료를 암호화해 암호화된 자료 (C )를 나에게 보낸다. 네트웍상의 누구도 나의 개인키(Private Key)없이는 암호화된 자료를 해독할수 없으므로 안전하 게 전달된다. 전달된 암호화된 자료는 나만이 가진 개인키(Private Key)를 이용해 복호화가 가능하므로 나만이 그 암 호화된 자료를 해독 해서 원래의 자료(M)을 얻을수 있다. 이것이 일반적인 비대칭형 암호화기법을 이용하는 방법이 다. 그래서 비대칭형 암호화기법을 퍼블릭키이(Public Key) 암호화방식이라고 하기도 한다.
비대칭형, 퍼블릭키이 암호화방식은 역사도 짧고 가능한 알고리즘도 적다. 또 대칭형 암호화알 고리즘보다 처리속 도가 매우 느리기때문에 통상적으로 많은 자료를 암호화하는데는 적합하지 않은 방법이라는 단점 도 있다. 비대칭형 암호화 알고리즘으로는

등이 있다.
이들 알고리즘 가운데 Diffie-Hellman방식과 RSA알고리즘이 거의 표준처럼 많이 사용되어지고 있고 특히 RSA가 주로 사용되는 비대칭형 암호화 기법이다.

3.3 Message Diegest

메시지다이제스트 알고리즘은 자료의 내용의 체크섬을 구하듯이 자료를 해쉬처리를 한후 각 자 료에 대응되는 일정 길이의 해쉬를 구하는 알고리즘이다. 메시지 다이제스트는 해당 자료와 일대일로 매핑이 되기때 문에 자료의 내용 을 증명할수 있는 코드로서 활용된다. 즉 어떤 자료(M)을 해쉬함수를 통해 메시지다이제스트를 구하면 해당 메시 지다이제스트를 이용해 자료의 수정/순서변경/삭제/첨가등 자료의 통합성을 체크할수 있다.
특히 메시지다이제스트를 구하는 해쉬함수는 단방향해쉬(One way Hash)함수로서 생성된 메시 지다이제스트로부터 원 래의 메시지를 추론할수 없는 해쉬를 사용하기때문에 안전하다고 할수 있다.

메시지다이제스트용 알고리즘으로는

등이 알려져 있다.

3.4 Digital Signature

전자서명(Digital Signature)은 특정한 암호화 알고리즘은 아니다. 다만 위에서 언급한 암호화기 법들을 응용한 것 가 운데 하나이다. 다만 전자서명이 일반적인 보안응용시스팀의 기본적인 요소로 간주되기때문에 이 곳에서 언급하려 한다.
전자서명을 이야기할때 컴퓨터 옆에 전자펜과 패드가 있어서 어떤 자료에 서명을 하려면 이 펜 을 이용해 패드에 사인을 하면 그 서명의 이미지가 디지탈형태로 문서와 함께 보관되는 것을 상상하는 사람들이 있 었다. 또 그런 비 상식적인 시스팀을 구현한 사례도 있다. 그러나 그 서명이미지는 디지탈형태의 자료이기 때문에 100% 똑같이 복제 가 가능하다는 사실을 잊지 말아야하며 종이에 서명한 것보다 더 위험한 방식이다.
전자서명은 앞에서 언급한 그런 것이 아니다. 컴퓨터상에서 디지탈 형태로 이루어지는 전자서 명의 기본적인 아이 디어는 자료의 내용의 수정/병경을 증명할수 있는 방법(메시지다이제스트등)과 메시지의 생성자 를 확인할수 있는 방 법(비대칭형 암호화알고리즘의 개인키를 이용해 암호화하는등)을 섞어서 서명의 효과를 내는 전 자적인 방법이다.


전자서명의 흐름

전자서명의 기본적인 흐름은 다음과 같다.

송신자측
  1. 자료를 생성한다.
  2. 자료의 메시지다이제스트를 구한다
  3. 메시지다이제스트를 자신의 개인키(Private key)로 암호화해 자료에 덧붙인다.

수신자측

  1. 수신한 자료의 메시지다이제스트를 구한다.
  2. 수신한 자료에 덧붙여온 암호화된 메시지다이제스트를 송신자의 퍼블릭키이로 푼 다.
  3. 자료로부터 구한 메시지다이제스트와 덧붙여온 메시지다이제스트를 비교한다.
  4. 비교한 다이제스트가 같으면 메시지가 송신자가 보낸것과 자료의 내용이 수정되지 않은 것이 증명된 다.

3.5 암호화 알고리즘과 키이길이

암호알고리즘의 안전도를 체크하는 이론은 여러가지 방법이 있다. 그러나 일반적으로 많이 알려 진 알고리즘들은 수학적으로는 안전도가 확보된 알고리즘이다. 그러나 그런 알고리즘도 사용하는 키의 길이에따 라 오늘날 사용하기 에 적합한가 위험한가를 확인한다.
키의 길이를 가지고 알고리즘의 안전도를 이야기하는 것은 Brute-force attack에 대비한 논의이 다. Brute-force attack은 가능한 모든 키를 가지고 자료를 복호화해 보는 방법이다. 컴퓨팅파워가 높지못했던 1970년대 /80년대에서는 이 문 제가 큰 문제가 되지 못했다. 그러나 90년대로 들어와서 컴퓨팅파워가 증가된 오늘날에는 웬만한 길이의 키에 대해 서는 짧은 시간내에 모든 가능한 키이를 다 테스트해 볼수 있는 정도로 키의 길이가 중요한 요소 가 되었다. 예를 들면 키의 길이가 8bit라면 28 개 즉 256개의 가능한 키가 있을수 있다. 256개의 가능한 8bit짜리 키이만을 테스트하 면 그 가운데 하나는 옳은 키가 있을 것이다. 만일 키이가 64bit길이이면 264 개의 가능한 키이가 있을수 있다. 이때 는 만일 1초에 백만개의 키이를 체크할수 있는 수퍼컴퓨터가 있다면 평균 2285년간 계산해야 옳 은 키를 찾을수 있 을 것이다. 만일 키이의 길이가 128bit이라면 1025 년이 걸릴 것이다. 우주의 나이가가 1010 년이 라고 하니까 이 기간 은 정말 긴 기간이라고 할수 있겠다.
그렇다면 대표적인 암호화 알고리즘인 DES를 가지고 이야기해 보자. DES는 8byte의 키이를 사 용하지만 64bit전체 를 키이로 사용하는 것이 아니라 8bit는 체크섬용으로 사용하고 56bit만을 키이로 사용한다. 즉 DES의 키이의 길이 는 56bit이다. 1993년 1994년에 Michael Wiener(Aplied Cryptography Second Edition P153)는 1 백만 달러짜리 DES전용 반도체를 만들면 평균 3.5시간이면 DES키를 찾을수 있다는 발표를 한 적이 있다.
비대칭형 암호화 알고리즘의 키이 길이는 앞에서 말한 대칭형 암호화기술의 키의 길이와 좀 다 르다. 비대칭형 암 호화 알고리즘은 큰 솟수계산등에 의존하기때문에 대칭형 암호화기술과는 다른 컴퓨팅 파워를 요 구하며 일반적으로 RSA알고리즘의 경우 512bit RSA키이는 상업적으로 사용하는 암호화기술에는 적합하지 않는 것 으로 알려져 있고 최 소한 768bit이상 길이의 키이를 사용할 것을 권하고 있다.
Bluce Schneier(Aplied Cryptography Second Edition, P162, P 167)가 제안하는 키의 길이는 다 음과 같다.

* 비대칭형 암호화알고리즘의 권장 키길이
년도
개인적 용도사용기업의 사용 정부/군
1995년
768 12801536
2000년
1024 12801536
2005년
1280 15362048
2010년
1280 15362048
2015년
1536 20482048

* 대칭형 암호화 알고리즘의 권장 키길이
사용 용도유효기간최소한의 키길이
군 정보분/시간56-64bit
제품안내/뉴스/회사합벙등일/주 64bit
장기적인 기업의 계약등년 64bit
무역 기밀10년112bit
핵폭탄 비밀40년이상 128bit
첩보원의 신분비밀번호50년이상 128bit
개인적인 비밀50년이상 128bit
정부 대사관 업무65년이상 적어도 128bit이상
정부 비밀100년 적어도 128bit이상

미국정부는 암호화기술을 무기의 일종으로 간주하기때문에 외부로의 수출을 금지하고 있다. 이 제한은 ITAR(International Traffic in Arms Regulations)법으로부터 제한을 받는다. 이 제한은 1940년 대 나토(NATO)의 CoCom(Coordinating Committee for Multilateral Export Control)으로부터 파생된 제한이다. 미 국내에서도 이 제한이 헌법 의 위배여부를 가리는 작업도 진행중이며 여러가지 논쟁이 있긴하지만 아직 ITAR제한으로 미국 에서 만들어지는 모 든 암호화 기술/장비/소프트웨어는 약한 암호화 기술인 40bit길이이하의 키/512bit이하의 RSA키 이를 가진 암호화장 비/소프트웨어만을 수출할수 있게 되어 있다. 이 규정은 암호화 방식이 bulk encryption이냐 아 니냐에 따라 약간의 예외는 있긴하지만 미국정부의 까다로운 심사때문에 수출허용이 매우 어려우며 시스팀의 전체 소 스코드와 함께 수 출하는 것은 불가능한 상태이다.
암호화 기술의 수입과 관련된 의견으로 본인이 WSP(Web Security and Payment)메일링리스트 에 보낸 짧은 메일을 하 나 소개한다.


X-Sender: dgguen@164.124.5.1
Date: Wed, 02 Oct 1996 10:45:12 +0900
To: wsp@cre.co.kr
From: Douglas Guen 
Subject: 미국의 암호화 수출 관련 변경에 대해

권도균입니다.
오늘 로이터공급기사로 한겨레에 작은 기사로 미국의 "암호화수출허용"이라는
기사가 나와서 내용을 찾아 본것입니다.
요약하면,
           64bit키길이의 암호화 수출허용
           대신 key escrow정책을 수용해야함.
           (즉 제 3자가 풀수 있는 암호기술만을 허용한다는 기존의 정책고수)
        
별 새로운 이야기는 아닌듯합니다.

암호화기술의 수출이라할때 여전히 던져야할 check point는
        1. 알고리즘의 설계가 안전한지 증명할수 있는가?
           (DES와 같이 trapdoor의 존재에 대한 의심이 있는가?)
        2. 소프트웨어/하드웨어의 Full Source를 입수할 수 있는가?
        3. Key 길이 제어가 가능한가?
등등입니다.
여전히 이런 관점에서는 미국에서 수출되는 암호화기술/장비/소프트웨어는 0점
이라 할수 있겠지요?

4. 암호화 라이브러리

지금까지 서론이 너무 길었다. 암호화 기술전반에 대한 소개가 너무 장황했지만 이런 배경에서 암호화 프로그래 밍이 의미를 가질것 같아서 비교적 상세히 설명을 하였다. 좋다 암호화 방식은 대칭형/비대칭형 이 있고, 해시함수, 전자서명등이 있다는 것은 잘 알았다. 그리고 그것을 이용해 보안 응용시스팀, Secure Telnet등을 만들수 있다는 것도 알았다. 그런데 문제는 그렇다면 그런 암호이론을 실제적인 프로그래밍으로 연결하려면 이론/알 고리즘을 프로그램화 하는 작업이 필요하다. 그러나 이 작업은 그리 쉽지않다. 알고리즘이 있다하더라도 그것을 구현하 는 작업은 일반적 인 프로그래밍을 하는 것과는 달리 매우 까다롭고 복잡한 일이 된다. 이 자리에서는 어떤 수학 적인 알고리즘을 구 현하는 것에 집중하는 것이 아니라 그런 알고리즘을 구현한 라이브러리가 있다고 할때 그 라이브 러리를 이용해 응 용시스팀을 만드는 곳에 집중하려고 한다. 그러자면 사용할 라이브러리가 있어야하는데 그것은 다음과 같다.

4.1 RSAEURO/RSAREF

RSAEURO/RSAREF는 거의 동일한 사용자 인터패이스를 가지고 있는 암호화 라이브러리이다. 기본적으로 RSAREF 는 미국의 RSA사가 퍼블릭도메인으로 RSA알고리즘, DES, MD5등의 알고리즘을 C코드로 구현 해서 공개한 라이브 러리이다. 버젼은 현재 94년도에 발표된 2.0으로서 일반적인 암호화 알고리즘은 사용할수 있게 되어 있다. RSA 사는 RSAREF 2.0이후 지속적인 발전을 중단하고 BSAFE등 새로운 암호화 개발도구를 개발해 이 쪽으로 집중을 하 고 있으며 RSAREF는 발전을 하지 못하고 있는 상태이다. RSAREF의 API(Application Programming Interface)는 매우 명료하고 간단해서 암호화응용시스팀을 개발하는데 쉽게 적용할수 있도록 되어있다. 그러나 불 행하게도 RSAREF 나 BSAFE등은 미국내의 RSA사가 개발한 암호화개발도구로서 미국밖에서의 사용은 전적으로 불 가능한 상태이다.
RSAEURO는 95년부터 개발된 암호화 개발도구로서 현재 1.03, 1.05버젼등이 나오고 있다. RSAEURO의 특징은 RSAREF와 거의 완벽하게 호환성을 유지하면서 기타 여러가지 기능들을 추가한 암호화개발 도 구이다. 다만 RSAEURO는 유럽, 영국에서 개발된 암호화라이브러리이기때문에 미국의 수출금지법에 적용을 받지 않고 미국밖에 서 사용이 가능하다는 점이 있다. 그러나 RSAEURO는 미국밖에서는 사용이 가능하지만 상용이 며, 미국내에서 사 용하려면 미국 RSA사의 라이센스를 얻어야한다. 이 문제는 모든 RSA관련 암호화라이브러리에 공통적으로 적용되 는 문제이기도 하다.
RSAEURO/RSAREF는 매우 쉽고 명쾌한 API를 가지고 있기때문에 아래의 프로그래밍방법에서 는 이를 중심으로 설 명하려고 한다.

4.2 SSLeay

SSLeay 호주의 E A Young에 의해 만들어진 SSL 2.0 라이브러리이다. SSLeay는 전적으로 SSL프로토콜을 구현하 기위해 만든 것이지만 그 속에 crypto.a라는 라이브러리를 생성하며 이 속에는 앞에서 언급한 암 호화 알고리즘이 대 부분 포함되어 있다. 그러나 SSLeay는 SSL프로토콜을 위해 만든 패키지로서 SSL API는 비교 적 명확하게 사용할수 있도록 되어있으나 그 하부의 암호화 알고리즘에 대한 API는 문서화나 설명이 충분치 못해서 SSL이외의 암호화 시스팀을 만들기 위해서는 상당한 노력을 해야 가능하다.

4.3 PGP

공개된 암호화 시스팀으로 역사가 가장 깊은 것은 뭐라해도 PGP이다. PGP는 초기부터 소스채 로 공개되어있었고, 미국 밖으로 유출되면서 전세계적인 표준 전자우편 소프트웨어로 자리잡은 시스팀이다. 이 속에 역시 RSA, IDEA, MD5등 암호화 알고리즘이 구현되어 있고, 이것을 기반으로 암호화 전자우편, PGP를 만들었다. 그러나 PGP의 약 점은 암호화라이브러리와 응용프로그램이 구분되어 있지않고 한꺼번에 섞여서 구현되어 있고 이 의 분량이 작지않기 때문에 PGP내에서 암호화라이브러리를 분리해서 사용한다는 것은 거의 불가능한 것처럼 알려져 있다. MIT버젼의 PGP는 RSAREF를 사용하는 버젼의 PGP가 있고 RSAEURO버젼의 PGP가 있긴하지만 PGP내의 암호화라이브러리 를 분리하는 것은 매우 힘든 것으로 알려져있다. 다만 96년 7월 미국에서 열린 6회 USENIX Security 심포지움에서 SUN사에서 PGP라이브러리를 만들고 있다는 발표가 있긴했지만 공개가 될지 여부는 알려지지 않았다.

4.4 JAVA Crypto

JAVA에서 암호화라이브러리를 구현하는 것은 최근의 유행처럼 번지고 있다. 그러나 대부분의 자바로 만들어진 암 호화라이브러리는 Native method를 사용해서 내부의 수학적인 계산은 C코드로 구현하고 함수만 을 자바로 만드는 방 식을 취하고 있다. 그러나 현재 자바를 사용하는 브라우져의 자바 애플릿은 Native method를 사 용할수 없기때문에 큰 의미가 없다. 최근 전적으로 자바로만 암호화 알고리즘을 구현하자는 논의가 있고 현재 DES 정도는 전적으로 자바로만 구현된 클래스가 선보이긴 하지만 아직은 전적으로 자바로 대부분의 암호화알고리즘을 구현한 시스팀은 없다.
Native method로 구현된 자바 클래스로는 Systemics사의 cryptix-java 1.1이 있다. ACME Java 클래스역시 Crypto클래스 를 구현해 놓고 있다.

5. 암호화 프로그래밍 - RSAEURO/RSAREF중심으로

이제 진짜 암호화 프로그래밍으로 접어들었다. RSAEURO 1.03버젼을 중심으로 앞에서 이야기 한 각각의 암호화 방 식을 프로그래밍으로 어떻게 구현하는지를 설명하겠다.

5.1 Symmetric Cryptography Programming

대칭형 암호화 프로그래밍은 앞에서 언급했듯이 암호화할때의 키와 암호화를 풀때 사용하는 키 가 동일한 키를 사 용하는 암호화 방식을 말한다. 대표적인 대칭형 암호화 방식은 바로 DES(Data Encryption Standard)이다. DES는 블 럭 암호화 방식으로서 블럭 암호화 방식은 동일한 암호화 방식에서도 동작하는 모드가 각각 다른 모드로 동작할 수 있다.

 
        ECB(Electronic CodeBook)
        CBC(Cipher Block Chaining)
등이 대표적인 블럭암호화 방식의 모드이며 이들의 변형이 있을수 있다.
RSAEURO가 지원하는 블럭암호화방식은 현재 DES이며 IDEA, Blowfish암호화가 곧 지원된다 고 한다. RSAEURO 가 지원하는 DES역시 이런 블럭암호화 모드를 사용하는데 여기서는 대표적인 CBC모드를 사용 한다. ECB모드는 오 래된 방식이며 구현하기도 어렵고 attack의 가능성이 있는 것으로 알려져 있다. DES는 잘 알려 져 있는 대로 56bit 키 길이를 가지는 암호화방식으로서 56bit의 키 길이는 이제는 안전하다고 할 수 없는 키 길이가 되어 버렸다. 그래 서 최근에는 DES암호화를 세개의 키로 세번 반복함으로써 암호의 강도를 높인 Triple-DES방식 을 많이 이용한다. Triple-DES는 Key1으로 암호화를 하고 Key2로 복호화를 한 후 다시 Key3로 암호화를 하는 방 식이다. 그러나 Key1 과 Key3를 동일한 키를 사용한다. 그러므로 전체적으로 사용하는 키이는 두개 즉 Key1과 Key2 로서 두개의 키를 합하면 112bit의 키이 길이를 가진 암호화 방식이 된다. RSAEURO에서 지원되는 DES는 RSAREF와의 호환을 위 해 RSA사가 만든 DESX모드도 지원된다. DESX모드는 RSA사가 DES를 강화하기위해 만든 모 드로서 DES CBC모 드암호화시 비밀키로 XOR를 함으로써 암호의 강도를 높인 모드이다.
뒤에 다시 언급하겠지만 블럭 암호화방식은 블럭단위로 암호화를 하기때문에 암호화를 하는 자 료의 길이가 항상 블럭의 배수여야한다는 단점이 있다. 그러나 실제는 항상 블럭의 배수가 되지 않기때문에 암호화 하는 자료의 맨 끝 에는 항상 블럭의 배수를 만들기위한 Pading처리가 있어야한다.

5.1.1 API

1) DES CBC모드

void DES_CBCInit(context, key, iv, encrypt)
DES_CBC_CTX *context;        /* context */
unsigned char *key;     /* key, 8 bytes */
unsigned char *iv;       /* initializing vector, 8 bytes */
int encrypt;             /* encrypt flag (1 = encrypt, 0 = decrypt) */

int DES_CBCUpdate(context, output, input, len) DES_CBC_CTX *context; /* context */ unsigned char *output; /* output block */ unsigned char *input; /* input block */ unsigned int len;

void DES_CBCRestart(context) DES_CBC_CTX *context;

2) Triple-DES
void DES3_CBCInit(context, key, iv, encrypt)
DES3_CBC_CTX *context;       /* context */
unsigned char *key;     /* key, 24 bytes */
unsigned char *iv;       /* initializing vector, 8 bytes */
int encrypt;             /* encrypt flag (1 = encrypt, 0 = decrypt) */
int DES3_CBCUpdate(context, output, input, len)
DES3_CBC_CTX *context;       /* context */
unsigned char *output;   /* output block */
unsigned char *input;    /* input block */
unsigned int len; /* length of input and output blocks */
void DES3_CBCRestart (context)
DES3_CBC_CTX *context;       /* context */

3) DESX 모드

void DESX_CBCInit(context, key, iv, encrypt)
DESX_CBC_CTX *context;      /* context */
unsigned char *key;     /* DES key and whiteners, 24 bytes */
unsigned char *iv;       /* DES initializing vector, 8 bytes */
int encrypt;             /* encrypt flag (1 = encrypt, 0 = decrypt) */

int DESX_CBCUpdate (context, output, input, len) DESX_CBC_CTX *context; /* context */ unsigned char *output; /* output block */ unsigned char *input; /* input block */ unsigned int len; /* length of input and output blocks */

void DESX_CBCRestart(context) DESX_CBC_CTX *context; /* context */

5.1.2 프로그래밍

1) 구조
DES프로그래밍은 매우 간단하다. DES context에다가 암호화/복호화할 키이와 iv(initial vector) 를 세팅하고, 암호화한 다/복호화한다를 지정하는 초기화(initialization)한 후, 암호화/복호화할 자료를 8byte의 배수로 만들어 암호화/복호화 한다(update). iv는 키이처럼 랜덤하게 생성해서 암호화된 자료와 함께 전달해 복호화할때 사용 한다.

샘플코드를 보면


    DES_CBC_CTX   DEScontext;
    unsigned char           buf[BUFSIZE];
    unsigned char           opa_buf[BUFSIZE];
    int              len;

    rtv = DES_CBCInit(&DEScontext, sessionkey, iv, 1);
                        /* the 1 means encryption */ 
    if(rtv != IDOK) {
            initialization error;
    }
    while(1) {
        /* 8의 배수로 buf를 가져옴 */
        if(getbuf_multiple8(buf) == EOF) 
            break;
        rtv = DES_CBCUpdate(&DEScontext, buf, opa_buf, len);
        if(rtv != IDOK) {
            encryption/decryption error;
        }
    }

DES는 암호화와 복호화의 결과가 동일한 길이의 자료가 생성된다. 즉 48byte의 자료를 암호화 하면 48byte의 암호 화된 자료가 생성된다.

2) Pading처리
앞에서 언급한 대로 DES는 블럭 암호화 방식이기때문에 맨마지막 자료의 길이가 8의 배수가 아 닐경우에 8의 배 수가 되도록 자료를 채워 암호화를 하고 또 복호화를 한 후 채워진 자료는 제거해야, 정상적인 암호화/복호화가 이 루어진다. 그러므로 맨마지막 자료를 8의 배수가 되도록 Pading하는 방법은 여러가지가 있지만 RSAEURO/RSAREF 에서 사용하는 Pading기법은 다음과 같다.
암호화하는 자료의 맨마지막이 8의 배수가 될 경우는 추가적으로 8byte를 덧붙이고 그 8byte는 8라는 숫자로 채 운다. 그리고 8의 배수가 안될경우 8의 배수에서 모자라는 숫자, 즉 맨 마지막자료가 5byte일 경 우 3byte를 채우는 데 3이라는 숫자로 채운다. 그래서 나중에 복호화를 한후 맨마지막 byte의 숫자를 근거로 Pading된 byte수를 알아 서 Pading된 자료를 제거할수 있게 한다.
샘플코드는 다음과 같다.

 
    opa_len = strlen(opa_buf);
    if((pad = 8 - (opa_len % 8)) !=  0) {
       for(i = 0; i < pad; i++) opa_buf[opa_len+i] = (unsigned char) pad;
             opa_len += pad;
    }

5.2 Asymmetric Cryptography Programming - RSA

RSA는 두개의 키이 즉 Public Key와 Private Key를 가지고 상호간에 암호화/복호화를 하는 방 식으로서 일반적인 자 료의 암호화에서는 Public Key로 암호화하고 Private Key로 복호화한다. 그러나 전자서명과 같 은 응용에서는 자신의 Private key로 암호화를 하고(전자서명), Public Key로 복호화를 해, 서명을 확인하기도 한다. 일 반적으로는 Public Key 로 암호화를 하고 private키이로 복호화를 하는 것이 속도가 빠르다. 그러나 전체적으로는 대칭형 암호화방식보다는 속도가 매우 느리다.
RSA암호화/복호화에는 다음과 같은 네개의 함수가 있다.

제목 없음
RSAPrivateEncrypt Encrypts a block of data using an RSA private key, according to PKCS#1: RSA Encryption Standard.
RSAPrivateDecrypt Decrypts a block of data using an RSA private key, according to PKCS#1: RSA Encryption Standard.
RSAPublicEncrypt Encrypts a block of data using an RSA public key, according to PKCS#1: RSA Encryption Standard.
RSAPublicDecrypt Decrypts a block of data using an RSA public key, according to PKCS#1: RSA Encryption Standard.

5.2.1 API

1) Private Key로 암호화
int RSAPrivateEncrypt(output, outputLen, input, inputLen, privateKey)
unsigned char *output;           /* output block */
unsigned int *outputLen; /* length of output block */
unsigned char *input;            /* input block */
unsigned int inputLen;           /* length of input block */
R_RSA_PRIVATE_KEY *privateKey;     /* RSA private key */
2) Private Key로 복호화
int RSAPrivateDecrypt(output, outputLen, input, inputLen, privateKey)
unsigned char *output;           /* output block */
unsigned int *outputLen;         /* length of output block *
unsigned char *input;            /* input block */
unsigned int inputLen;           /* length of input block */
R_RSA_PRIVATE_KEY *privateKey;     /* RSA private key */
3) Public key로 암호화
int RSAPublicEncrypt(output, outputLen, input, inputLen, publicKey,
                     randomStruct)
unsigned char *output;           /* output block */
unsigned int *outputLen; /* length of output block */
unsigned char *input;            /* input block */
unsigned int inputLen;           /* length of input block */
R_RSA_PUBLIC_KEY *publicKey;        /* RSA public key */
R_RANDOM_STRUCT *randomStruct;   /* random structure */
4) Public Key로 복호화
int RSAPublicDecrypt(output, outputLen, input, inputLen, publicKey)
unsigned char *output;           /* output block */
unsigned int *outputLen; /* length of output block */
unsigned char *input;            /* input block */
unsigned int inputLen;           /* length of input block */
R_RSA_PUBLIC_KEY *publicKey;        /* RSA public key */
5) RSA Key생성
int R_GeneratePEMKeys(publicKey, privateKey, protoKey, randomStruct)
R_RSA_PUBLIC_KEY *publicKey;        /* new RSA public key */
R_RSA_PRIVATE_KEY *privateKey;     /* new RSA private key */
R_RSA_PROTO_KEY *protoKey; /* RSA prototype key */
R_RANDOM_STRUCT *randomStruct;   /* random structure */

5.2.2 프로그래밍

RSA프로그래밍은 DES암호화 방식보다 비교적 간단하다. 일반적으로 대량의 자료를 RSA로 직 접 암호화를 하지 않기때문에 RSA 암호화 API들은 while()루프나 for()루프를 돌면서 자료를 조금씩 분할해서 암 호화하는 방식은 거의 사용하지 않고 적은 자료를 한번에 암호화하거나 복호화하기때문에 간단한 인터패이스로 만들어 져 있다. 일반적으 로 RSA로 암호화하는 자료는 일반자료라기보다는 일반자료를 대칭형 암호화방식으로 암호화하 고 그 패스워드(키 이)를 보호하기위해 암호화하는 방법으로 RSA를 사용하기때문에 주로 8byte, 24byte정도를 암호 화하는데 사용한다. 그러므로 암호화방식은 매우 간단하다. 앞단락의 API만보면 그냥 사용할수 있을정도로 간단하기 때문에 여기서는 예 제를 다루지 않겠다.
RSA키쌍을 생성하는 R_GeneratePEMKeys()함수를 사용하는 방법을 설명하겠다. RSA암호화 는 두개의 키(Public Key, Private Key)를 사용한다. RSA키를 생성하기위해서는 키의길이, 모드, 그리고 랜덤한 숫자 등이 필요하다.
샘플코드는 다음과 같다.

    R_RSA_PUBLIC_KEY PUB_KEY;
    R_RSA_PRIVATE_KEY PRI_KEY;
    R_RSA_PROTO_KEY protoKey;

    protoKey.bits = 1024;                /* Key의 길이           */
    protoKey.useFermat4 = 1;                    /* RSA Key Mode              */
    status = R_GeneratePEMKeys(&PUB_KEY, &PRI_KEY, &protoKey, randomStruct);
    if(status) {
              PrintError("Key Generation", status);
              return;
    }

5.2.3 랜덤 함수

대칭형암호화방식이나 비대칭형 암호화방식에서나 암호화알고리즘이 아무리 강력하다하더라도 암호화할때 사용하 는 패스워드(키)가 다른 사람이 쉽게 추정이 가능하다면 암호화알고리즘의 우수성은 의미가 없는 것이 되고 만다. 즉 암호화통신을 할때 사용하는 키(대칭형암호화키, 비대칭형암호화키)들을 생성할때 남들이 쉽게 추정이 불가능하 도록 랜덤하게 생성하는 것이 필요하다.
일반적으로 UNIX등 컴퓨터시스팀에서 사용하는 랜덤함수(rand())는 컴퓨터의 클럭을 가지고 생 성하는 랜덤함수로 서 엄밀하게 말하자면 랜덤하다고 할수가 없다. 왜냐하면 생성되는 랜덤숫자의 seed를 알수가 있기때문에 랜덤 숫 자를 예측이 가능하기때문이다.
RSA키를 생성할때는 일반적으로 컴퓨터의 키보드를 마음대로 입력하도록 한다. 이때 입력된 내 용을 seed로 사용 하는 것이 아니라 키보드를 두드리는 시간적 간격을 seed로 사용해서 랜덤 숫자를 구하고 이를 기반으로 RSA키를 생성한다.
RSAEURO/RSAREF에서의 랜덤함수는 다음과 같다. 이 이외에도 시스팀의 clock을 이용해 랜 덤 숫자를 구하는 함 수등이 있다.

(1) 랜덤 스트럭쳐 초기화
int R_RandomInit(random)
R_RANDOM_STRUCT *random;         /* random structure */

(2) 랜덤 스트럭쳐를 block자료를 seed로해서 랜덤화
int R_RandomUpdate(random, block, len)
R_RANDOM_STRUCT *random; /* random structure */
unsigned char *block;            /* block of data */
unsigned int len;        /* length of block */
(3) 현재의 랜덤 스트럭쳐를 충분히 랜덤화하기위해 필요한 seed byte수.
int R_GetRandomBytesNeeded(bytesNeeded, random)
unsigned int *bytesNeeded       /* number of mix-in bytes needed */
R_RANDOM_STRUCT *random          /* random structure */
(4) 현재의 랜덤 넘버를 지움.
void R_RandomFinal(random)
R_RANDOM_STRUCT *random; /* random structure */

이상의 랜덤함수를 이용해 랜덤 스트럭쳐를 만드는 샘플 코드는 다음과 같다.

    static unsigned char seedByte = 0;
    unsigned int bytesNeeded;
    static R_RANDOM_STRUCT randomStruct;

    R_RandomInit(&randomStruct);
    while (1) {
            R_GetRandomBytesNeeded(&bytesNeeded, &randomStruct);
            if(bytesNeeded == 0)
                    break;
            get_seed_data(&seedByte);           /* Get Seed data from any way */
            R_RandomUpdate(&randomStruct, &seedByte, 1);
    }

    /* using randomStruct in the Cryptography function */

    R_RandomFinal(&randomStruct);

여기서 get_seed_data()는 앞에서 언급한 키보드입력의 시간간격등 외부로부터 seed자료를 얻어 내는 함수이다.

5.3 Message Digest Programming

메시지 다이제스트 함수는 앞에서 언급했듯이 메시지에 대해 유일한 첵섬을 구하는 함수 이다. 즉 메시지의 내용 의 수정삭제등을 증명할수 있는 고정길이의 코드를 생성하는 함수이다. 메시지다이제스트를 구 하는 함수로는 MD2, MD5등이 있으며 RSAREF에는 없지만 RSAEURO에는 SHA함수도 지원하고 있다. SHA알고리 즘은 MD5보다 강력 한 메시지 다이제스트 함수라고 할수 있다. MD2나 MD4, MD5는 128bit 메시지 다이제스트 코드 를 생성하며 SHA 는 160bit 메시지 다이제스트 코드를 생성하며 SHA는 SHS라고 (Secure Hash Standard)로 미국 FIPS의 표준으로 이용 되고 있다.
메시지 다이제스트함수는 어던 자료(메시지)를 처리해서 메시지에 대응되는 128bit, 160bit의 다 이제스트코드를 생성 하는 함수이다. 이 메시지 다이제스트 코드는 메시지의 통합성을 증명하거나 전자서명(Digital Signature)를 할때 사용 한다.

5.3.1 API

(1) 함수 context와 다이제스트알고리즘(MD2, MD4, MD5, SHS) 선정
int R_DigestInit(context, digesttype)
R_DIGEST_CTX *context;               /* new context */
int digesttype;                   /* message-digest algorithm */
(2) 메지지를 처리해서 다이제스트를 계산
int R_DigestUpdate(context, partIn, partInLen)
R_DIGEST_CTX *context;               /* context */
unsigned char *partIn;           /* next data part */
unsigned int partInLen;          /* length of next data part */
(3) 최종적으로 다이제스트 코드 생성
int R_DigestFinal(context, digest, digestLen)
R_DIGEST_CTX *context;               /* context */
unsigned char *digest;           /* message digest */
unsigned int *digestLen; /* length of message digest */
(4) 메시지 블럭을 한번에 다이제스트 코드 생성
int R_DigestBlock(digest, digestLen, block, blockLen, digestAlgorithm)
unsigned char *digest;           /* message digest */
unsigned int *digestLen; /* length of message digest */
unsigned char *block;            /* block */
unsigned int blockLen;           /* length of block */
int digestAlgorithm;             /* message-digest algorithm */

메시지 다이제스트 함수는 위에 언급한 12가지 이외에도 각각의 다이제스트알고리즘별로 각각 3-4개씩의 함수가 별도로 존재한다. 필요에 따라 이런 하부의 함수를 사용할수도 있다.

5.3.2 프로그래밍

메시지 다이제스트 프로그래밍은 먼저 XXXInit()으로 context를 초기화하고나서 메시지다이제스 트를 구할 메시지를 입력해서 다이제스트를 계산하는 과정으로서 XXXUpdate()함수가 있고, 마지막으로 XXXFinal() 함수로서 메시지 다이 제스트를 구한다. 앞에 붙여진 XXX는 MD2, MD4, MD5, SHS등으로 구분된다. 이런식으로 총 12개의 함수가 각각의 알고리즘별로 구성되어 있으나 프로그래밍의 편의를 위해 각각의 알고리즘을 총괄하는 상위함수 가 존재한다. 이것 이 5.3.1절에 보여준 4개의 함수 이다. 프로그래머는 초기화때 다이제스트 알고리즘을 지정해두 고 나머지는 동일 한 API를 사용할수 있도록 만들어져 있다.
샘플코드는 다음과 같다.

    R_DIGEST_CTX    MDcontext;

    R_DigestInit(&MDcontext, DA_MD5);
    while(1) {
        if(get_data(data)  ==  EOF)      break;
        R_DigestUpdate(&MDcontext, data, sizeof(data));
    }
    R_DigestFinal(&MDcontext, digest_code, &digest_len);

R_DigestInit()함수에서 DA_MD5를 선택하면 MD5알고리즘으로 메시지 다이제스트를 구하겠다 는 초기화이다. 여기 에 DA_MD2, DA_MD4, DA_SHS등을 사용함으로써 다이제스트 알고리즘을 바꿀수 있다.

5.4 Digital Signature Programming

RSA를 이용한 전자서명은 RSA의 Private Key로 암호화해서 메시지를 제공하는 방법이 가장 일반적인 전자서명방 식이다. 그러나 메시지 전체를 RSA Private key로 암호화하는 것은 매우 비효율적인 일이된다. 그래서 메시지의 다 이제스트코드를 구한후에 다이제스트코드를 RSA Private Key로 암호화하는 방법을 사용한다. 나중에 사인을 확인하 는 방법은 역으로 메시지의 다이제스트를 구하고, 메시지에 따라온 서명을 송신자의 Public Key 로 복호화를 해서 송 신된 다이제스트를 얻어서, 이 두 다이제스를 서로 비교해 일치하면 서명을 확인한 것이 된 다.

5.4.1 API

(1) 서명 초기화, 메시지다이제스트 알고리즘 선택
int R_SignInit(context, digesttype)
R_SIGNATURE_CTX *context;          /* new context */
int digesttype;                           /* message-digest algorithm */
(2) 메시지의 서명을 처리
int R_SignUpdate(context, partIn, partInLen)
R_SIGNATURE_CTX *context;          /* context */
unsigned char *partIn;                   /* next data part */
unsigned int partInLen;                  /* length of next data part */
(3) 서명최종적으로 서명코드 생성
int R_SignFinal(context, signature, signatureLen, privateKey)
R_SIGNATURE_CTX *context;          /* context */
unsigned char *signature;                /* signature */
unsigned int *signatureLen;              /* length of signature */
R_RSA_PRIVATE_KEY *privateKey;             /* signer's RSA private key */
(4) 한번에 메시지 블럭을 서명하고 서명코드 생성
int R_SignBlock(signature, signatureLen, block, blockLen,digestAlgorithm, privateKey)
unsigned char *signature;                /* signature */
unsigned int *signatureLen;              /* length of signature */
unsigned char *block;                    /* block */
unsigned int blockLen;                   /* length of block */
int digestAlgorithm;                     /* message-digest algorithm */
R_RSA_PRIVATE_KEY *privateKey;             /* signer's RSA private key */
(5) 서명확인작업 초기화, 다이제스트 알고리즘 세팅
int R_VerifyInit(context, digesttype)
R_SIGNATURE_CTX *context;          /* new context */
int digesttype;                           /* message-digest algorithm */
(6) 메시지에 대한 서명확인 처리
int R_VerifyUpdate(context, partIn, partInLen)
R_SIGNATURE_CTX *context;          /* context */
unsigned char *partIn;                   /* next data part */
unsigned int partInLen;          /* length of next data part */
(7) 최종적으로 메시지에서 생성된 다이제스트와 서명을 복호화해서 생성된 다이제스트비교
int R_VerifyFinal(context, signature, signatureLen, publicKey)
R_SIGNATURE_CTX *context;          /* context */
unsigned char *signature;                /* signature */
unsigned int *signatureLen;              /* length of signature */
R_RSA_PRIVATE_KEY *privateKey;             /* signer's RSA public key */
(8) 메시지 블럭을 한번에 서명확인
int R_VerifyBlockSignature( block, blockLen, signature, signatureLen, 
                            digestAlgorithm, publicKey)
unsigned char *block;                    /* block */
unsigned int blockLen;                   /* length of block */
unsigned char *signature;                /* signature */
unsigned int signatureLen;               /* length of signature */
int digestAlgorithm;                     /* message-digest algorithm */
R_RSA_PUBLIC_KEY *publicKey;                /* signer's RSA public key */

5.4.2 프로그래밍

전자서명관련 프로그래밍은 메시지다이제스트 프로그래밍과 구조가 똑같다. 사실 전자서명의 대 부분의 과정은 메 시지 다이제스트를 구하는 데 있기때문에 같을수 밖에 없다. 다만 마지막 R_SignFinal()함수와 R_VerifyFinal()함수에 다이제스트코드를 RSA로 암호화/복호화를 하기위해 각각 RSA Private key와 RSA Public key를 제공하는 것이 다르다.

(1) 전자서명
    R_SIGNATURE_CTX  context;              /* context */

    R_SignInit(&context, DA_MD5);
    while(!ReadData(file, partIn, &partInLen, sizeof (partIn))) {
    if ((status = R_SignUpdate(&context, partIn, partInLen)) != 0)
        break;
    }
    status = R_SignFinal(&context, signature,signatureLen, privateKey);
    if(status == 0) {
        /* Success  !! */
    }
    else {
        /* Fail !! */
    }
(2) 전자서명 확인
    R_SIGNATURE_CTX  context;              /* context */

    R_VerifyInit(&context, DA_MD5);
    while(!ReadData(file, partIn, &partInLen, sizeof (partIn))) {
        if ((status = R_VerifyUpdate(&context, partIn, partInLen)) != 0)
                 break;
    }
    status = R_VerifyFinal(&context, signature,signatureLen, publicKey);
    if(status == 0) {
                /* Right Signature  !! */
    }
    else {
                /* Signature Fail !! */
    }

5.5 High Level API

지금까지 대칭형암호화방식가운데 대표적인 방법인 DES암호화프로그래밍, 비대칭형 암호화방식 인 RSA암호화프로 그래밍, 메시지 다이제스트 프로그래밍, 전자서명 프로그래밍등을 이야기하였다. 이 네가지가 바 로 암호화프로그래 밍의 핵심 요소이다. 현재 전세계적으로 알려져있는 대부분의 암호화응용시스팀은 그것이 무엇 이던간에 대부분 위 에서 언급한 네가지 기본요소로 구성되어 있다. 복잡하기로 유명한 PEM같은 보안전자우편시스 팀도 위에서 언급한 네가지 기본요소를 복합적으로 이용한 시스팀에 불과하다.
이런 네가지 기본 요소를 복합적으로 묶어서 자주 사용하는 함수를 만들어서 RSAEURO/RSAAREF는 제공하고 있 다. 이 함수를 Envelop 함수라고 부른다. Digital Envelop이란 어떤 자료를 암호화해서 전달할 때 일반적으로 대칭형 암호화알고리즘으로 키이를 생성해서 암호화한 후, 키이를 비대칭형 암호화알고리즘으로 암호화 해서 봉합해서 수 신자에게 전달하는 방법을 말한다. 자료를 전체를 비대칭형 암호화알고리즘으로 암호화한다는 것은 매우 비효율적 이기때문에 효율성을 위해 이런 방법을 사용하는 것이다. 이런 여러단계의 일을 간단히 처리하 는 함수를 소개한다.

5.5.1 API

(1) Digital Envelop 초기화
int R_SealInit(context, encryptedKeys, encryptedKeyLens, iv, publicKeyCount,
               publicKeys, encryptionAlgorithm, randomStruct
R_ENVELOPE_CTX *context;            /* new context */
unsigned char **encryptedKeys;          /* encrypted keys */
unsigned int *encryptedKeyLens;         /* lengths of encrypted keys */
unsigned char iv[8];                     /* initialization vector */
unsigned int publicKeyCount;            /* number of public keys */
R_RSA_PUBLIC_KEY **publicKeys;              /* public keys */
int encryptionAlgorithm;         /* data encryption algorithm */
R_RANDOM_STRUCT *randomStruct;           /* random structure */

Digital Envelop 초기화는 context를 초기화하는 작업이다. 여기에 필요한 정보는 수신자의 RSA Public Key (여기서는 복수로 넘겨주고 그 가운데 암호화할 Public Key의 번호를 지정하는 형식을 취한다)와 자료를 암 호화할 대칭형 암호 화 알고리즘을 지정하고 랜덤구조체를 넘겨준다. 그리고 초기화 결과로는 자료를 암호화할 (RSA 로 암호화된) 대칭 형암호화 알고리즘의 세션키와 iv값을 넘겨받는다.

(2) 자료 Digital Envelop 처리
int R_SealUpdate (context, partOut, partOutLen, partIn, partInLen)
R_ENVELOPE_CTX *context;            /* context */
unsigned char *partOut;                 /* next encrypted data part */
unsigned int *partOutLen;                /* length of next encrypted data part */
unsigned char *partIn;                   /* next data part */
unsigned int partInLen;                  /* length of next data part */

Digital Envelop 처리과정은 envelop할 자료를 제공하고 암호화된 자료를 넘겨받는 작업이다.

(3) Digital Envelop 종료
int R_SealFinal(context, partOut, partOutLen)
R_ENVELOPE_CTX *context;            /* context */
unsigned char *partOut;                 /* last encrypted data part */
unsigned int *partOutLen;                /* length of last encrypted data part */

Digital Envelop 종료작업은 자료는 넘겨주지않고 최종적인 처리(주로 Pading처리)를 한 암호화된 마지막 자료를 넘겨 받는 것으로 종료가 된다.

다음 세개의 함수는 Digital Envelop된 자료를 복호화하는 데 사용하는 함수들이다.

(4) Opening 초기화
int R_OpenInit(context, encryptionAlgorithm, encryptedKey, 
                                        encryptedKeyLen, iv, privateKey)
R_ENVELOPE_CTX *context;            /* new context */
int encryptionAlgorithm;         /* data encryption algorithm */
unsigned char *encryptedKey;            /* encrypted data encryption key */
unsigned int encryptedKeyLen;           /* length of encrypted key */
unsigned char iv[8];                     /* initialization vector */
R_RSA_PRIVATE_KEY *privateKey;             /* recipient's RSA private key */

(5) 자료 Digital Envelop Opening 처리
int R_OpenUpdate(context, partOut, partOutLen, partIn, partInLen)
R_ENVELOPE_CTX *context;            /* context */
unsigned char *partOut;                 /* next recovered data part */
unsigned int *partOutLen;                /* length of next recovered data part */
unsigned char *partIn;                   /* next encrypted data part */
unsigned int partInLen;                  /* length of next encrypted data part */

(6) Digital Envelop Opening 종료
int R_OpenFinal(context, partOut, partOutLen)
R_ENVELOPE_CTX *context;            /* context */
unsigned char *partOut;                 /* last recovered data part */
unsigned int *partOutLen;                /* length of last recovered data part */

5.5.2 프로그래밍

Digital Envelop은 세션키(대칭형암호화 키이)생성과 RSA/대칭형암호화를 동시에 처리할수 있으 므로 매우 간편한 함 수이다. 샘플 코드는 다음과 같다.

     R_ENVELOPE_CTX context;

     R_SealInit(&context, encryptedKeys, &encryptedKeyLen, 
                iv, 1, &publicKey, encryptionAlgorithm, randomStruct);
     while(!ReadInData (inFile, partIn, &partInLen, sizeof (partIn))) {
        status = R_SealUpdate(&context, partOut, &partOutLen, partIn, partInLen);
        if (status != ID_OK)
               break;
        WriteOutData (outFile, partOut, partOutLen);
     }
     R_SealFinal (&context, partOut, &partOutLen);

5.6 암호화 프로토콜

그러나 암호화가 되어 있다고 모든 보안이 자동적으로 이루어지는 것은 아니다. 암호화된 자료 자체는 안전하다 하더라도 암호화하기위해 생성한 세션키, 랜덤함수, 통신상에서 발생할수 있는 여러가지 환경등에 의해 많은 헛점들 이 발생될수 있다. 이런 헛점들을 보완하기위해서 암호화프로토콜이 있다. 자료를 단순히 암호 화해서 전달하는데 있어서 전달하는 방식, 상호간에 키이 전달등 주변환경을 통합적으로 적용하는 방법을 암호화 프 로토콜이라 한다. 이런 프로토콜에는 SSL, S-HTTP, PEM, PGP등 각종 응용시스팀별로 적합한 프로토콜이 있으며 이들을 각각의 응용시 스팀에 활용하게 된다.
아무리 간단한 암호화응용시스팀이라도 패스워드를 어떻게 저장할 것인가? RSA private Key를 사용자가 1024bit를 외우고 있을수는 없으니까 디스크에 저장해야하는데 어떤 형태로 저장해야 안전하게 저장할수 있 는가? 등 고려해야 할 요소들이 많이 있다. 이런 요소들을 미리 정리한 문서도 있긴한다. 분량이 좀 많긴하더라도 PKCS(Public Key Cryptography Standard)라는 형태로 1번부터 11번까지 표준이 정해져 있다. 이 문서는 RSA사가 만들어서 암호화 응 용시스팀을 개발할때 공통적으로 필요한 여러가지 고려점을 미리 표준화해 둔 것들이다. 많은 암호화 응용시스팀 들이 이 PKCS표준을 따르고 있다. (http://www.rsa.com/PUBS/home_frame.html) 그러나 PKCS 는 상당히 복잡하게 만들 어져 있어서 오히려 암호화 응용시스팀을 만드는데 어럽게하고 있다는 비판도 받고 있다.
네트웍상의 정보를 취득하는 attack들가운데 man in middle attack과 같은 attack은 두 컴퓨터가 통신을 하는 가운데 제 3자가 끼어서 처음부터 모든 자료를 다 취득하고 수정해서 보낼수 있다고 한다면 암호화만으 로는 정보를 보호 하는데 미흡하다.
예를들면 A와 B가 RSA를 이용해 통신을 하려고 한다고 치면 일반적인 순서는 다음과 같 다.

  1. A는 B에게 자신의 Public Key를 알려주고,
  2. B는 세션키를 생성해 A의 Public Key로 암호화해서 A에게 전송하면,
  3. A는 해당 세션키를 자신의 Private Key로 해독해서 얻어서 해당 세션키로 자료를 암호화 해서 B에게 전달한 다.
  4. B는 세션키를 알고 있으므로 자료를 복호화해서 얻을수 있다.

이때 A와 B사이에 C라는 사람(man in middle)이 있다면 이런 일이 가능하다.

  1. A가 B에게 자신의 Public Key를 전송한다
  2. C가 중간에 A의 Public Key를 가로채고, 자신의 Public Key를 B에게 전한다.
  3. B는 세션키를 생성해 C의 Public Key로 암호화해서 A에게 전송한다.
  4. C가 B로부터 A로 가는 암호화된 세션키를 중간에서 가로채고, 자신의 Private키로 해당 세션키를 얻어내고, 다시 A의 Public Key로 세션키를 암호화해서 A에게 보낸다.
  5. A는 해당 세션키를 자신의 Private Key로 해독해서 얻어서 해당 세션키로 자료를 암호화 해서 B에게 전달한 다.
  6. C가 자료를 중간에 암호화된 자료를 가로채서 자신이 이미 가진 세션키로 자료를 해독해 본다음 B에게 전달 할지 말지 마음대로한다.
  7. B는 자료가 전송되면 자신의 세션키로 복호화해서 자료를 얻는다.
이 경우 A와 B는 전혀 중간에 C가 있다는 사실을 눈치채지 못한다. 이런 일들을 방지하기위해 암호화와 더불어 여러가지 프로토콜이 도입된다. 여기서는 이런 프로토콜들에대해서는 상세히 언급하지 않겠 다.

5.7 기타 고려할 점

이제 기본적인 암호화 함수들은 다 나열하였다. 앞에서 이야기 했듯이 모든 암호화 응용시스팀 들은 이들을 변형 응용해서 만들어지는 것들이며 새로운 알고리즘들이 도입된다하더라도 기본적인 개념을 위에서 언급한 것들에서 그 리 많이 벗어나지 않는다.
그러나 실제로 암호화 응용시스팀들을 만들때 여러가지 점들이 걸린다. 대표적인 것들은 다음과 같다.

5.7.1 RSA키의 저장

RSA의 두가지 키이를 외우고 있을수는 절대로 없다. 특히 Public Key는 저장도하고 전송도해야 할 필요가 있다. 전송을 한다는 것은 시스팀의 플랫폼간에 서로 다른 요소(int길이등)를 고려해서 전송하거나 저장 해야한다. 이런 어 려움을 해결하기위해 플랫폼 종속적이지 않은 방법으로 ASN.1(Abstract Syntax Notation One)양 식을 따르는 DER(Distingush Encoding Rule)이나 BER(Basic Encoding Rule)을 사용해서 저장하는 것을 많이 쓰고 있다. 이것은 PKCS표준에서 이렇게 정의했으며 X.509디렉토리 표준, SET등에서도 이방법을 쓰도록 하고 있 다. ASN.1모듈은 복 잡하고 구현하기가 까다롭다는 비판이 있긴하지만 현재로는 많이 사용하는 방법이다. 그러나 꼭 ASN.1표기를 따 른 DER, BER모듈로 저장할 필요는 없다. 나름대로 플랫폼 비종속적인 방법을 사용해 Read/Write가 가능한 방법을 정의해서 사용하면 된다.
키이를 저장할때 고려해야할 또 한가지의 문제점은 바로 보안이다. 하드디스크에 자신의 RSA Private Key를 그대로 저장해 두면 누군가가 그 파일을 훔쳐가면 자신의 모든 보안은 깨어진다고 볼수 있다. 그러므로 키이를 디스크에 저장할때는 암호화를 해서 저장하는데 일반적으로는 패스워드를 Oneway Hash를 통과시켜 나온 메시지다이제스트를 키이로 해서 대칭형 암호화 알고리즘을 이용해 암호화해서 저장한다.

5.7.2 Digital Envelop한 메시지의 구조

Digital Enveop을 한 메시지는 우선 두가지로 구성된다. 첫째는 대칭형키이(DK)로 암호화된 메 시지(EM)와 수신자의 Public Key로 암호화된 대팅형키이(EDK) 두가지이다. 그리고 많일 전자서명(DS)을 덧붙인다면 메시지는 세가지 파트 로 구성되게 된다. 이들을 어떻게 구성해야 나중에 암호화를 풀기 좋을까? 하는 고려도 필요하 다.
일반적인 방법은 다음의 순서를 따른다.

  1. 메시지(M)를 대칭형 키이(DK)로 암호화한다.
  2. 그 뒤에 대칭형 키이(세션키, DK)를 수신자의 Public Key로 암호화한다(EDK)
  3. 그 뒤에 앞의 두 부분 전체를 이용해 전자서명(DS)을 생성한다.

메시지를 수신한 측에서는 역순서로 메시지를 구한다.

  1. 메시지의 앞의 두 부분을 이용해 전자서명을 확인한다.
  2. 자신의 Private Key로 암호화된 대칭형키이(세션키, DK)를 구한다.
  3. 구한 세션키로 암호화된 메시지(EM)를 복호화한다.

그러나 문제는 여기서 끝나지 않는다. 그럼 메시지가 세가지 파트로 구분되어 있다면 세가지 파 트를 서로 구분할수 있어야 하는데 그 구분자는 무엇으로 할 것인가? 또 구분자는 서명에 넣을 것인가 말것인가? 등 여러가지 고려할 점이 있다.

6. 결론

암호화 알고리즘은 장기적으로 연구개발할 소지가 많다. 또한 강력한 국산 알고리즘이 개발되면 매우 환영할 만한 일이다. 최근 국산 암호화알고리즘의 개발이 활발하게 진행되고 있는듯한데 대표적인 것이 바로 KDST(Korean Digital Signature Standard)라는 알고리즘으로 거의 완성단계에 와 있는듯하다. 아직 검증된 것은 아니고 검증의 절차가 필요하긴 할 것이다.
그럼에도 불구하고 정보통신분야의 응용시스팀은 국내에서만 사용하는 것이 아니라 국제적인 통 신의 경우가 더 많 으므로 국제적인 표준과의 호환을 고려하여야만한다. 그런의미에서 앞에서 언급안 RSA, DES, MD5, SHS등과 같은 알고리즘들은 암호화 응용시스팀의 기본요소가 되고 있다. 암호화 알고리즘을 연구개발하는 분 야도 하나의 분야이 지만 암호화응용시스팀을 혹은 암호프로토콜을 개발하는일은 또다른 새로운 중요한 분야가운데 하나라고 말하고 싶 다.
암호화기술이 소극적으로느 정보화의 걸림돌인 정보유출, 해킹등을 막는 긍극적인 대안으로 활 용될수있으며, 적극 적으로는 전자거래, 전자화폐, 전자문서유통등 사이버스패이스상에서의 활동에 법적/경제적인 지 위를 보장하는 대안 으로서 활용될수 있다. 그동안 인터넷을 통해 전달받은 전자우편의 내용을 법정에서 증거로 체택 되지 못했었다. 그 러나 보안전자우편이 활성화되고 전자서명에 법적인 권위를 부여한다면 우리는 전자우편으로 계 약서를 사인하고 교 환할수도 있게될 것이다. 특허신청, 관공서에 등록하는 행위등도 모두 사람이 서류를 들고 직접 도장을 찍거나 서 명을 하면서 해야하지만 이런 모든 행위들을 통신상 혹은 사이버스패이스상에서 가능 하도록하는 것이 바로 암호화 기술이다. 최근 Certificate Authority기술을 응용한 서비스가운데 하나가 바로 Digital ID(VeriSign)서비스인데 이것도 암 호화기술의 응용가운데 하나로서 인터넷의 디지탈 환경에서의 신분증역할을 하는 서비스를 제공 하는 것이다. Sigital ID의 보증역할이 어느정도인지는 알수 없지만 조금만 발전하면 디지탈 보험서비스등도 가능할 것 이다.
미래사회는 컴퓨터를 이용한 통신이 모든 사회의 혈관과 신경으로서의 역할을 할 것이다. 사람 이 직접 만나고 직 접 무언가를 하는 것보다는 시간과 공간적 제약을 정보통신이 극복해서 많은 일들을 정보통신을 통해 처리할 것이 분명하다. 그런 디지탈 혁명이 일어나는 미래사회에는 디지탈 정보통신의 약점을 보완하는 암호 화기술이 바로 중요 한 핵심기술로 자리잡을 것이다. (끝)

참고문헌(References)

[SCHNEIER 1996]
BRUCE SCHNEINER, Applied Cryptography , 1996
John Wiley & Sons, Inc
[STALLING 1995]
WILLIAM STALLING, Network and Internetwork Security, 1995
IEEE Press
[GARFINKEL 1995]
SIMSON GARFINKEL, PGP, Pretty Good Privacy, 1995
O'Reilly & Associates, Inc
[KAPP 1996]
STEPHEN KAPP, RSAEURO Reference Manual 1.03,1996
[RSA 19xx]
PKCS(Public Key Cryptography Standard) #1 - #11, 198x-199x
Last-Modified : Sunday, 20-Oct-96 22:11:17 KDT
Copyright 1996 Douglas Guen(dgguen@madang.dacom.co.kr)