디피-헬만 (Diffie-Hellman) 

디피-헬만(이하 DH)은 대칭키를 키 분배 센터(KDC, Key Distribution Center)없이 대칭키를 생성할 수 있는 암호 프로토콜을 의미합니다. KDC가 뭐냐하면 키를 분배하고 관리해주는 센터를 의미하는데요. 수 많은 호스트가 있는데 암호화 통신을 하려면 그 호스트들의 대칭키를 모두 가지고 있어야하니, KDC에게 키를 얻습니다. KDC는 물론 신뢰성이 큰 센터여야겠지요.  DH는 KDC없이도 대칭키를 서로 합의할 수 있도록 만들어줍니다. 아래의 그 과정을 봅시다.

우선 Alice와 Bob(암호학에서는 Alice와 Bob 이름에 친숙해지셔야합니다.)이 먼저 거쳐야 할 과정이 있습니다.

1) Alice와 Bob은 p와 g를 정하는데요. 매우 큰 300자리가 넘는 매우 큰 소수 p를 정합니다. 그리고 \(1 <= g <= p-1\)인 g를 정합니다. p와 g는 공개되어도 상관없습니다. 누구나 알아도 됩니다.

2) 그 후 Alice는 \(0 <= x < p-1\)인 x를 선택합니다. 이 사이의 수면 아무거나 상관없습니다. 그 후 R1=\(g^{x}\) mod p를 계산합니다. 여기서 mod는 모듈러 연산으로 \(g^{x}\)를 p로 나눈 나머지를 의미합니다. Alice가 정한 x는 Alice 본인만 알아야하는 값입니다. 절대 공개해서는 안되는 값입니다.

3) Bob도 역시 Alice와 마찬가지로 \(0 <= y < p-1\)인 y를 선택합니다. 그 후 R2=\(g^{y}\) mod p를 전달합니다.  y는 Bob만 알고 있어야합니다.

4) 이제 서로 R1과 R2를 당사자들에게 보냅니다. 

5) Alice는 R2\(^{x}\) mod p를 계산합니다. \((g^{y}\) mod p)\(^{x}\) mod p = \((g^{y})^{x}\) mod p = \(g^{yx}\) mod p로 이 값이 결국 대칭키 K가 됩니다.  

6) Bob도 역시 R1\(^{y}\) mod p 를 계산합니다. \((g^{x}\) mod p)\(^{y}\) mod p = \((g^{x})^{y}\) mod p = \(g^{xy}\) mod p로 이 값이 결국 대칭키 K가 됩니다.

결국 둘은 K=(g^{xy}\) mod p 인 대칭키를 갖고 있게 됩니다. 아래의 그림은 그 과정을 나타냅니다.(오타가 있네요. 아래 그림에 Bob이 생성한것은 R1이 아니라 R2입니다.) 

Diffie-Hellman

 

예제

이게껏 설명만 했는데 실제로 계산하는 과정을 보도록 하겠습니다.

Alice와 Bob은 p와 g는 11과 7로 설정했습니다. Alice는 x를 5로 선택하고 Bob은 y를 3으로 선택했다고 치겠습니다. R1=\(g^{5}\) mod p를 보내고, Bob은 R2=\(g^{3}\) mod p으로 하여 서로에게 보냅니다. 이제 Alice는 \((7^{3}\) mod 11)\(^{5}\) mod 11 = \((7^{3})^{5}\) mod 11 = \(7^{15}\) mod 11 의 값 K=10입니다. 이제 Bob도 역시 그렇게 계산을 하는데요. \((7^{5}\) mod 11)\(^{3}\) mod p = \((7^{5})^{3}\) mod 11 = \(7^{15}\) mod 11의 값은 역시 동일한 값으로 10임을 확인할 수 있습니다.

 

 

중간자 공격(Man-In-The-Middle-Attack)

만약 Alice와 Bob 사이에 공격자가 있다면 어떻게 될까요? 어찌 저찌 되어서 Alice가 Bob과 통신해야하는 것을 Eve로 착각했다고 합니다. Bob 역시 Alice와 통신을 해야하는데 Eve가 Alice로 알고 있다고 해봅시다. 그러면 Alice는 R1을 계산해서 Eve에게 주고, Bob도 R2를 계산해서 Eve에게 줍니다. Eve는 자신도 z를 정해서 R3를 양쪽 모두에게 전달해줍니다. 

