2018년 3월 29일 목요일

고전암호(2) - 비제네르 암호

 이전시간에 OTP암호알고리즘, 시저암호에 대해서 알아보았다.

이번시간에는 비제네르 암호에 대해서 알아보자.

 비제네르 암호란?
단일치환암호인 시저암호와 비슷한 방법의 암호방식이다. 알파벳의 a~z(26개)를 비제네르 표에 맞추어 암호화하는 방법이다. 필자가 방금 말한 비제네르 표에 맞추었다는건, 다음과 같은 표를 보면서 이해해보자.

<비제네르 표>





비제네르 표를보면 세로 x 가로(25X25) 형태로 되어있다는걸 볼수있는데, 키 값의 형태는 알파벳 형태(A~Z)로 길이는 상관없으며, 키의 길이만큼 차례대로 평문의 알파벳과 연산되면서 암호화 된다. 키(A~Z)를 0~25의 수로 바꾸며, 26으로 나누어서 해당 평문이나 암호문에 연산하면 된다.

1) 비제네르 암호화를 살펴보자,
Plaintext  →      Lifeisgood
Key        →       auto;














 이전시간에 알아본 시저암호와 매우 비슷한 암호 알고리즘인데, 이전의 시저암호에서의 키는 숫자이며, 해당 평문 문자열에 키값을 하나씩더해서 암호화를 시켰는데, 비제네르 암호는 키 값을 문자열로 받고, 평문의 길이에 맞게 문자열 하나씩 대입하면서 암호화를 진행한다. 이러한 특성으로 '빈도분석법'으로 해독이 거의 불가능하며, 키 값의 갯수(길이) 또한 제한이 되지않고, 해독시 예상이 불가능하다. 이것은 송신자와 수신자만의 동일한 키로 암호화 / 복호화가 가능하므로, 대칭키 암호 알고리즘에 속한다.

> 비제네르 암호 프로그래밍








 - 비제네르 암호화 복호화 방식
1) 비제네르 암호화 : E = (M(평문) + Key(키값)) mod 26

2) 비제네르 복호화 : D = (C-Key) mod26

 > 비제네르 암호화 / 복호화 결과



















2018년 3월 22일 목요일

암호학 - OTP 암호 알고리즘

이번에는 OTP암호알고리즘에 대해 알아보도록 하겠다.

 우리 주변에서 흔히 전자거래, 금융관련 사이트 등에서  개인정보가(주민번호 또는 아이디, 비밀번호)유출이 되어도 2차적인 피해를 막을 수 있도록 공인인증서 혹은 휴대폰 인증 등을 통해서 조금이나마 안전하게 이용 할 수 있다.
 하지만 보안코드나 인증서 비밀번호를 알게된다면, 얘기가 조금은 달라진다.

이렇듯 우리 생활에서는 완벽한 보안방법을 찾기란 쉽지 않다. 그래서 이러한 보안코드나 인증서들이 유출이 되었을 경우에도 어떻게 해야 피해를 최소화 시킬지 알아보자.

만약에 우리가 회원가입을 할 때 휴대폰번호를 통해서 인증을 받아본 경험이 있을 것이다. 이러한 사용자 인증을 통해서 이 계정이 본인임을 확인시킬 수 있는(증명하는) 방법 중 하나이다.

1. 사용자인증
 사용자 인증은 우리의 일상 생활에서도 손쉽게 찾아볼 수 있다. 휴대폰을 사용하더라도 PIN번호 입력, 지문인식, 홍채 등을 통해서 다양하게 인증을 할 수 있다.

2. OTP(One Time Password)
 OTP는 말그대로 One Time Password의 약자로, 보통의 고정적인 패스워드와는 다르게 매번 다른 패스워드를 만든다. 사용자 인증 방법 중 하나로 사용하기에 편리하며 높은 보안성을 가지고 있는데. 자세한 특징을 살펴보자

 2-1) 강력한 보안성
 기존의 ID/PWD를 노출이 되었음에도 2차(사용자 인증 서비스)적인 보인확인을 할수있는 보안성을 가지고 있다. 그리고 2차적인 인증서비스(OTP)의 패스워드를 유출했더라도, 우리는 예측할 수 없는 이 특성으로 보안을 유지할 수 있다. OTP는 해쉬 함수를 통해서 랜덤의 값(난수)을 추출하므로 역으로 입력값을 알아내기가 힘들다. 그러므로 (악의적인)해커에 의해  패스워드를 스니핑 당한다 해도 원래의 패스워드를 찾기 힘들 것이다.

 2-2) 편리성
 한번 사용하고 폐기되는 일회용 비밀번호로, 기존의 ID/PWD, 공인인증서등 사용자 지식기반 인증를을 봤을 경우, 분실우려 및 복잡한 사용방식, 휴대성도 우수하지 못하다.  반면 OTP는 사용자가 소유하고, 동적인 정보를 이용할 수 있으며, 휴대하며 관리하기도 편리하다.

3. OTP 종류
 3- 1) S/Key방식
 먼저 고전적으로 공중망을 통해서 원격시스템에 로그인할 때 패킷들을 스니핑해 패스워드를 노출되어도 매번 패스워드가 바뀌는 방식인 S/Key방식을 통해 방지할 수 있다.

 3-2) OTP 챌린지 리스펀스 방식
 난수를 암호 알고리즘의 입력값으로 사용하여, 일회용 패스워드를 생성한다.

 [OTP챌린지 리스펀스 과정 ]
