일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- mutate()
- select()
- sample_n()
- distinct()
- 대칭형 알고리즘
- arrange()
- dplyr
- samp;e_frac()
- filter()
- summarize()
- proc contents
- AES
- groupe_by()
- Today
- Total
Gae Ko's Blog
ppt 대용 발표자료 본문
---------------------------------------------------------------------------------------
RSA
- 공개키 암호 시스템으로 공개키와 개인키를 사용
- 공개키는 모두에게 알려져 있으며 암호화할 때 사용하고 개인키를 가진 자만이 암호화된 것을 복호화할 수 있음
- 키 생성 과정
- n = pq (p와 q는 서로 다른 두 소수)
- Φ(n) = (p-1)(q-1)
- gcd(e, Φ(n))= 1인 e선택하여 ed mod Φ(n)=1인 d 생성
이 때 확장된 유클리드 호제법을 사용하여 d를 구한다
- 암호화 : c = m^e mod n
- 복호화 : m = c^d mod n
----------------------------------------------------------------------------------------
[문제]
주어진 파일 안에는 lol_pub.pem 과 text.txt 두 가지 파일이 있다.
이름을 보아 lol_pub.pem은 공개키에 관한 파일이고 text.txt는 암호화된 파일인거 같다.
복호화하면 플레그가 있는게 아닌가 싶다.
[풀이]
공개키는 숫자인데 lol_pub.pem 파일을 보면 base64로 인코딩된 듯한 문자와 위아래로 텍스트 문자열이 들어가있다. 이러한 형태를 띄고 있는 파일은 PEM(Private Enhanced Mail)포맷파일로, 공개키를 암호화한 파일이다.
직접 base64 디코딩해줘도 되지만 키값이 아닌 데이터도 포함되어 있기 때문에 정확한 키를 알아내기 위해 openssl이라는 툴을 사용한다.
openssl은 네트워크를 통한 데이터 통신에 쓰이는 TLS와 SSL프로토콜을 구현하는 오픈소스 라이브러리로, 인증서 확인 및 키 생성 등의 기능을 제공하고 있다.
pem인코딩된 인증서를 파싱하여 정보를 출력하기
openssl rsa -noout -text -pubin -in lol_pub.pem
공개키 중 n은 225bit를 사용하고 있고, e는 65537이라는 값임을 알 수 있음
- n의 정확한 값을 알고 싶다면 다음과 같은 작업을 해주면 된다.
ans1parse란 openssl에서 ANS.1형식 파일을 파싱해주는 툴이다.
다음 링크를 가보면 ans1parse에 대한 설명과 사용할 수 있는 옵션들에 대해 설명및 결과에 대한 설명이 있다.
(https://www.openssl.org/docs/man1.0.2/apps/asn1parse.html)
a. 환경변수로 문자열을 파싱
PUBKEY=`grep -v -- ----- lol_pub.pem | tr -d '\n'`
b. 그 결과를 base64 디코딩하여 openssl을 이용해 정보를 읽어오기
echo $PUBKEY | base64 -d | openssl asn1parse -inform DER -i
공개키의 정보가 offset17의 BIT STRING에 위치하여 있음을 알 수 있음 -> -strparse 옵션을 사용하여 검사할 수 있다.
다음 명령어는 offset 17에서 시작하는 부분을 파싱한 결과를 보여준다.
echo $PUBKEY | base64 -d | openssl asn1parse -inform DER -i -strparse 17
n : 0x013269DC2680BC64277889DC6A101ED6F13DD07498F13A4818474C2069
(32269109513264378873151120068074444086989044741418671122338798116969)
e : 0x010001 (65537)
n은 두 소수의 곱이다. n을 구했으니 p와 q를 찾으면 d를 구할 수 있겠다!
- n을 소인수분해 하여 p와 q 구하기
p,q = 1796360473659570891671495336244551, 17963604736595708916714953362445519
p와 q 그리고 e를 아니까 개인키 d를 구할 수 있다. rsatool을 사용하면 쉽게 구해준다고 한다.
- rsatool을 사용하여 개인키 구하기
rsatool 을 다운받을라고 하는데 음.... 어떻게 해야하는지 막혀버렸다 ㅠㅠ
rsatool학교와서 재승이에게 물어보니, openssl을 이용하지 않아도 정의대로 구하는 법(너의 말을 잘 이해한거 맞니?^^)으로 하면
되지 않냐는 조언을 듣고 집가서 다시 시도해보겠다!!!! ㅎㅎ
재승이 블로그를 보면 저 툴을 사용하여 d를 구하여 개인키를 생성하고
그 개인키를 사용하여 문제에 주어진 text.txt파일을 복호화하면 복호화된 결과값들이 플레그를 의미한다. ㅎㅎ
'암호' 카테고리의 다른 글
2016 국가암호공모전 (Ⅱ-A) 분야 문제 01 문제 (0) | 2018.08.02 |
---|---|
[암호] 해시함수 (0) | 2018.02.12 |
[암호] openssl를 이용한 RSA 암복호화 (0) | 2018.01.29 |
[암호] openssl로 파일을 암호화/복호화 하기 (0) | 2018.01.25 |
[암호] RSA 암호화 (0) | 2018.01.24 |