이렇게 되면 Alice는 R3를 가지고 키 K1을 구할 수 있고 Eve 역시 위의 방법대로 K1을 구할 수 있습니다. Bob도 역시 R3를 가지고 K2를 구할 수 있게 되고 Eve 역시 K2를 구할 수 있습니다. 이제 공격자는 Alice와도 통신할 수 있고 Bob과도 통신할 수 있는 상황이 되었습니다. 공격자가 중간에 위치해서 민감한 정보를 모두 볼 수 있군요. 이런 공격 방식이 중간자 공격이라고 합니다.

man-in-the-middle attack

 

이산대수 공격

만약 Eve가 R1, R2를 가로챌 수 있다고 해봅시다. R1에서 x를 구하고, R2에서 y를 구할 수 있으면 K를 구하는 것을 쉽습니다. 그런 이산대수 공격에 대해서 안전하려면 p를 아주 매우 큰 소수로 정해놓아야합니다. 그래야 x,y를 구하기가 어렵거든요. p-1이 적어도 하나의 큰 소인수(60자리의 10진수 이상)을 가져야합니다. Alice와 Bob은 x,y를 사용 즉시 폐기하는 것이 좋습니다.

 

이상으로 디피-헬만 암호 프로토콜에 대해서 알아보았는데요. 모듈러 연산을 모르신다면 조금 어려울 수가 있는데요. 모듈러 연산에 대해서는 따로 시간을 내어 공부하시는 것이 좋을 듯 합니다. 쉽게 계산하는 규칙들도 존재하거든요. 디피-헬만은 ECC 암호화 알고리즘과 결합하여 사용하기도 합니다. ECDH라고도 하지요. 

DH에서 키를 구하는 문제가 이전 2016년 정보보안 기사 시험에 나온적이 있습니다.

 

 

반응형
블로그 이미지

REAKWON

와나진짜

,

 

 

보안의 3대 요소

컴퓨터 정보 보안에 대해서 진지하게 공부하기로 마음 먹었다면 꼭 알고 있어야 할 개념이 있습니다. 바로 정보보안의 세 가지 목표입니다. 개념은 어렵지 않으니 차근차근 읽어보면 이해하실 수 있을 겁니다.

기밀성(Confidentiality) 김일성아닙니다.

기밀성이라하면 통신하는 당사자만이 아는 비밀을 말하는데 정보보안에서는 이것을 기밀이라고 합니다. 정보보안에서 가장 많이 요구하는 조건이 바로 기밀이 보장되는 기밀성입니다. 군대나 은행, 산업체의 조직에서 기밀성이 필수적으로 요구되며 정보의 보관뿐만 아니라 정보의 전송에도 적용됩니다. 기밀성을 지키기 위해서는 데이터를 다른 사람들이 이해하지 못하도록 암호화하는 방법이 있습니다.

보안에서 기밀성을 위협하는 공격은 무엇이 있을까요? 간단하게 생각하면 남의 말을 엿듣는거나 훔치는 것이라고 생각하시면 이해하기 쉽습니다. 간단하게 몇 가지 알아보도록 해보지요.

- 스누핑(Snoofing)

스누핑은 비인가된 사용자가 중요 데이터에 접근하는 것이나 탈취를 의미합니다. 예를 들면, 인터넷으로 전성되는 파일이 기밀정보를 담고 있는데, 나쁜 노무 자식이 그 정보를 가로채고 자신의 이익을 위해 사용할 수 있지요.

- 트래픽 분석(Traffic Analysis)

데이터를 이해할 수 없더라도 공격자가 온라인 상에 전송되는 트래픽을 분석함으로써 다른 정보를 얻을 수 있습니다. 예를 들면, 공격자는 송수신자의 ip, 또는 이메일 주소, 또는 전송 성향을 추측하는데 도움이 되는 질의, 응답을 수집할 수 있습니다.

무결성(Integrity)

변경이 허락된 사람에게서 인가된 메카니즘을 통해서만 이뤄져야하는 것을 의미합니다. 정보는 시시각각 변화되는데, 이것이 인정된, 인가된 사람만 변경하는 것을 보장해야합니다. 허가되지 않은 사람이 변경했을때 이를 즉각 알 수 있어야합니다. 무결성을 위협하는 공격은 변경(Modification), 가장(Masquerading), 재연(Replaying), 부인(Repudiation)이 있습니다.

