Skip to content

Instantly share code, notes, and snippets.

@tmd45
Last active May 22, 2020 09:10
Show Gist options
  • Save tmd45/d036c51091620a538b719814ef35a442 to your computer and use it in GitHub Desktop.
Save tmd45/d036c51091620a538b719814ef35a442 to your computer and use it in GitHub Desktop.
LL Decade の「君ならどう書く Online」の問題文。Web の海に消えてたので Archive からサルベージした

※元のURL: http://ll.jus.or.jp/2012/doukaku-online-main.html

君ならどう書く Online 問題文

ミッション:LLNOCチーム内で使われている暗号を解読するツールを好きな言語を用いて作成して欲しい

LL Decadeの無線LANを提供しているLLNOCチームでは、真に重要な情報を伝える場合、その情報が暗号であることを隠すため、IPアドレスやMACアドレスを用いて情報をやり取りする。IPアドレスやMACアドレスを並べただけであれば、ネットワークを扱うNOCチームなら疑われることなく送受信できる。

LLNOCチームが利用している暗号方式

一行に一つ、文字列が記述される。その文字列のうちいくつかは、MACアドレス、IP v4アドレス、IPv6アドレスである。
これらの文字列を、MACアドレス -> 00、IPv4アドレス -> 01、IPv6アドレス -> 10、その他 -> 11 にエンコードし、一列に並べる。
その結果をバイナリ列と見なして、ASCII文字列に変換する。

入力例:

192.168.0.23  
00:00:01:22:23:34
FF:DD:BB:AA:CC:EE
2001:db8:bd05:1d2:288a:1fc0:1:10ee
123.45.67.89
12:34:56:78:9a:bc
1A-2B:2E-09:12:22
300.100.200.10
10.232.33.44
90-12-03-92-00-01
01234:22:4444:34:5555:5:f
0.100.32.10
100.200.100.200
10:20:30:01:02:03
11-22-33-44-55-66
9f34:234:1:123:45:6:FFFF:FFF

解き方:

上記のリストは、それぞれ上から順に

IPv4, MAC, MAC, IPv6, IPv4, MAC, その他, その他, IPv4, MAC, その他, MAC, IPv4, MAC, MAC, IPv6

である。
これを順に数値に直すと、

01, 00, 00, 10, 01, 00, 11, 11, 01, 00, 11, 01, 01, 00, 00, 10

となる。これを4つずつASCII文字に変換すると

B(01000010 = 0×42), O(01001111=0x4f), M(01001100=0x4c), B(01000010=0×42)

となる。

答え:

BOMB

注意:

IPv4アドレスは、8ビットの符号無し整数値(0-255)を4つ、ドットで区切ったものとする。

  • 正しい例: 19.232.98.2
  • 間違った例: 100.200.100.300 (300は0-255の範囲外)

IPv6アドレスは、4桁の16進数を8つ”:”で区切ったものとする。ただし、各16進数はそれぞれ、最初の0を可能な限り省略するものとする。( 02130001 はそれぞれ 2131 と省略する)( 7/25: “::”を用いた省略記法は廃止しました )。

  • 正しい例: 2001:1234:3210:ABCD:9876:3232:3812:FFAB 0:2000:11:1:2:3:211:10
  • 間違った例: 1:2:3:4:5:6:07:8 (07の部分は0を省略するべき)

MACアドレスは、8bitの数値を符号無しの二桁の16進数を6つ”:”または”-”で区切ったものとする。16進数のアルファベットは、大文字小文字を区別しない。
区切り文字の“-”と”:”は混在しない。

  • 正しい例: 00:11:22:33:44:55 1A-B2-c3-d4-e5-f6
  • 間違った例: 2a:2b-40-54:10-01

なお、間違ったMACアドレス、IPv4アドレス、IPv6アドレスはその他にカウントする。

バイナリ文字列をASCIIコードに変換する際にはビッグエンディアンを用いる。
例: 0×41 -> A

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment