국가암호공모전 (II-A 분야) 문제 05 (2016)
추천글 : 【암호론】 암호론 목차
1. 문제 [본문]
2. 풀이 [본문]
1. 문제 [목차]
수사관 X 씨는 테러리스트 용의자 Y씨가 테러리스트 단체로부터 테러에 이용할 자금을 마련하기 위한 비밀 계좌정보를 얻어낼 것이라는 첩보를 듣고, 테러리스트 Y씨의 PC방에서 발생한 네트워크 패킷을 수집하였다. 수집된 패킷 안에는 용의자 Y씨가 다른 테러리스트들과 은밀히 주고받은 정보와 비밀 지령들이 담겨 있다. 수집된 패킷으로부터 비밀 계좌번호를 찾아라!
문제 A. 테러리스트들로 추정되는 IP 주소들을 나열하시오.
문제 B. 테러리스트 Y씨가 받은 지령과 비밀정보는 무엇이며, 해당 정보들을 찾아내는 과정을 기술하시오.
문제 C. 테러리스트 Y씨가 받은 지령과 비밀정보를 이용하여 비밀 계좌번호를 찾고, 그 과정을 기술하시오.
2. 풀이 [목차]
이 풀이를 읽기 전에 문제 06번 풀이를 참고하길 바란다.
우선 pcapng 파일을 열기 위해 저명한 프로그램인 Wireshark(ver. Wireshark-win64-2.0.4)를 이용하였다. pcapng 파일을 살펴보는 과정에서 202.30.24.92와 220.30.0.11의 통신이 눈에 띄었다. 왜냐하면 뉴스레터, 네이버, radiokorea.com, happylog.naver.com 등 너무도 친숙한 정보를 담고 있었기 때문이다. 이를 통해 얻은 결론은 이들 중 하나는 네이버나 다른 소셜 매체를 위한 IP이고, 다른 하나는 사용자 본인이라는 점이었다. 그런데 220.30.0.11에 비해 202.30.24.92이 훨씬 많은 통신 기록을 가지고 있었으므로 202.30.24.92가 바로 용의자 Y씨가 사용한 PC의 IP임을 알 수 있었다.
한편, Y씨가 다른 테러리스트와 어떤 메시지를 주고 받았다면, 틀림없이 그 메시지의 길이는 상당히 많은 메시지가 동일한 길이를 가지고 있는 점을 감안하면 다소 눈에 띌 것이다. info에 Len = ##숫자##와 같이 표시되기 때문에 Len으로 서치해 보았다. 그렇게 하나하나 통신 기록을 살펴본 결과 아주 의심스러운 정보를 발견할 수 있었다.
위 정보는 분명 용의자 Y씨가 다른 IP에 보낸 정보였다. 그런데 아무리 생각해도 "Please give me a private key!"라는 정보는 어떤 사이트를 로그인하거나 할 때 쓰이는 정보일 수는 없고, 어떤 메일을 통해 다른 누군가한테 보낸 정보일 수밖에 없었다. 메시지의 내용이 테러의 냄새를 풀풀 풍기므로 당연히 수신자인 210.107.192.244는 테러리스트 중 한 명의 IP 주소라고 결론을 낼 수 있다. 이제 개인키를 달라는 사용자의 요청에 대한 답신을 살펴볼 필요가 있었다. 그러자 바로 뒤에 36.310788(Time), 36.311548(Time)에서 온 답신에는 RSA 개인키가 담겨져 있었다.
이제 개인키를 HEX로 변환하고 해석해 보자. 그 전에 여기를 참고하자. 한편 0x0a에 해당하는 문자는 처음과 끝을 제외하고는 64개씩 문자열을 구분하기 때문에, 끊어 읽으라는 지시인 것처럼 보인다.
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAsuz7gf8oCqm8SYLjaKUmxAhX33q1kVUafzeHqSwtuyATEzml
pf88TaRpZKQWO2i5cQVhO4KiGsTYUvOaxEuqUijOWLvl2gRcgH1Vzn9PBjh+nWuW
s2cEU3/+Fm2hm5fBrnAFnNlwxCu8jzEAakSaMmyVVB8n4XCxLKRGgXba9viyRhK6
9ICppG22tw4miEBYw6GT/uzsM1V3+oLrQaSw9OEAXAScbXDKD76ayJgYNLemI0K0
jH9O45BFuDjn0LfploOVLPz3/Dk5umdgTi/ZdPsuiDc4XxS5TuEDDHPRntvV9aNj
m75taXnHe1n8/jNzCFJ0pJlIn1u/7q3XbowOrwIDAQABAoIBAAJzoNadKm1K+ht/
waHzcV6KRrn3Mnm1UtGfbypwQogn3lsLFSv7HVZrBE6uuOdDfhcAXd604YfAXr50
PBCogMLzcDBjErk0ChhwnzZfJDQPnhyGFuCKbtK+FDs2cVpyb+L2Af2uNQ9bEhBc
OYc7PWmndzxZ2PAL3UGhVp37hPCRXfJyYh/NbVxl3//Pe6PG2P/QYCg0AAycvFsw
MaskRlZJXjrhUn8RIW0GgDIwWGG6f0nQY2JopTLt83TS07I0D/Bnbu0sn7JeFX48
dNbEVOVla9dNO6Dwfvr8F3d8wukJAuSS9TNzJ4NdciQdpRPPKT5nO1P7o5qq23/6
FH28dgECgYEA17QK/yZAIOGJSzgT1YCNeaWjlv7Jn0tgQkBDf1MNuTNdkhMuFqnb
/hDPLBm4TvM1Bw42t1WJQBnl0x+1LOIRE1vY/LTGonoooW7gLVP26rxuJ1UsWHEm
W+rGyIg2YoavS+uNCKwEq9AGBQr+N071vMioj/gFX4CIGE2bJwwlXoECgYEA1FoP
jZHxhWPk4He2n+wxOZVVOvuIJWQHLcRai3rdPt2I/C69CxHMiBpS3IbPFsatF93V
e4/lopRQQMV547CS1zyOR1WPmaToJ1AakCJeqKtYyo6ICzZOLIFx52TQ/bD/hHS/
wXLCmq5GSbDY3clmdoPyYTEl/P0OVUn1ekWfNS8CgYAibjW3Jobj+LwuioP3924d
tcfYCVFroN97k8ByaXJuVnmgIHmh2nkoI8y98FkQGRgkySsItpmS5s9dlNkZkfhB
y85mAAEY3EDyC72y3o0ySOOYWasbbuw9jcsvJTbxISiICNBZSwPv3OOpGGkdsPfe
q3TkjiVlaiHPJ0wVvoWUgQKBgGUCaf+HeoFe4RI9H6u2qDuh4ybpWvueNyP4ELHk
QbWTn4OFn/rR/p6HFv87SOqmmtONe+0Ip8zMC9ijlrVN2qtzbKJV+ra1EJESs2/4
SVqmFthTMDdVH55f/JR7CkaCmSiieExGkHcPivOmoaHuGUUqwnKk9FMA9H5xbck5
sN+VAoGAafWA7vQiwELhHYrFh/070gtaRhNXFwM9B9XLhnmlg5sRAfybLMcqkRB2
1m2mLsIZlhSmXc5WdyU6r87rT/1F6DN7I7PATrZbRdTlNi1uY3kV1QDvLYj8mQw8
oH79GlBSVyBbL0MJwrOy4+VtECo+WUTcflKuckRnVzpRPV1V0B4=
----END RSA PRIVATE KEY-----
308204A20201000282010100B2ECFB81FF280AA9BC4982E368A526C40857DF7AB591551A7F3787A92C2DBB20131339A5
A5FF3C4DA46964A4163B68B97105613B82A21AC4D852F39AC44BAA5228CE58BBE5DA045C807D55CE7F4F06387E9D6B96
B36704537FFE166DA19B97C1AE70059CD970C42BBC8F31006A449A326C95541F27E170B12CA4468176DAF6F8B24612BA
F480A9A46DB6B70E26884058C3A193FEECEC335577FA82EB41A4B0F4E1005C049C6D70CA0FBE9AC8981834B7A62342B4
8C7F4EE39045B838E7D0B7E99683952CFCF7FC3939BA67604E2FD974FB2E8837385F14B94EE1030C73D19EDBD5F5A363
9BBE6D6979C77B59FCFE3373085274A499489F5BBFEEADD76E8C0EAF0203010001028201000273A0D69D2A6D4AFA1B7F
C1A1F3715E8A46B9F73279B552D19F6F2A70428827DE5B0B152BFB1D566B044EAEB8E7437E17005DDEB4E187C05EBE74
3C10A880C2F370306312B9340A18709F365F24340F9E1C8616E08A6ED2BE143B36715A726FE2F601FDAE350F5B12105C
39873B3D69A7773C59D8F00BDD41A1569DFB84F0915DF272621FCD6D5C65DFFFCF7BA3C6D8FFD0602834000C9CBC5B30
31AB244656495E3AE1527F11216D068032305861BA7F49D0636268A532EDF374D2D3B2340FF0676EED2C9FB25E157E3C
74D6C454E5656BD74D3BA0F07EFAFC17777CC2E90902E492F5337327835D72241DA513CF293E673B53FBA39AAADB7FFA
147DBC760102818100D7B40AFF264020E1894B3813D5808D79A5A396FEC99F4B604240437F530DB9335D92132E16A9DB
FE10CF2C19B84EF335070E36B755894019E5D31FB52CE211135BD8FCB4C6A27A28A16EE02D53F6EABC6E27552C587126
5BEAC6C888366286AF4BEB8D08AC04ABD006050AFE374EF5BCC8A88FF8055F8088184D9B270C255E8102818100D45A0F
8D91F18563E4E077B69FEC313995553AFB882564072DC45A8B7ADD3EDD88FC2EBD0B11CC881A52DC86CF16C6AD17DDD5
7B8FE5A2945040C579E3B092D73C8E47558F99A4E827501A90225EA8AB58CA8E880B364E2C8171E764D0FDB0FF8474BF
C172C29AAE4649B0D8DDC9667683F2613125FCFD0E5549F57A459F352F028180226E35B72686E3F8BC2E8A83F7F76E1D
B5C7D809516BA0DF7B93C07269726E5679A02079A1DA792823CCBDF05910191824C92B08B69992E6CF5D94D91991F841
CBCE66000118DC40F20BBDB2DE8D3248E39859AB1B6EEC3D8DCB2F2536F121288808D0594B03EFDCE3A918691DB0F7DE
AB74E48E25656A21CF274C15BE859481028180650269FF877A815EE1123D1FABB6A83BA1E326E95AFB9E3723F810B1E4
41B5939F83859FFAD1FE9E8716FF3B48EAA69AD38D7BED08A7CCCC0BD8A396B54DDAAB736CA255FAB6B5109112B36FF8
495AA616D8533037551F9E5FFC947B0A46829928A2784C4690770F8AF3A6A1A1EE19452AC272A4F45300F47E716DC939
B0DF9502818069F580EEF422C042E11D8AC587FD3BD20B5A46135717033D07D5CB8679A5839B1101FC9B2CC72A911076
D66DA62EC2199614A65DCE5677253AAFCEEB4FFD45E8337B23B3C04EB65B45D4E5362D6E637915D500EF2D88FC990C3C
A07EFD1A505257205B2F4309C2B3B2E3E56D102A3E5944DC7E52AE724467573A513D5D55D01E
30 82 04 A2 ; header
| 02 01 ; separator: 0x02 = integer, 0x01 = 1 byte long
| 00 ; algorithm version: version zero
| 02 82 01 01 ; separator: 0x02 = integer, 0x0101 = 257 bytes long
| | ; modulus: 257 bytes
| | 00 B2 EC FB 81 FF 28 0A A9 BC 49 82 E3 68 A5 26 C4 08 57 DF 7A B5 91 55 1A 7F 37 87 A9 2C 2D BB
| | 20 13 13 39 A5 A5 FF 3C 4D A4 69 64 A4 16 3B 68 B9 71 05 61 3B 82 A2 1A C4 D8 52 F3 9A C4 4B AA
| | 52 28 CE 58 BB E5 DA 04 5C 80 7D 55 CE 7F 4F 06 38 7E 9D 6B 96 B3 67 04 53 7F FE 16 6D A1 9B 97
| | C1 AE 70 05 9C D9 70 C4 2B BC 8F 31 00 6A 44 9A 32 6C 95 54 1F 27 E1 70 B1 2C A4 46 81 76 DA F6
| | F8 B2 46 12 BA F4 80 A9 A4 6D B6 B7 0E 26 88 40 58 C3 A1 93 FE EC EC 33 55 77 FA 82 EB 41 A4 B0
| | F4 E1 00 5C 04 9C 6D 70 CA 0F BE 9A C8 98 18 34 B7 A6 23 42 B4 8C 7F 4E E3 90 45 B8 38 E7 D0 B7
| | E9 96 83 95 2C FC F7 FC 39 39 BA 67 60 4E 2F D9 74 FB 2E 88 37 38 5F 14 B9 4E E1 03 0C 73 D1 9E
| | DB D5 F5 A3 63 9B BE 6D 69 79 C7 7B 59 FC FE 33 73 08 52 74 A4 99 48 9F 5B BF EE AD D7 6E 8C 0E
| | AF
| 02 03 ; separator: 0x02 = integer, 0x03 = 3 bytes long
| | 01 00 01 ; public exponent (3 bytes): 65537(F4)
| 02 82 01 00 ; separator: 0x02 = integer, 0x0100 = 256 bytes long
| | ; private exponent: 256 bytes
| | 02 73 A0 D6 9D 2A 6D 4A FA 1B 7F C1 A1 F3 71 5E 8A 46 B9 F7 32 79 B5 52 D1 9F 6F 2A 70 42 88 27
| | DE 5B 0B 15 2B FB 1D 56 6B 04 4E AE B8 E7 43 7E 17 00 5D DE B4 E1 87 C0 5E BE 74 3C 10 A8 80 C2
| | F3 70 30 63 12 B9 34 0A 18 70 9F 36 5F 24 34 0F 9E 1C 86 16 E0 8A 6E D2 BE 14 3B 36 71 5A 72 6F
| | E2 F6 01 FD AE 35 0F 5B 12 10 5C 39 87 3B 3D 69 A7 77 3C 59 D8 F0 0B DD 41 A1 56 9D FB 84 F0 91
| | 5D F2 72 62 1F CD 6D 5C 65 DF FF CF 7B A3 C6 D8 FF D0 60 28 34 00 0C 9C BC 5B 30 31 AB 24 46 56
| | 49 5E 3A E1 52 7F 11 21 6D 06 80 32 30 58 61 BA 7F 49 D0 63 62 68 A5 32 ED F3 74 D2 D3 B2 34 0F
| | F0 67 6E ED 2C 9F B2 5E 15 7E 3C 74 D6 C4 54 E5 65 6B D7 4D 3B A0 F0 7E FA FC 17 77 7C C2 E9 09
| | 02 E4 92 F5 33 73 27 83 5D 72 24 1D A5 13 CF 29 3E 67 3B 53 FB A3 9A AA DB 7F FA 14 7D BC 76 01
| 02 81 81 ; separator: 0x02 = integer, 0x81 = 129 bytes
| | ; prime1: 129 bytes
| | 00 D7 B4 0A FF 26 40 20 E1 89 4B 38 13 D5 80 8D 79 A5 A3 96 FE C9 9F 4B 60 42 40 43 7F 53 0D B9
| | 33 5D 92 13 2E 16 A9 DB FE 10 CF 2C 19 B8 4E F3 35 07 0E 36 B7 55 89 40 19 E5 D3 1F B5 2C E2 11
| | 13 5B D8 FC B4 C6 A2 7A 28 A1 6E E0 2D 53 F6 EA BC 6E 27 55 2C 58 71 26 5B EA C6 C8 88 36 62 86
| | AF 4B EB 8D 08 AC 04 AB D0 06 05 0A FE 37 4E F5 BC C8 A8 8F F8 05 5F 80 88 18 4D 9B 27 0C 25 5E
| | 81
| 02 81 81 ; separator: 0x02 = integer, 0x81 = 129 bytes
| | ; prime2: 129 bytes
| | 00 D4 5A 0F 8D 91 F1 85 63 E4 E0 77 B6 9F EC 31 39 95 55 3A FB 88 25 64 07 2D C4 5A 8B 7A DD 3E
| | DD 88 FC 2E BD 0B 11 CC 88 1A 52 DC 86 CF 16 C6 AD 17 DD D5 7B 8F E5 A2 94 50 40 C5 79 E3 B0 92
| | D7 3C 8E 47 55 8F 99 A4 E8 27 50 1A 90 22 5E A8 AB 58 CA 8E 88 0B 36 4E 2C 81 71 E7 64 D0 FD B0
| | FF 84 74 BF C1 72 C2 9A AE 46 49 B0 D8 DD C9 66 76 83 F2 61 31 25 FC FD 0E 55 49 F5 7A 45 9F 35
| | 2F
| 02 81 80 ; separator: 0x02 = integer, 0x80 = 128 bytes
| | ; exponent1: 128 bytes
| | 22 6E 35 B7 26 86 E3 F8 BC 2E 8A 83 F7 F7 6E 1D B5 C7 D8 09 51 6B A0 DF 7B 93 C0 72 69 72 6E 56
| | 79 A0 20 79 A1 DA 79 28 23 CC BD F0 59 10 19 18 24 C9 2B 08 B6 99 92 E6 CF 5D 94 D9 19 91 F8 41
| | CB CE 66 00 01 18 DC 40 F2 0B BD B2 DE 8D 32 48 E3 98 59 AB 1B 6E EC 3D 8D CB 2F 25 36 F1 21 28
| | 88 08 D0 59 4B 03 EF DC E3 A9 18 69 1D B0 F7 DE AB 74 E4 8E 25 65 6A 21 CF 27 4C 15 BE 85 94 81
| 02 81 80 ; separator: 0x02 = integer, 0x80 = 128 bytes
| | ; exponent2: 128 bytes
| | 65 02 69 FF 87 7A 81 5E E1 12 3D 1F AB B6 A8 3B A1 E3 26 E9 5A FB 9E 37 23 F8 10 B1 E4 41 B5 93
| | 9F 83 85 9F FA D1 FE 9E 87 16 FF 3B 48 EA A6 9A D3 8D 7B ED 08 A7 CC CC 0B D8 A3 96 B5 4D DA AB
| | 73 6C A2 55 FA B6 B5 10 91 12 B3 6F F8 49 5A A6 16 D8 53 30 37 55 1F 9E 5F FC 94 7B 0A 46 82 99
| | 28 A2 78 4C 46 90 77 0F 8A F3 A6 A1 A1 EE 19 45 2A C2 72 A4 F4 53 00 F4 7E 71 6D C9 39 B0 DF 95
| 02 81 80 ; separator: 0x02 = integer, 0x80 = 128 bytes
| | ; coefficient: 128 bytes
| | 69 F5 80 EE F4 22 C0 42 E1 1D 8A C5 87 FD 3B D2 0B 5A 46 13 57 17 03 3D 07 D5 CB 86 79 A5 83 9B
| | 11 01 FC 9B 2C C7 2A 91 10 76 D6 6D A6 2E C2 19 96 14 A6 5D CE 56 77 25 3A AF CE EB 4F FD 45 E8
| | 33 7B 23 B3 C0 4E B6 5B 45 D4 E5 36 2D 6E 63 79 15 D5 00 EF 2D 88 FC 99 0C 3C A0 7E FD 1A 50 52
| | 57 20 5B 2F 43 09 C2 B3 B2 E3 E5 6D 10 2A 3E 59 44 DC 7E 52 AE 72 44 67 57 3A 51 3D 5D 55 D0 1E
이제 어떤 메시지를 RSA로 해독하는가가 문제가 된다. 해독할 메시지를 찾아내기 위해 protocol의 의미를 좀 더 분명히 할 필요가 있다.
1) TCP(Transmission Control Protocol): 높은 데이터 신뢰성, 데이터 흐름 제어, 확인응답 有
이메일 등에서 사용
2) UDP(User Datagram Protocol): 일정한 데이터 통신 속도, 데이터 오류 有, 확인응답 無
스트리밍 등에서 사용
3) SSL/TLS(Secure Secret Layer): Site Authentication, Data privacy, Data integrity
전자상거래 등에서 사용
이밖에도 여러 개의 protocol이 있었다. 그렇다면 어떤 protocol을 찾아 보면 다른 테러리스트들의 지령을 찾아볼 수 있을까? 우선 위 3개의 protocol을 제외한 다른 protocol은 제각기 그 지령일 수 없는 이유가 있다. (참고로 여기서 protocol이라고 지칭하는 것은 Wireshark에서 표시된 것을 나타내는 것으로, 실제로 HTML 같은 protocol은 TCP에도 해당한다.)
a) ARP, BJNP, SSL, STP, VRRP: 모두 60 bytes에 남짓해서 정보가 거의 없다.
b) BROWSER, CDP, DCERPC, NBNS, SNMP, SSDP: 정보에 패턴이 있다. 암호문일 리가 없다.
c) DB-LSP-DISC, DHCP, DHCPv6, DTP, EPM, ICMPv6, IGMPv6, IPv6, LLMNR, PNRP, SMB, SMB2, SRVLOC: 사용자(202.30.24.92)와의 직접적인 통신 기록이 없다.
d) DNS: 202.30.0.11과만 통신. 소셜 매체.
e) HTTP/XML: 웹 관련 protocol인 것이 분명하다.
f) QUIC: 특정 IP(216.58.197.163)와만 통신하고 있다. 특정 IP로만 오랫동안 연락할 리가 없다.
따라서 테러리스트의 IP는 TCP, TLSv1.2, UDP 중 하나이다. 그렇다면 TLSv1.2부터 살펴보도록 하자. SSL/TLS는 우선 client가 server에게 자신이 서버를 제대로 찾아왔는지 물어 보는 것으로 시작한다. 그 뒤 server가 client에게 인증서를 보내고, client도 따라서 server에게 인증서를 보낸다. 그 뒤 server는 비대칭키 중 공개키를 client에게 보낸다. 그런 다음 대칭키 session key를 개인키로 암호화시켜서 보낸다. 그러면 client는 session key를 공개키로 복호화해서 server와 client가 같은 대칭키를 공유하게 된다. 이제 둘은 이 대칭키로 메시지를 암호화해서 주고 받는다. 이게 "encrypted handshake message"의 정체이다.
protocol을 ssl로 필터링한 뒤 "client hello" 메시지를 서치한 결과 client는 항상 202.30.24.92였다. 그렇다면 앞서 RSA private key를 요구한 것과는 모순된다. client가 RSA private key를 필요로 하는 순간은 한 번도 없기 때문이다. 실제로 주어진 RSA private key를 가지고 pem 파일을 만든 뒤 Wireshark에게 복호화를 하게 했지만, ssl 내 암호화된 정보는 복호화되지 않았다. 따라서 TLSv1.2는 적절치 않다. (참고로 다음은 어떻게 Wireshark로 복호화를 하게 했는지에 대한 방법이다.)
0) OpenSSL-Win64를 다운받고 cmd 창을 켠다.
1) cd C:\OpenSSL-Win64\bin
2) set RANDFILE=C:\OpenSSL-Win64\bin\.rnd (2) 과정이 필요 없을 수도 있음)
3) openssl.exe
4) genrsa -des3 -out MyKey.pem 2048 (주어진 RSA 키의 modulus와 같은 2048 bits으로)
5) passphrase 입력 및 재입력
6) rsa -in MyKey.pem -out MyKey2.pem (passphrase 해제)
7) 5)에서의 passphrase 입력
8) quit
9) ren MyKey.pem MyKey.txt
10) MyKey.txt를 켜고 주어진 RSA privacy key를 적당히 옮겨 적는다.
11) ren MyKey.txt MyKey.pem
12) rsa -noout -text -in MyKey.pem (만약 성공하면 제대로 한 것이다.)
13) Edit - Preferences... - Protocols - SSL - RSA keys list - Edit...
14) IP address, Post, Protocol(= ssl)을 적당히 기입하고 Key File에 그 pem 파일을 삽입
TCP는 너무 많으므로 UDP 중에서 적당한 후보를 찾아보았다. 202.30.24.92와 직접적으로 통신을 하였고, 메시지의 정보가 의미가 없으며 202.30.24.92와 너무 많이는 통신하지 않은 그런 후보는 딱 하나 있었다. (이때 마지막 조건은 테러리스트라는 특수한 조건을 반영한 것이다.)
124.56.121.71과 딱 한 차례 통신을 했는데, 그 과정에서 서로 PEM 정보를 주고 받았음을 알 수 있다. 물론 PEM 정보가 HTTP protocol에서도 발견됐는데, 그때는 resource를 반영하기 위한 정보였다. 하지만 이번에는 data라고만 표시돼 있고, UDP에서 이것만 PEM 정보로 표시돼 있었다. 따라서 이 정보는 무언가를 나타내고 있다. 따라서 124.56.121.71도 테러리스트의 IP 중 하나다.
이제 TCP를 조사해 볼 필요가 있다. TCP에 대한 통신기록이 굉장히 많으므로 우선 TCP에 대한 필터링을 한 뒤 길이로 오름차순으로 만들었다. 그리고 분명 modulus가 256 bytes이므로 통신 기록은 256 bytes보다 많아야 한다. 그리고 202.30.24.92와의 통신 기록으 그렇게 많지는 않아야 할 것이며, 실질적인 tcp segment data가 256 bytes와 비슷해야 할 것이다. 마지막으로 어떤 정보도 살아 있으면 안 된다. (ex. www, http, com...) 이런 기준을 가지고 추가적인 IP를 찾아 보면 다음 IP를 의심해 볼 수 있다.
59.18.44.109
5.45.62.62
77.234.41.35
시간 관계상 이 이상은 진행되지 못했다. 실제로 메시지의 크기가 정확히 256 bytes여야 하는데 전부 그렇지 않았다. 그래서 상당히 많은 시행착오가 필요할 것이고, 앞서 TLSv1.2를 제하는 과정에서 실수가 있었는지도 모르겠다. 다만 UDP에서 얻은 정보는 어떤 계좌번호와 연결되는 귀중한 정보일 것이며, 만일 TCP에서 복호화를 시킬 어떤 정보가 나온다면 다음 알고리즘을 적용시키면 된다.
# C언어로 쓰여짐
main(){
int i, j = 0, temp, temp1, temp2, temp3, temp4;
bignum modulus, private_key, public_key, message;
bignum note1, note2, note3, note4, note5;
// note1 would be decrypted message
// note2 is "0"
// note3, note4, note5 is just note
initialize_bignum(&modulus);
initialize_bignum(&private_key);
initialize_bignum(&public_key);
initialize_bignum(&message);
int_to_bignum(0, ¬e2);
char* Modulus=
"00B2ECFB81FF280AA9BC4982E368A526C40857DF7AB591551A7F3787A92C2DBB"\
"20131339A5A5FF3C4DA46964A4163B68B97105613B82A21AC4D852F39AC44BAA"\
"5228CE58BBE5DA045C807D55CE7F4F06387E9D6B96B36704537FFE166DA19B97"\
"C1AE70059CD970C42BBC8F31006A449A326C95541F27E170B12CA4468176DAF6"\
"F8B24612BAF480A9A46DB6B70E26884058C3A193FEECEC335577FA82EB41A4B0"\
"F4E1005C049C6D70CA0FBE9AC8981834B7A62342B48C7F4EE39045B838E7D0B7"\
"E99683952CFCF7FC3939BA67604E2FD974FB2E8837385F14B94EE1030C73D19E"\
"DBD5F5A3639BBE6D6979C77B59FCFE3373085274A499489F5BBFEEADD76E8C0E"\
"AF";
char *Private_key=
"0273A0D69D2A6D4AFA1B7FC1A1F3715E8A46B9F73279B552D19F6F2A70428827"\
"DE5B0B152BFB1D566B044EAEB8E7437E17005DDEB4E187C05EBE743C10A880C2"\
"F370306312B9340A18709F365F24340F9E1C8616E08A6ED2BE143B36715A726F"\
"E2F601FDAE350F5B12105C39873B3D69A7773C59D8F00BDD41A1569DFB84F091"\
"5DF272621FCD6D5C65DFFFCF7BA3C6D8FFD0602834000C9CBC5B3031AB244656"\
"495E3AE1527F11216D068032305861BA7F49D0636268A532EDF374D2D3B2340F"\
"F0676EED2C9FB25E157E3C74D6C454E5656BD74D3BA0F07EFAFC17777CC2E909"\
"02E492F5337327835D72241DA513CF293E673B53FBA39AAADB7FFA147DBC7601";
char *Public_key=
"010001";
char *Message=
"123456789";
for(i = 0; i < 514; i ++){
if(Modulus[513 - i] >= '0' && Modulus[513 - i] <= '9')
modulus.digits[i] = Modulus[513 - i] - '0';
else modulus.digits[i] = Modulus[513 - i] - 'A' + 10;
}
modulus.lastdigit = 513;
zero_justify(&modulus);
for(i = 0; i < 512; i ++){
if(Private_key[511 - i] >= '0' && Private_key[511 - i] <= '9')
private_key.digits[i] = Private_key[511 - i] - '0';
else private_key.digits[i] = Private_key[511 - i] - 'A' + 10;
}
private_key.lastdigit = 511;
zero_justify(&private_key);
for(i = 0; i < 6; i ++){
if(Public_key[5 - i] >= '0' && Public_key[5 - i] <= '9')
public_key.digits[i] = Public_key[5 - i] - '0';
else public_key.digits[i] = Public_key[5 - i] - 'A' + 10;
}
public_key.lastdigit = 5;
zero_justify(&public_key);
for(i = 0; i < 9; i ++){
if(Message[8 - i] >= '0' && Message[8 - i] <= '9')
message.digits[i] = Message[8 - i] - '0';
else message.digits[i] = Message[8 - i] - 'A' + 10;
}
message.lastdigit = 8;
zero_justify(&message);
/* print_bignum(&message);
int_to_bignum(1, ¬e1);
for(i = 0; i <= public_key.lastdigit; i ++){
// printf("%d\n", ++j);
temp = public_key.digits[i];
temp1 = temp % 2; temp /= 2;
temp2 = temp % 2; temp /= 2;
temp3 = temp % 2; temp /= 2;
temp4 = temp % 2;
if(temp1){ // note1 = note1 * message mod modulus
multiply_bignum(¬e1, &message, ¬e3);
divide_bignum(¬e3, &modulus, ¬e4);
multiply_bignum(¬e4, &modulus, ¬e5);
subtract_bignum(¬e3, ¬e5, ¬e1);
}
multiply_bignum(&message, &message, ¬e3);
divide_bignum(¬e3, &modulus, ¬e4);
multiply_bignum(¬e4, &modulus, ¬e5);
subtract_bignum(¬e3, ¬e5, &message);
if(temp2){ // note1 = note1 * message mod modulus
multiply_bignum(¬e1, &message, ¬e3);
divide_bignum(¬e3, &modulus, ¬e4);
multiply_bignum(¬e4, &modulus, ¬e5);
subtract_bignum(¬e3, ¬e5, ¬e1);
}
multiply_bignum(&message, &message, ¬e3);
divide_bignum(¬e3, &modulus, ¬e4);
multiply_bignum(¬e4, &modulus, ¬e5);
subtract_bignum(¬e3, ¬e5, &message);
if(temp3){ // note1 = note1 * message mod modulus
multiply_bignum(¬e1, &message, ¬e3);
divide_bignum(¬e3, &modulus, ¬e4);
multiply_bignum(¬e4, &modulus, ¬e5);
subtract_bignum(¬e3, ¬e5, ¬e1);
}
multiply_bignum(&message, &message, ¬e3);
divide_bignum(¬e3, &modulus, ¬e4);
multiply_bignum(¬e4, &modulus, ¬e5);
subtract_bignum(¬e3, ¬e5, &message);
if(temp4){ // note1 = note1 * message mod modulus
multiply_bignum(¬e1, &message, ¬e3);
divide_bignum(¬e3, &modulus, ¬e4);
multiply_bignum(¬e4, &modulus, ¬e5);
subtract_bignum(¬e3, ¬e5, ¬e1);
}
multiply_bignum(&message, &message, ¬e3);
divide_bignum(¬e3, &modulus, ¬e4);
multiply_bignum(¬e4, &modulus, ¬e5);
subtract_bignum(¬e3, ¬e5, &message);
}
add_bignum(¬e1, ¬e2, &message);
print_bignum(&message);
*/
int_to_bignum(1, ¬e1);
j = 0;
for(i = 0; i <= private_key.lastdigit; i ++){
// printf("%d\n", ++j);
temp = private_key.digits[i];
temp1 = temp % 2; temp /= 2;
temp2 = temp % 2; temp /= 2;
temp3 = temp % 2; temp /= 2;
temp4 = temp % 2;
if(temp1){ // note1 = note1 * message mod modulus
multiply_bignum(¬e1, &message, ¬e3);
divide_bignum(¬e3, &modulus, ¬e4);
multiply_bignum(¬e4, &modulus, ¬e5);
subtract_bignum(¬e3, ¬e5, ¬e1);
}
multiply_bignum(&message, &message, ¬e3);
divide_bignum(¬e3, &modulus, ¬e4);
multiply_bignum(¬e4, &modulus, ¬e5);
subtract_bignum(¬e3, ¬e5, &message);
if(temp2){ // note1 = note1 * message mod modulus
multiply_bignum(¬e1, &message, ¬e3);
divide_bignum(¬e3, &modulus, ¬e4);
multiply_bignum(¬e4, &modulus, ¬e5);
subtract_bignum(¬e3, ¬e5, ¬e1);
}
multiply_bignum(&message, &message, ¬e3);
divide_bignum(¬e3, &modulus, ¬e4);
multiply_bignum(¬e4, &modulus, ¬e5);
subtract_bignum(¬e3, ¬e5, &message);
if(temp3){ // note1 = note1 * message mod modulus
multiply_bignum(¬e1, &message, ¬e3);
divide_bignum(¬e3, &modulus, ¬e4);
multiply_bignum(¬e4, &modulus, ¬e5);
subtract_bignum(¬e3, ¬e5, ¬e1);
}
multiply_bignum(&message, &message, ¬e3);
divide_bignum(¬e3, &modulus, ¬e4);
multiply_bignum(¬e4, &modulus, ¬e5);
subtract_bignum(¬e3, ¬e5, &message);
if(temp4){ // note1 = note1 * message mod modulus
multiply_bignum(¬e1, &message, ¬e3);
divide_bignum(¬e3, &modulus, ¬e4);
multiply_bignum(¬e4, &modulus, ¬e5);
subtract_bignum(¬e3, ¬e5, ¬e1);
}
multiply_bignum(&message, &message, ¬e3);
divide_bignum(¬e3, &modulus, ¬e4);
multiply_bignum(¬e4, &modulus, ¬e5);
subtract_bignum(¬e3, ¬e5, &message);
}
print_bignum(¬e1);
system("pause");
}
입력 : 2016.08.17 10:29
'▶ 자연과학 > ▷ 암호·보안' 카테고리의 다른 글
【국가암호공모전】 (II-A 분야) 문제 06 - 2부 (2016) (0) | 2016.08.15 |
---|---|
【국가암호공모전】 (II-A 분야) 문제 06 - 1부 (2016) (3) | 2016.08.15 |
【국가암호공모전】 (II-A 분야) 문제 04 (2016) (10) | 2016.08.14 |
【국가암호공모전】 (II-A 분야) 문제 03 (2016) (0) | 2016.08.13 |
【국가암호공모전】 (II-A 분야) 문제 02 (2016) (0) | 2016.08.13 |
최근댓글