- 변경(Modification)

공격자는 정보를 가로채서 자신에게 이익이 될 수 있게 조작하는 것을 의미합니다. 원래는 송신자에게 줘야할 데이터를 중간에 공격자가 가로채서 자신의 주소로 바꾸거나 하는 것이 있습니다.

 

 

- 가장(Masquerading)

공격자가 인가된 사용자인척 하는 것을 의미합니다. 정보보안에서 스푸핑(Spoofing)이라는 공격 기법이 있는데요. IP나 MAC을 인가된 시스템의 주소로 변경하여 인가된 자인 척 정보를 획득합니다.

- 재연(Replaying)

재연이라는 것은 우선 공격자가 정보를 가로채고 난 이후 나중에 그 정보를 다시 사용함을 의미합니다. 즉, 공격자가 우선 전송된 데이터를 가지고 있다가 자신이 필요할 타이밍에 그 정보를 다시 보내는 것이죠. 예를 들어, 어떤 사람이 공격자에게 송금하라고 하는 데이터를 공격자가 가지고 있는데, 이 정보를 계속 이용해서 그 사람의 계좌에서 계속 돈을 공격자에게 보내는 공격이 있습니다. 그래서 재연이라는 공격을 막기위해 OTP(One-Time Password)를 사용합니다.

- 부인(Repudiation)

현실에서는 구라라고 하죠. 정보보안에서 부인이라함은 정보를 전송하거나 변경했을때 그 사실을 인정하지 않는 것을 말합니다. 현실에서 나중에 거짓말하지 못하도록 서명이나 도장을 찍듯, 정보보안에서도 디지털화된 서명(Digital Signature)이 적용됩니다.

가용성(Availability)

가용성은 정보가 사용가능해야한다는 것입니다. 중요한 정보를 사용하지 못 할 경우 심각한 피해를 입을 수 있으므로 정보에 대한 접근이나 사용이 인가된 자에 의해서 사용이 가능해야합니다. 가용성을 위협하는 공격은 아예 그 시스템을 마비시키는 서비스 거부 공격(DoS)이 있습니다. 한번쯤 어디선가 들어보셨죠?

- 서비스 거부(Denial of Service)

서비스 거부 공격은 가용성을 무너뜨리는 가장 일반적인 형태의 공격입니다. 이 공격을 통해서 서비스를 느리게 만들거나 아예 시스템을 마비시키는 공격입니다. 여러분은 이미 경험해본적이 많을 텐데요. 수강 신청 기간에 웹 페이지가 마비되는 현상을 경험해본적 있으시죠? 이런 현상은 공격이라고 보기는 어렵지만 시스템을 이렇게 만드는 것이 DoS 공격입니다. 여러분도 만들 수 있는데요. 무한 루프를 꾸준히 생성하는 프로세스를 만들 수도 있지요.

 

보안 서비스(Security Services)

ITU-T에서는 이러한 보안의 세 가지 목표를 달성하기 위해서 정보 보안에서는 5가지 서비스를 정의하게 됩니다.

 

 

 

데이터 기밀성(Data Confidentiality)

데이터 기밀성은 공격자가 데이터를 볼 수 없게 보호합니다. 스누핑과 트래픽 분석 공격을 막기 위해서 고안되었습니다. 간단하게 남들이 보지 못하게 만드는 것으로 수 많은 암호화 알고리즘을 사용하여 달성할 수 있습니다. 암호화에는 크게 대칭 암호, 비대칭 암호 알고리즘이 존재하지요. 데이터 기밀성은 스누핑(Snoofing)과 트래픽 분석 (Traffic Anaysis)을 막을 수 있습니다.

데이터 무결성(Data Integrity)

데이터의 무결성은 앞서 말한 변경, 삽입, 삭제, 재연 등으로부터 정보를 보호하는 것으로 메시지의 일부 또는 전체를 보호합니다. 예를 들면 암호학적 해시 함수를 통해서 데이터의 해시값을 만들어 전송하고 수신받는 사람은 전송받은 데이터를 기반으로 해시값을 생성하여 비교해보는 방법이 있습니다. 간단하게 암호학적 해시라함은 데이터를 암호학적 해시함수를 통해서 1:1 대응되는 다른 데이터로 만드는 암호학적 기법입니다. 이러한 암호학적 해시는 여러 해시 알고리즘이 존재합니다.

