개발

인터넷정보보안(report#1,2)

수릭스 2019. 5. 20. 23:53
반응형

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 가 제3C와 암호화된 연결을 할 수 있다면, C가 암호화된 링크를 통해 A B 에게 키를 전달할 수 있다.

1.11 세션 키와 마스터 키의 차이점은 무엇인가?

세션 키(Session key)는 양쪽 시스템(호스트,터미널 등)이 통신을 하고자 할 때 논리적 연결을 설정한다(가상 회성). 가상회선이 설정된 동안 모든 사용자 데이터는 일회용 세션 키(on-time session key)로 암호화된다. 세션이나 연결이 종료되면 세션 키를 폐기 한다. FEPKDC 사이의 통신은 둘 만이 공유하는 마스터 키를 이용해서 암호화 된다.

연습문제

2.2 ECB 모드에서 전송된 암호문 블록에 오류가 발생한다면 단지 해당되는 평문 블록에만 영향을 준다. 그러나 CBC 모드에서는 이 에러가 확산된다. 예를 들면, 전송된 C1 은 당연히 P1P2에 영향을 준다.

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 하여 그 결과를 돌려보낸다. 송신자는 그 값을 검사해서 만일 돌려받은 것이 자신이 생성해서 보냈던 임의 스트링과 같으면 수신자가 동일한 비밀키를 가지고 있다고 확신하는 것이다. 여기서 양쪽 어느 누구도 키를 전송한 적이 없음에 주의하라. 이 시스템에 결함이 있는가?

링크 암호화나 종단--종단 암호화에 적용할 수 있기는 하지만 공격자가 어떤 기회를 틈타서 한 번이라도 키를 얻을 수 있게 되면 그 뒤에 따르는 키들은 공격자에게 전부 노출 된다.링크 암호화 키들을 빈번히 바꿔야 한다면 매번 사람이 직접 전달을 해야만 하낟. 종단--종단 암호화에서 키를 보내기 위해서는 AB가 제 3C와 암호화된 연결을 할 수 있다면, C가 암호화된 링크를 통해 AB에게 키를 전달하는 방법을 이용하는 것이 좋다.

Chapter 3 공개키 암호와 메시지 인증

복습문제

3.1 메시지 인증에 대한 3가지 방법을 말하라.

관용 암호 사용 방법
: 송신자와 수신자가 동일한 키를 가지고 있다고 가정하면(필히 가지고 있어야 한다) 오직 진짜 송신자만이 수신자에게 보내는 메시지를 성공적으로 암호화 할 수 있다. 오직 송신자와 수신자만이 암호화키를 소유 한다면 인증을 확인할 수 있다.
공개키 암호 사용 방법

비밀값 사용 방법
: 통신의 양쪽 AB가 공통 비밀값 SAB를 가지고 있다는 가정 하에 수행된다. AB에게 보낼 메시지가 있을 때 비밀값에 메시지를 붙인 뒤에 그것에 해쉬함수를 적용한다. AB에게 [MMDM]을 보낸다. BSAB를 가지고 있기 때문에 H(SABM)을 계산할 수 있고 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)

여기서 pq는 프로그램을 이용하여 구하였음.(소스코드는 아래와 같음)

#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 = X1X2⊕…⊕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

P-Report#1_표지.hwp
0.01MB
P-Report#1.hwp
0.01MB
P-Report#2_표지.hwp
0.01MB
P-Report#2.hwp
0.02MB

반응형