① 인증서버 or 애플리케이션이 임의의 난수값을 생성 후 사용자에게 전달(Challenge)
② 사용자는 전달받은 난수값을 다시 일회용 패스워드 생성토큰 or 소프트웨어에 입력
③ 사용자는 난수값을 입력 후 나온 출력값을 일회용 패스워드로 입력(Response)
④ 인증 서버에서 사용자에게 전달 했었던(②번과정) 동일한 난수값(Challenge)과 등록된 사용자 정보를 이용해서 OTP를 생성 후 (사용자가 입력한) Response와 비교 후 인증
( ①번의 과정에서 인증서버가 보내준 난수 값은 사용자의 비밀키(혹은 토큰 입력용 패스워드)로 암호화 된다.)


 3- 3) OTP시간 동기화(Time Synchronous) 방식 
 챌린지 리스펀스 방식이 임의의 난수값을 일회용 패스워드의 입력값으로 사용하는 것과 달리, 시간을 일회용 비밀번호의 입력값으로 사용함.
 인증서버와 사용자는 같은시간을 일회용 비밀번호의 입력값으로 넣어야 한다.

[OTP시간 동기화 과정]
① 사용자는 일회용 비밀번호를 생성해 PIN번호(사용자의 패스워드와 비밀키)를 인증서버에 보냄
② 인증서버는 PIN을 통해 비밀키를 찾고 생성된 일회용 패스워드가 수신한 것과 일치하는 지를 파악함
③ 이때, 인증서버와 사용자 토큰사이에 시간이 일치하지않으면 사용자 인증은 실패 일치하면 인증 성공

 일회용 비밀번호의 입력값을 서버로부터 받지 않는 장점을 갖고있으나 서버와 사용자 토큰의 정보를 일치시켜야 하는 단점과 또한 사용자의 수가 많은 경우 여러개의 시간을 동시에 일치시키는 것도 쉬운일이 아니다. 인증서버사용자 토크간시간정보를 일치시켜야 하는 불편함을 가지고 있다.


3-4) OTP 이벤트 동기화 방식
 앞서 본 시간 정보 대신에 인증서버와 인증 횟수(counter) 기록을 사용자 측과 인증서버간 공유한다. 또한 이 인증 횟수(counter)를 일회용 패스워드 생성 시 입력값으로 활용한다.

 [OTP 이벤트 동기화 과정]
① 인증 서버측과 사용자측간의 counter는 인증시도가 없을 경우 '0'으로 인식함
② 사용자가 OTP를 실행시키면 카운터값이 0에서 1로(1회 실행시켰으므로)증가하며, 이 값으로 입력한 비밀키(사용자의 패스워드라고 생각해도 무방)를 이용해서 암호화 함
③ 암호화 된 결과값이 일회용 패스워드로써 화면에 나타나고, 이 값을 시스템에 입력하면 인증서버로 전달하게 됨
④ 인증서버는 사용자의 인증기록(counter : 1, 1회 인증 했으므로)을 통해 카운터 값을 알아냄
⑤ 카운터 값(인증기록 횟수)을 알아낸 후 사용자의 비밀키(사용자의 패스워드)를 활용해 복호화 함
⑥ 복호화 후 인증서버측에 저장된 사용자의 비밀키(사용자 패스워드)와 일치하는지 파악한 후 인증여부 결정

 시간 동기화 방식은 [서버 - 사용자]간 시간을 토큰 사이에 일치시켰고,
이벤트 동기화 방식은 [서버 - 사용자]간 인증횟수(counter)를 일치시켜야 인증이 수행됨.
( 인증서버는 사용자의 인증기록, counter를 알고있어야 함.)

[ 그림 : 3-4) OTP이벤트 동기화 알고리즘 ]






▶ OTP 이벤트동기화 과정 프로그래밍

1. 헤더 / 함수



2. 메인문






▶ OTP 이벤트동기화 과정 결과




2018년 3월 20일 화요일

고전암호 시저암호(Caesar)(초안)




1. 시저암호란?
 줄리어스 시저(Julius Caesar, 기원전 100년 경)라는 로마에서 활약했던 장군으로서 그 당시에 사용했으며, 이 사람의 이름을 본떠서 만든 시저암호를 알아보자. 암호학에서는 시저암호 또는 카이사르 암호(Caesar Cipher)라고도 부르기도 한다.

 시저암호는 대칭키 암호 방식이며, 평문에 키 값을 이용하여 치환시키는 일종의 치환 암호방식이라고도 생각할 수 있다. 키 값의 크기만큼 알파벳을 다른 알파벳으로 치환시키는 역할을 해준다. 그러므로 키 값은 영어 알파벳이 26자이므로  26보다 큰 키 값을 사용 시에 0~25사이로 정해질 수 밖에 없다.

그림을 통해 살펴보자
 1) 평문 → 암호문
 평문: water, 키 값: 3






 2) 암호문 → 평문
 암호문 : OOOOO, 키 값 : 3

 그림을 통해 알아보니 평문을 Key 값을 통해서 몇 번째 위치시키는지 결정해주는 방식이다.
 - 암호화 : 평문 + Key만큼 대칭이동
 - 복호화 : 암호문 -Key만큼 대칭이동
만약 Key 값이 26을 주어진다면  Key 값은 0 이나 다름이 없다. 알파벳은 26자 이므로, 원래 평문값으로 되돌아오는 규칙을 주의해야 한다.
 예를들어 key 값이 27인 경우 27 % 26 = 1으로 key 값이 1인 경우와 같은 결과가 나온다.

 시저암호(Caesar Cipher) 알고리즘 구현




 실행결과
1) 암호화
 

2)복호화


[Java] N-I/O(Non-Blocking) 파일 읽기 쓰기 - GatheringByteChannel, ScatteringByteChannel, ByteBuffer 사용.

우리는 지금까지 다음과 같이 살펴보았다. 1.  InputStream / OutputStream : 입, 출력 스트림을 바이트로 처리하여 읽기, 쓰기. 2.  FileInputStream / FileOutputStream : 입, 출력 스트림을 ...