인증(Authentication)

그 사람이 인가된, 허가된 사람이 맞는지, 또는 데이터가 원하는 데이터가 맞는지확인하는 메커니즘을 사용합니다. 연결 지향(Connection-Oriented) 통신에서 연결이 되었을때 송신자 또는 수신자에 인증이 필요할 수 있습니다. 또는 비연결 지향(Connectionless) 통신에서는 그 데이터의 출처를 인증이 필요할 수 있습니다.

부인봉쇄(Nonrepudiation)

데이터의 송신자가 전송한 데이터가 맞다는 사실, 또는 수신자가 데이터를 수신했다는 사실을 거부할 수 없게 만드는 정보 보안 서비스입니다.

예를 들어, 만약 서버에서 이상한 IP주소로 공격이 발생했을때 시스템에 남아있는 로그를 통해서 그 IP에서 공격 사실을 부인봉쇄할 수 있습니다. 그러니 서버에서는 공격 탐지와 사실을 확인하기 위해 다양한 로그를 남깁니다.

접근제어(Access Control)

비인가된 접근을 제어하여 데이터를 보호하는 보안 서비스를 말합니다. 예를 들어 리눅스 시스템에서 파일의 주인은 데이터를 쓰고(Write) 읽고(Read) 실행(Execute)할 수 있고, 같은 그룹 사용자는 파일을 읽고 실행하는 권한만 있으며, 그 외의 사람은 읽기만 할 수 있습니다

 

 

.

반응형
블로그 이미지

REAKWON

와나진짜

,

 

 

HMAC(Hashed MAC)

HMAC은 CMAC과 더불어 자주 쓰이는 메시지 인증 코드 생성 방법입니다. 메시지 인증 코드(MAC : Message Authentication Code)에 대해서는 지난 포스팅을 참고하시기 바랍니다.

 

HMAC은 2번의 Hash 함수와 1개의 대칭키(또는 비밀키라고 하지요)를 사용합니다. 대칭키를 사용하였으니 메시지의 출처를 인증할 수 있겠네요. 왜냐면 key는 단 둘만 알고 있는 비밀이기 때문입니다. 그러니 메시지의 인증이 가능한 메시지 인증 코드입니다. 

 

HMAC의 과정은 아래의 그림이 간략하게 보여줍니다. 

 

 

이 그림에 ipad인지 opad인지 모르는 녀석들도 섞여있네요. 이제 글과 함께 위의 그림을 같이보도록 합시다. 

 

 

HMAC의 크기: n

메시지 블록의 크기: m 

 

1. 메시지 블록의 크기를 나눈다

우선 메시지를 일정한 크기(256 bit(32 byte)이던 512 bit(64 byte)이던)로 나눕니다. 이 일정한 메시지 블록의 크기를 m이라고 합시다. 

 

2. 비밀키를 패딩으로 채운다.

비밀키는 최종적으로 나오는 HMAC, 즉 n의 크기 이상을 권장합니다. 만약 비밀키가 m비트 이하라면 왼쪽에 0을 덧붙여 비밀키를 m비트의 크기로 채웁니다.

 

3. 그렇게 나온 비밀키와 ipad(input pad)와 XOR 연산을 한다. 

ipad는 m/8번의 연속된 이진열로 0011 0110(0x36)으로 이루어져있습니다. 자, 그럼 여기서 m은 8의 배수로 이루어져있어야 m/8이 정수가 되겠네요. 만약 m이 16비트라면 ipad는 0011 0110 0011 0110인 ipad가 될것이고 패딩된 키와 XOR 연산이 될 것입니다.

 

4. 3의 연산된 값을 메시지 블록 맨 앞에 놓는다.

이렇게 되면 총 N+1개의 메시지 블록이 생겨납니다.

 

5. 해쉬 함수로 메시지 다이제스트를 n비트 생성한다.

4에서 연산된 N+1개의 메시지 블록 전체를 해쉬 함수로 해쉬 값을 생성해냅니다. 생성된 값은 중간 HMAC이라고 합니다.

 

6. 중간 HMAC을 m비트로 만들기 위해 0으로 채운다.

