picoCTF Writeups - Cryptography

2022/01/10

picoCTFの過去問を解くためのサービスであるpycoGymにある問題のWriteupsを記録する
ここではCryptographyにカテゴライズされる問題を扱う

Mod 26

問題文に書かれているフラグらしき何かをROT13にかけた結果がフラグ

Mind your Ps and Qs

適切ではない数を使用したRSAの問題。この問題ではNの数が小さいため https://www.dcode.fr/prime-factors-decomposition のような素因数分解ツールを用いてpとqを特定可能。特定したpとqを用いて復号する

復号用コード

from Crypto.PublicKey import RSA
from Crypto.Util.number import inverse
from Crypto.Util.number import GCD
from Crypto.Util.number import long_to_bytes

C = 421345306292040663864066688931456845278496274597031632020995583473619804626233684
N = 631371953793368771804570727896887140714495090919073481680274581226742748040342637
E = 65537
p = 1461849912200000206276283741896701133693
q = 431899300006243611356963607089521499045809

d = inverse(E, (p-1)*(q-1))
key = RSA.construct(map(int, (N, E, d)))

print(long_to_bytes(key.decrypt(C)))

The Numbers

A, B, C, ... に先頭から 1, 2, 3, ... と番号を割り振り、その番号を画像で提示される。数字から英字へ変換したものがフラグ

Easy1

ヴィジュネル暗号で暗号化された文を鍵が与えられる。鍵があれば復号可能なので、それをした結果がフラグ

復号用コード

MOD = 26
ans = ''
key = 'SOLVECRYPTO'
cipher = 'UFJKXQZQUNB'
table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

for i in range(len(cipher)):
    ti = table.find(cipher[i])
    ki = table.find(key[i])
    ans += table[(ti - ki + MOD) % MOD]
print(ans)

13

ROT13にかけたものがフラグ

caesar

シーザー暗号。英語っぽい文字列が出るまで暗号文をずらす

la cifra de

接続先で暗号文が提示される。年号らしき文字列があるため cipher 1553 1467 1508 1555 で検索するとヴィジュネル暗号がヒットする
少なくとも2つの解法がある

1. 人名に当たりをつけて鍵を推測する

暗号文がヴィジュネル暗号を説明していると仮定すると、暗号文内にいくつか出現する単語の先頭が大文字のものは人名または国名だと推測可能。Wikipediaの記事等を元に文字数が一致する人名を探し、それが元の人名に復号可能なような鍵を総当りで探す

2. オンラインツールを利用する

鍵が分からないヴィジュネル暗号を突破するツールがあるためこれを利用する

Tapping

モールス信号が与えられる。適当なツールで英語へ変換したものがフラグ

Flags

旗がいくつか描かれた画像が与えられる。 旗 暗号 で調べるとこれが国際信号旗であることが分かる。1旗1文字で変換したものがフラグ

Mr-Worldwide

与えられた座標の都市名の頭文字を繋げたものがフラグ