인터넷정보보안(report#1,2)
Chapter 2 대칭 암호와 메시지 기밀성
▣ 복습문제
1.4 블록 아호와 스트림 암호의 차이는 무엇인가?
블록 암호(block cipher)는 한 번에 한 블록씩 입력하여 처리하고 한 블록씩 출력한다. 스트림 암호(stream cipher)는 입력 요소들을 연속적으로 처리하여 입력된 요소들이 끝날 때까지 한 번에 한 요소씩 출력한다.
1.7 3중 암호화란 무엇인가?
알고리즘은 암호-복호-암호(EDE: encrypt-decrypt-encrypt) 순서를 따른다.
C = 암호문
P = 평문
EK[X] = 키 K 를 이용해서 X 를 암호화
DK[Y] = 키 K 를 이용해서 Y 를 복호화
복호화는 단순히 키의 순서를 바꿔서 적용하면 된다.
1.10 비밀키를 통신 양측에 분배하는 방법들을 열거하라.
① A 가 키 한 개를 선택해서 물리적 수단을 통해 B 에게 전달한다.
② 제 3자가 키를 선택하고 물리적 수단을 통해 A 와 B 에게 전달한다.
③ A 와 B 가 최근까지 이미 사용하고 있는 키를 가지고 있다면, 어느 한 쪽이 그 키를 이용해서 새 키를 암호화하여 상대방에게 전송한다.
④ A 와 B 가 제3자 C와 암호화된 연결을 할 수 있다면, C가 암호화된 링크를 통해 A 와 B 에게 키를 전달할 수 있다.
1.11 세션 키와 마스터 키의 차이점은 무엇인가?
세션 키(Session key)는 양쪽 시스템(호스트,터미널 등)이 통신을 하고자 할 때 논리적 연결을 설정한다(가상 회성). 가상회선이 설정된 동안 모든 사용자 데이터는 일회용 세션 키(on-time session key)로 암호화된다. 세션이나 연결이 종료되면 세션 키를 폐기 한다. FEP와 KDC 사이의 통신은 둘 만이 공유하는 마스터 키를 이용해서 암호화 된다.
▣ 연습문제
2.2 ECB 모드에서 전송된 암호문 블록에 오류가 발생한다면 단지 해당되는 평문 블록에만 영향을 준다. 그러나 CBC 모드에서는 이 에러가 확산된다. 예를 들면, 전송된 C1 은 당연히 P1과 P2에 영향을 준다.
a. P2 이후의 블록들도 영향을 받는가?
암호 블록 체인 모드(CBC:cipher block chaining mode)에서는 현재의 평문 블록과 바로 직전의 암호 블록을 XOR 한 것을 알고리즘의 입력으로 사용한다. 각 블록에서 동일한 키를 사용한다. 사실 평문 블록 열의 처리를 이어서 한 줄로 연결한 것이다. 각 평문 블록에 대한 암호 함수의 입력이 평문 블록에 끼치는 영향은 일정한 형태가 아니다. 따라서 64비트 반복 패턴들이 드러나지 않게 된다.
b. P1 의 초기 버전에 단일 비트 오류가 있다고 가정하자. 이 오류가 몇 개의 암호 블록에 확산되는가? 수신자는 어떤 영향을 받는가?
복호에서는 각 암호 블록을 복호 알고리즘에 입력한다. 결과로 출력된 블록은 평문을 복구하기 위해 전 단계의 암호블록과 XOR 를 한다.
첫 번째 암호블록을 만들기 위해 초기화 벡터(IV:Initialization Vector)와 첫 번째 평문 블록을 XOR 한다. 복호에서 IV 는 첫 번째 평문 블록을 복구하기위해 복호 알고리즘의 출력과 XOR 을 한다.
송신자와 수신자는 모두 IV를 알고 있다. 보안성을 강화하기 위해 IV도 키 처럼 보호해야 한다. 이를 위해서 IV 를 보낼 때 ECB 암호를 이용해서 보낼 수 있다. IV를 보호해야 하는 이유는 다음과 같다. 어떤 공격자가 다른 값을 갖는 IV 를 가지고 수신자를 속일 수 있다면 그 공격자는 첫 번째 평문 블록의 선택된 비트들을 회복할 수 있다.
2.3 8비트 CFB 모드에서 암호문 문자 전송 중 한 비트 오류가 있다면 그 오류가 어디까지 확산되는가?
어떤 블록 암호도 스트림 암호로 바꿀 수 있다. 스트림 암호의 경우 메시지의 길이가 블록의 정수배가 되도록 패딩을 할 필요가 없고 실시간으로 사용할 수 있다. 따라서 한 문자를 전송하는 경우 문자 중심 스트림 암호를 이용하여 각 문자가 암호화 되는 즉시 전송할 수 있다.
전송 단위를 s 비트라고 가정한다. 보통 s=8이다. CBC의 경우처럼 평문의 단위가 연결되어 있기 때문에 평문을 암호화할 때 바로 한 단계 전의 평문을 입력으로 사용한다. 암호 함수의 입력은 어떤 초기값 IV 를 갖는 64비트 쉬프트 레지스터이다. 암호화 함수 출력의 가장 왼쪽 s 개 비트들은 암호문 C1 의 첫 번째 단위를 생성하기 위해서 평문 P1의 첫 번째 단위와 XOR 을 한 다음 전송한다. 그리고 쉬프트 레지스터의 내용을 s 비트만큼 왼쪽으로 이동하고 C1 을 쉬프트 레지스터의 가장 오른쪽 s비트에 복사한다. 평문이 모두 암호화 될 때까지 이 과정을 계속한다.
2.5 두 사람이 동일한 비밀키를 갖고 있는지 확인하는 확실한 방법으로 다음과 같은 방법을 제시하였다고 하자. 송신자는 자신이 가지고 있는 키의 길이와 같은 임의의 비트 스트링을 생성하고, 그것을 키와 XOR 하고, 채널을 통해 그 결과를 수신자에게 보낸다. 수신자는 키(송신자와 같은 키)를 가지고 수신된 블록을 XOR 하여 그 결과를 돌려보낸다. 송신자는 그 값을 검사해서 만일 돌려받은 것이 자신이 생성해서 보냈던 임의 스트링과 같으면 수신자가 동일한 비밀키를 가지고 있다고 확신하는 것이다. 여기서 양쪽 어느 누구도 키를 전송한 적이 없음에 주의하라. 이 시스템에 결함이 있는가?
링크 암호화나 종단-대-종단 암호화에 적용할 수 있기는 하지만 공격자가 어떤 기회를 틈타서 한 번이라도 키를 얻을 수 있게 되면 그 뒤에 따르는 키들은 공격자에게 전부 노출 된다.링크 암호화 키들을 빈번히 바꿔야 한다면 매번 사람이 직접 전달을 해야만 하낟. 종단-대-종단 암호화에서 키를 보내기 위해서는 A와 B가 제 3자 C와 암호화된 연결을 할 수 있다면, C가 암호화된 링크를 통해 A와 B에게 키를 전달하는 방법을 이용하는 것이 좋다.
Chapter 3 공개키 암호와 메시지 인증
▣ 복습문제 ▣
3.1 메시지 인증에 대한 3가지 방법을 말하라.
① 관용 암호 사용 방법
: 송신자와 수신자가 동일한 키를 가지고 있다고 가정하면(필히 가지고 있어야 한다) 오직 진짜 송신자만이 수신자에게 보내는 메시지를 성공적으로 암호화 할 수 있다. 오직 송신자와 수신자만이 암호화키를 소유 한다면 인증을 확인할 수 있다.
② 공개키 암호 사용 방법
③ 비밀값 사용 방법
: 통신의 양쪽 A와 B가 공통 비밀값 SAB를 가지고 있다는 가정 하에 수행된다. A가 B에게 보낼 메시지가 있을 때 비밀값에 메시지를 붙인 뒤에 그것에 해쉬함수를 적용한다. A는 B에게 [M∥MDM]을 보낸다. B는 SAB를 가지고 있기 때문에 H(SAB∥M)을 계산할 수 있고 MDM을 확인할 수 있다. 비밀값 자체를 보내지 않기 때문에 공격자가 중간에 가로챈 메시지를 수정하는 것이 불가능하다.
3.5 해쉬함수의 입장에서 압축 함수란 무엇인가?
압축함수가 충돌(collision)에 저항성을 갖는다면 결과로 얻어지는 해쉬함수도 충돌에 강할 것이다. 그래서 이 구조를 이용하면 어떤 크기의 메시지에도 적용할 수 있는 안전 해쉬함수를 만들 수 있다. 문제를 단순화 하면 이것은 일정한 크기의 입력에 적용할 수 있는 충돌 저항성을 갖는 압축 함수를 설계하는 문제이다. 이 방법은 근본적으로 강하다고 검증되었고 새로운 디자인이라고 하는 것들은 해쉬함수를 좀 더 세밀하게 만들고 해쉬코드 길이를 늘이는 정도의 변화를 추구하는 것에 불과하다.
각 라운드가 20단계로 된 네 개의 라운드로 이뤄진 것이 압축 함수이다.
3.10 공개키 인증서란 무엇인가?
공개키 인증서(public-key certificate)란 공개키와 키 소유자의 사용자 ID로 구성되고 이 전체에 대해 신뢰할만한 제3자가 서명한 것을 말한다. 전형적으로 제3자라 하면 정부기관이나 금융기관 같은 사용자들 모두가 신뢰하는 인증기관(CA: certificate authority)을 말한다. 사용자는 안전한 방법으로 자신의 공개키를 기관에 제시하고 인증서를 발급받아 그 인증서를 공개할 수 있다. 이렇게 공개된 공개키를 이용하고자 하는 다른 사용자들은 인증서를 얻을 수 있고 첨부된 신뢰할만한 서명을 이용해서 그 공개키가 적법한 것임을 확인할 수 있다.
▣ 연습문제 ▣
3.6 RSA를 이용하는 공개키 시스템에서, 공개키가 e = 5, n = 35 인 사용자에게 보내지는 암호문 C = 10 을 가로챘다고 하자. 이 때 이에 대응되는 평문 M 은 무엇인가?
M = Cd
φ(n) = (p-1)(q-1), p=5, q=7
φ(35) = 4×6 = 24
d×5 mod 24 = 1, d = 5
∴ M = Cd = 105 = 100000
3.7 RSA 시스템에서 한 사용자의 공개키가 e = 31, n = 3,599 이다. 이 사용자의 개인키는 무엇인가?
개인키 KR = {d,n}
de mod φ(n) = 1
φ(n) = (p-1)(q-1)
여기서 p와 q는 프로그램을 이용하여 구하였음.(소스코드는 아래와 같음)
#include <iostream.h>
int IsPrime(int num);
void main()
{
int p, q;
bool c = true;
for(p=2p++)
{
if(!IsPrime(p)) continue;
if(c==true)
{
for(q=2q++)
{
if(!IsPrime(q)) continue;
if(p*q == 3599)
{
cout << "p:" << p << "q:" << q << endl;
c = false;
break;
}
else if(p*q > 3599)
break;
}
}
else
break;
}
}
int IsPrime(int num)
{
int i,flag=1;
for(i=2; i < num; i++ ){
if(num % i==0)
{
flag=0;
break;
}
}
return flag;
}
n = p×q, 3599 = 59×61
φ(3599) = 58×60 = 3480
(d×31) mod 3480 = 1 ☞ d계산은 프로그램을 이용하여 구하였습니다.(소스코드는 아래와 같습니다.)
∴ d = 3031
#include <iostream.h>
#include <math.h>
void main()
{
int d=1;
while(1)
{
if(d*31 % 3480 == 1)
{
cout << "d:" << d << endl;
break;
}
else
d++;
}
}
3.11 일방향 해쉬함수를 만들기 위해 알려진 키를 가지고 RSA를 이용하는 것을 고 려해보자. 다음과 같은 블록들로 구성된 메시지를 처리한다: 첫 번째 블록을 암호화 하고, 그 결과를 두 번째 블록과 XOR 한 다음 암호화를 하고, 이 과정 을 계속 한다고 하자. 아래의 문제를 풀어서 이 구조가 안전하지 않다는 것을 보여라. 두 블록 메시지 B1, B2와 해쉬
RSAH(B1, B2) = RSA(RSA(B1)⊕B2)
가 주어졌다. 주어진 임의의 블록 C1에 대해 RSAH(C1,C2) = RSAH(B1,B2) 가 되도록 C2를 선택하라.
일방향 해쉬함수를 만들기 위해 RSA를 이용하는 방법을 고려해 보았지만 문제를 풀 수 없었습니다. 일방향 해쉬함수와 RSA와 관련된 내용 학습이 좀 더 필요한 것 같습니다. 블록 단위로 암호화하고 XOR 하는 과정과 주어진 조건에 맞게 해를 구해낼 수 있도록 추가적인 학습을 하도록 하겠습니다. 아래는 관련 내용을 정리해본 것입니다.
해쉬코드만 암호화할 경우에는 비록 단순한 XOR 이나 회전 XOR(RXOR)이 불충분하기는 하지만 어떤 사람들은 해쉬코드뿐만 아니라 메시지까지 암호화 할 때 이와 같은 단순한 함수가 유용하다고 여길 수 도 있다. 연속된 64-비트 블록들 X1,X2,…XN으로 이뤄진 메시지가 주어졌다. 블록별 XOR이나 모든 블록으로 해쉬코드 C를 정의하고 마지막 블록에 그 해쉬코드를 덧붙인다.
C = XN+1 = X1⊕X2⊕…⊕XN
3.12 공통된 소수 q = 11과 원시근 α = 2를 가지는 Diffie-Hellman 구조를 고려 하자.
a. 만일 사용자 A가 공개키 YA = 9를 갖는다면, A의 개인키 XA는 무엇인가?
YA = mod q, XA < q
9 = mod 11
Xa는 프로그램을 이용하여 구하였습니다.(소스코드는 아래와 같습니다.)
Xa = 6
#include <iostream.h>
#include <math.h>
void main()
{
double xa=1;
int tmp;
while(1)
{
tmp = pow(2, xa);
if(tmp%11 == 9)
{
cout << xa << endl;
break;
}
else
xa+;
}
}
b. 만일 사용자 B가 공개키 YB = 3을 갖는다면, 공유하는 비밀키 K는 무엇인가?
k = mod q, 36 mod 11 = 3