이 중간 HMAC을 다시 해쉬 함수를 만들기 위해 m비트로 맞춥니다.

 

7. 다시 패딩된 비밀키와 opad(output pad)를 XOR한다.

opad는 m/8번의 연속된 이진열 0101 1100(0x5C)로 이루어져있습니다.

 

8. 7의 결과값을 중간 HMAC 앞에 놓는다.

최종적인 HMAC을 만들기 위해서 7번의 결과와 HMAC을 합칩니다.

 

9. 마지막으로 중간 HMAC을 만든 동일한 해쉬 함수를 통해 최종 HMAC을 생성해낸다.

 

10. 결과적으로 나온 HMAC을 메시지 뒤에 붙여 상대방에게 전송하면 HMAC의 과정은 끝이납니다.

 

이상으로 HMAC에 대한 설명과 어떻게 만들어지는지에 대한 과정 설명을 마칩니다.

 

 

 

 

반응형
블로그 이미지

REAKWON

와나진짜

,

 

 

 

 

흔히 우리가 문서가 변조 또는 위조되었는지 확인하기 위해서 핑거프린트(finger frint)를 사용하지요. 디지털에서는 어떻게 위조되었는지 알 수 있을까요?

디지털 메시지를 다룰때 우리는 그 메시지가 변경이 되었는지 또는 이 메시지가 내가 알고 있는 그 사람에게 왔는지 확인해야할 필요가 있는데 메시지 변경 감지 코드(MDC:Modification Detection Code)메시지 인증 코드(Message Authentication Code)가 그 역할을 합니다.

 

MDC(Modification Detection Code)

메시지 변경 감지 코드는 메시지의 변경이 일어났는지 아닌지를 확인합니다. 즉, 데이터의 무결성을 판단하게 됩니다.

 

송신자 : 송신자는 원본의 메시지는 그대로 보내고 그 메시지를 암호학적 해쉬 함수를 통해 해쉬값을 만든게 MDC인데, 안전한 채널로 보내게 됩니다. 이때 안전한 채널로 외부로부터 변경이 되지 않는다는 보장이 되어야합니다.


암호학적 해쉬 함수 : 암호학적 해쉬 함수는 메시지의 해쉬 값을 만드는 함수로 일방향 함수여야합니다. 그러니까 해쉬값을 만드는 것은 되지만 해쉬값으로부터 원본 값을 알 수 없어야하고 메시지와 해쉬값이 1:1이 되어야합니다. 암호학적 해쉬함수의 기준은 3가지 저항성을 충족시켜야합니다. 
1) preimage resistance
2) second preimage resistance
3) collision resistance

한마디로 깨기 어려워야한다는 것이고, 저도 암호학적 해쉬함수에 해박한 지식은 없으므로 이정도하고 넘어갑시다.

수신자 : 수신자는 전달받은 메시지를 MDC로 다시 만들며 전달받은 MDC와 비교하여 이 둘이 같다면 변경이 되지 않은 것이고 변경이 되었다면 이 메시지는 변경되었다고 판단합니다.

 

MAC(Message Authentication Code), TCP/IP 2계층 아님.

메시지가 내가 원하는 바로 그 사람으로부터 왔는지 판단하려면 어떻게 하면 좋을까요? 서로만 아는 사실 하나만 추가하면 됩니다. 바로 키만 섞어주면 되죠.

 

송신자 : 송신자는 수신자와 미리 공유된 키를 가지고 메시지 해쉬값을 만들어 냅니다. 이것이 우리가 이야기하는 메시지 인증 코드, MAC입니다. 이것을 메시지와 함께 보냅니다.

수신자 : 송신자로부터 받은 MAC과 메시지를 키와 함께 해쉬값을 만든 후 비교합니다. 같다면 원하는 송신자로 온것이 확인이 되고 아니라면 메시지가 변경이 되었거나, 누군가가 임의로 보낸거겠죠? 

 

 

MAC은 이처럼 무결성과 인증을 같이 제공합니다. 

CMAC

메시지는 일반적으로 큰 경우가 많기 때문에 이 메시지를 한번에 MAC으로 만들 수는 없습니다. 그래서 메시지를 일정 비트 단위로 쪼개서 MAC을 만들어가는데 그 중 한가지가 CMAC입니다.

CMAC은 CBCMAC과 같은 의미로 불리는데 블록 암호에서 CBC와 유사한 방법을 사용하기 때문입니다.  CMAC을 진행하기 전에 송신자와 수신자는 key를 공유한 상황이어야합니다.

 

CMAC은 다음의 과정을 거치게 됩니다. 

 

1) 메시지를 m bit씩 n개로 쪼갭니다.

2) 만약 마지막 메시지 블록이 m bit가 못된다면 나머지 첫비트는 1, 다른 비트는 전부 0으로 채워버립니다. 패딩이라고 하지요.

3) 이제 앞의 메시지 블록부터 차례대로 사전에 공유된 키, key로 암호화하고 암호화한 값을 이 후의 블록과 xor을 진행합니다.

이 과정을 마지막 블록까지 진행합니다.

4) 마지막 블록에는  k와 xor 연산을 진행한 후 마지막 암호화를 진행합니다.  k는 마지막에 한번만 xor연산을 위해 사용되는데 key로부터 파생된 값입니다. m bit의 메시지 블록을 xor하기 위해서는 k도 m bit의 크기를 갖고 있어야겠지요.

5) 그 결과를 왼쪽의 n비트를 뽑아서 메시지에 붙여서 보냅니다.

 

 

 

이상으로 메시지 변경 감지 코드, 메시지 인증 코드, 메시지 인증 코드의 CMAC 방식을 알아보았습니다.

 

 

반응형
블로그 이미지

REAKWON

와나진짜

,

 

 

비대칭키 암호(Asymmetric Key Cryptography)

대칭키 암호가 양쪽 통신 당사자가 같은 키를 공유하는 암호화 방식이라면 비대칭 키는 대충 느낌이 오시지 않나요? 비대칭 키 암호는 양쪽이 다른 키를 가지고 있습니다.

 

비대칭키에서 타인 모두에게 공개하는 키를 공개키(public key), 그리고 자기 자신만이 갖고 있는 키가 개인키(private key)라고 합니다. 따라서 공개키는 누구나 다 알 수 있고 누구나 다 암호화할 수 있지만 푸는 사람은 그에 맞는 개인키를 가지고 있는 사용자가 됩니다.

 

기본 아이디어

아이디어는 다음의 그림과 같습니다.

은밀한 데이터를 보내는 A는 B의 공개키로 데이터를 암호화한 후 B에게 보냅니다. B는 이 데이터를 풀어야하는데 개인키를 통해서 암호화된 데이터를 풀게 되지요. 

 

여기서 비대칭키 암호의 특징 몇가지가 있습니다.

1) public key는 모두에게 공개해야하는데 이 public key를 가지고 private key를 구해내기가 상당히 어려워야합니다. 

2) public key와 private key는 짝이 맞아야합니다. 그래야지 암복호화를 정상적으로 할 수 있게되죠.

3) 대칭키는 통신 주체들이 각각 키를 갖고 있어야하므로 당사자가 n명이 있다고 할때 필요한 키의 개수는 n(n-1)/2개가 됩니다. 하지만 비대칭키 암호는 2개만 있으면 됩니다. 바로 공개키와 개인키가 그것이 되겠죠.

4) 비대칭키의 암호화 과정과 복호화 과정은 상당히 느립니다. 그렇기 때문에 보통의 데이터를 암호화할 수 없죠. 아주 중요한 데이터를 암호화할때 쓰이는데 바로 대칭키의 키 교환할때 쓰입니다.

 

RSA(Rivest, Shamir, Adleman)

비대칭키 암호의 가장 대표적인 알고리즘은 바로 RSA 알고리즘입니다. RSA는 고안자들의 앞 약자입니다. 그 중에서도 Rivest형이 가장 실세인가 보네요.

 

RSA는 소인수 분해의 어려움을 기반으로 하는 알고리즘인데 수학을 좀 많이 알아야만 제대로 이해할 수 있습니다. 저와 같은 일반인 수준에서는 아~~ 그렇게 되는가보다 하고 끝내는게 정신건강에 좋습니다. 여기서는 그냥 아~ 그렇게 되는가 보다 하고 맘편히 읽어주세요.

 

