ksnctfをちょっとずつ進めようと思う。writeupの公開はOKとのことなので解法を書いていく。
Easy Cipher
アルファベットの羅列が与えられる。タイトルから何かしらの暗号文とわかる。
Amazonアソシエイトのニコニ広告みたいのが下にあって、カエサルって本が登録されてた。シーザー暗号なのかな…。
RubyにはString#tr
というメソッドがあってシーザー暗号の解読にちょうど良い感じ(String#next
は使えないね)。
参考
vfはisっぽいなという予想から、irbを開き試しているとこれでisが現れる。
"vf".tr("a-z", "n-za-m")
=> "is"
変換の仕方がわかったので、問題文を復号するコードを書く。
ciphers = "EBG KVVV vf n fvzcyr yrggre fhofgvghgvba pvcure gung ercynprf n yrggre jvgu gur yrggre KVVV yrggref nsgre vg va gur nycunorg. EBG KVVV vf na rknzcyr bs gur Pnrfne pvcure, qrirybcrq va napvrag Ebzr. Synt vf SYNTFjmtkOWFNZdjkkNH. Vafreg na haqrefpber vzzrqvngryl nsgre SYNT."
res = ciphers.split.map do |cipher|
cipher.split("").map { _1.tr("a-z", "n-za-m") }.join
end
print res.join(" ")
=> EBG KVVV is a simple letter substitution cipher that replaces a letter with the letter KVVV letters after it in the alphabet. EBG KVVV is an example of the Paesar cipher, developed in ancient Eome. Slag is SYNTFwzgxOWFNZqwxxNH. Vnsert an underscore immediately after SYNT.⏎
…大文字が拾えてないせいで微妙に解読しきれていない。大文字も変換するようにtr
を書き直し、以下でクリア。
ciphers = "EBG KVVV vf n fvzcyr yrggre fhofgvghgvba pvcure gung ercynprf n yrggre jvgu gur yrggre KVVV yrggref nsgre vg va gur nycunorg. EBG KVVV vf na rknzcyr bs gur Pnrfne pvcure, qrirybcrq va napvrag Ebzr. Synt vf SYNTFjmtkOWFNZdjkkNH. Vafreg na haqrefpber vzzrqvngryl nsgre SYNT."
res = ciphers.split.map do |cipher|
cipher.split("").map { _1.tr("a-zA-Z", "n-za-mN-ZA-M") }.join
end
print res.join(" ")
=> ROT XIII is a simple letter substitution cipher that replaces a letter with the letter XIII letters after it in the alphabet. ROT XIII is an example of the Caesar cipher, developed in ancient Rome. Flag is ______________. Insert an underscore immediately after FLAG.⏎
おまけ
ソースが微妙。
# cipher"s"なので配列を格納する
ciphers = "EBG KVVV vf n fvzcyr yrggre fhofgvghgvba pvcure gung ercynprf n yrggre jvgu gur yrggre KVVV yrggref nsgre vg va gur nycunorg. EBG KVVV vf na rknzcyr bs gur Pnrfne pvcure, qrirybcrq va napvrag Ebzr. Synt vf SYNTFjmtkOWFNZdjkkNH. Vafreg na haqrefpber vzzrqvngryl nsgre SYNT.".split
# mapをワンライナーにする
results = []
ciphers.map { |cipher| cipher.split { results << _1.tr("a-zA-Z", "n-za-mN-ZA-M") } }
print results.join(" ")
…2度のsplit
がイケてないので…
ciphers = "EBG KVVV vf n fvzcyr yrggre fhofgvghgvba pvcure gung ercynprf n yrggre jvgu gur yrggre KVVV yrggref nsgre vg va gur nycunorg. EBG KVVV vf na rknzcyr bs gur Pnrfne pvcure, qrirybcrq va napvrag Ebzr. Synt vf SYNTFjmtkOWFNZdjkkNH. Vafreg na haqrefpber vzzrqvngryl nsgre SYNT.".split("")
print ciphers.map { _1.tr("a-zA-Z", "n-za-mN-ZA-M") }.join
これでスッキリ🆗