- 오일러 토션 함수(Euler's totiont function)

RSA를 이해하기 전에 우리는 오일러 토션 함수에 대해서 알아야합니다. 저도 모르니 그냥 필요한 식만 적도록 하겠습니다. 함수의 기호를 찾을 수 없으므로(능력 부족..) t라고 표시하도록 하겠습니다.

오일러 토션 함수는 n보다 작은 수 중 n과 서로소인 수의 갯수를 구하는 함수입니다. 서로소라함은 두 수의 공약수가 1외에는 없는 수를 말합니다. 

 

오일러 토션 함수 공식


1. t(1)=0
2. t(p)=p-1, p는 소수
3. t(m*n)=t(m)*t(n)
4. t(p^e)= p^e - p^(e-1) (^는 제곱을 의미합니다. p^e= p의 e제곱)

 

예제)

1. 15보다 작은 수 중에 15와 서로소는 몇개일까요? 

1, 2, 4, 7, 8, 11, 13, 14 로 8개입니다. 우리가 위의 공식을 적용하여 구한다면 아래와 같습니다.

t(15) = t(3*5) = t(3) * t(5) = 2*4 = 8

 

2. t(14)는 얼마일까요? 

t(14) = t(7*2) = t(7) * t(2) = 6*1 =6 , 실제로 1, 3, 5, 9, 11, 13이 있습니다.

 

 

 

 

RSA 암복호화 과정

RSA는 두 소수 p와 q를 선택하여 곱한 n을 구합니다. 이 수는 소수이기 때문에 오일러 토션 함수를 이용해서 t(n) = t(p)*t(q) = (p-1)*(q-1) 이 성립이 됩니다. 이제 이 안에서 두개의 지수 e와 d를 고르는데요. 이 e와 d는 t(n)과 서로소이며 mod t(n) 연산에서 서로 역원 관계입니다. t(n)과 서로소라면 e와 d는 t(n)보다 작은 수 중 소수를 선택하면 무조건 t(n)과 서로소가 되지요.

만약 소수 t(n)보다 작은 e를 선택했다면 (e*d)mod t(n)=1를 만족하는 d를 구하면 됩니다. e는 d의 역원이라하여 e=(d^-1)mod t(n)으로 표현하기도 합니다. 

 

아래에서는 실제 어떻게 RSA를 통해 암복호화가 되는지 살펴보도록 합니다. 최대한 구별가능하게 컬러로 하고 e와 d를 쉽게 구하는 공식도 소개합니다.

 

1) pq를 소수 711로 선택합니다.

2) 그리고 n을 구하죠. n=7*11이므로 77이 됩니다. t(77) = t(7) * t(11) = 60이 됩니다.

3) 이제 ed를 선택하는데 만약 e를 13으로 선택하면 d는 37입니다. (e*d)mod60=(13*37)mod60=1이기 때문에 서로 역원이죠. e는 t(77) = 60보다 작은 수 중 60과 서로소입니다. 13은 소수이기 때문에요.

 

* 여기서 한가지 공식이 있는데, e를 13을 골랐다면 e의 역원은 다음과 같습니다.

(13^(t(77)-1)) mod t(77) = 13^(59) mod 60 = 37

 

번외)

자, 그렇다면 e를 다른 수를 골라보도록 하지요. e를 23을 고른다면 d는 아래와 같이 구해지겠네요.

d = 23^(t(77)-1) mod t(77) = 23^(60-1) mod 60 = 23^59 mod 60 = 47

암호화

이제 평문 5를 RSA로 암호화 한다면 

(5^13)mod 77 = 26이 되어 암호문이 됩니다.

복호화

다시 복호화하게 되면 (26^37)mod 77 = 5가 되므로 복호화가 됩니다. 

여기서 d는 나의 private key로 쓰이고, e는 n과 함께 공개되며 공개키로 쓰입니다.

 

여기서 e와 n을 가지고 d를 구하는것이 아주 상당히 어렵습니다. 수식은 있긴한데 쓰지 않는게 멘탈에 좋을 것 같습니다.

 

 

 

 

반응형
블로그 이미지

REAKWON

와나진짜

,

 

 

대칭키 알고리즘

대칭키 알고리즘이라는 것은 동일한 키를 사용하여 암호화와 복호화를 하는 것을 의미합니다. 기본적인 용어부터 짚어보도록 하지요.

 

평문(Plain text) : 암호 알고리즘이 적용되지 않은 비트열, 또는 문자열을 의미합니다.

암호문(Chiper text) : 암호알고리즘이 적용된 비트열, 또는 문자열입니다. 키를 갖고 있지 않은 사람은 해독할 수 없습니다. 

 

이제 평문이 어떻게 암호문으로 암호화가 되고 어떻게 다시 평문으로 복구가 될까요? 답은 xor연산입니다. xor연산을 2번 적용하게 되 같은 비트열로 돌아오게 되는것을 이용합니다. 아래가 그 예가 되겠네요.

     0100 1100 (plain text)
xor 0110 1100 (key)
------------------------------
     0010 0000 (chiper text)

     0010 0000 (chiper text)
xor 0110 1100 (key)
-------------------------------
     0100 1100 (plain text

 

현재 대칭키 알고리즘은 물론 이것보다 더 많은 복잡한 과정을 더 거치게 됩니다. 

 

그 중에서 가장 많이 사용되는 대칭키 알고리즘인 AES에 대해서 알아보도록 합시다.

 

AES(Advanced Encryption Standard)

평문은 항상 128비트로 고정이 됩니다. 그럼 몇바이트인가요? 16바이트겠네요. 

16바이트의 평문이 Round key와 각 Round에서 지지고 볶아져 다음 Round로 가게 되고 최종 Round에서는 마침내 암호문이 나옵니다.  

 

암호문은 다시 역순서로 복호화되어 평문이 나오게 되지요.

 

AES는 세가지 버전이 있는데, AES128, AES192, AES256이 바로 그것들입니다. 이름뒤에 나오는 숫자는 암호화할때 사용되는 키의 비트수인데, 이 비트수마다 라운드가 다릅니다. 아래의 표로 정리했으니 참고하세요.

Round N Key size
10 128
12 192
14 256

 

- 키확장 (Key Expansion) : 입력으로 들어오는 key를 단순히 쓰는게 아니라 각 라운드에서 사용될 키를 파생시키는 역할을 합니다.

 

그렇다면 각 Round는 어떻게 구성되어있을까요?

우선 암호화될 평문의 데이터(128비트)는 2개의 16진수로 4x4 행렬로 나타냅니다. 이것을 State라고 부르는데 이  4x4 행렬블록은 SubBytes -> Shift Rows -> Mix Columns -> Add Round key를 거쳐서 최종 State가 나오게 되지요.

이렇게 나온 State는 다시 다음 Round로 향하게 됩니다.

 

 

Round 연산을 아래 간략하게 설명합니다.

- SubBytes : 대치(Substitution)을 사용하여 혼돈 효과를 줍니다. AES는 SubBytes 변환 테이블이라는 것을 이용하여 대치합니다.

- Shift Rows : 말 그대로 행을 shift하는데, 비트를 왼쪽으로 이동시킵니다. 코드로는 단순히 row<<1이 되겠네요.

- Mix Columns : 행렬의 곱셈을 이용하여 바이트들을 섞습니다. 행렬에 관한 지식이 있어야합니다. 

State의 열을 특정 C라는 행렬로 새로운 열을 만들어냅니다. 이렇게 column을 뒤섞는데요. 이때 원래의 state로 되돌리기 위해서 복호화할때는 C의 역행렬을 사용해야합니다.
행렬의 연산을 모른다싶으시면 그냥 그런 연산을 하는구나 참고만 하시면 될 것 같습니다.

- Add Round Key : 라운드키를 이용하여 최종적인 State를 만들어냅니다.

 

AES 안전성

AES는 DES 다음의 설계된 대칭키 암호알고리즘으로 어떤 공격도 AES를 뚫는데에 성공하지 못했습니다. 그러므로 현재는 가장 안전한 대칭키 암호알고리즘으로 볼 수 있습니다. 특히 DES와는 다르게 사용하는 키의 크기가 훨씬 큽니다. 

 

AES 구현 

AES는 소프트웨어, 하드웨어, 펌웨어 등으로 구현할 수 있고 매우 빠르게 동작합니다. AES 알고리즘은 단순하여 최소의 메모리를 사용할 수 있습니다. 서로 키만 잘 전달이 된다면 이런 이점을 이용해 AES를 사용해서 안전한 통신을 할 수 있습니다. 

 

이상으로 AES에 대해서 알아보았습니다. 

 

 

반응형
블로그 이미지

REAKWON

와나진짜

,