MtSakaのブログ

競技プログラミングをします

picoCTF 2022 Crypto Write Up

これは何?

picoCTF 2022にGhoSaka!というチームで参加して、11800ptで266位でした。 そんな中Cryptoを全完しました。せっかくなので備忘録兼Write Upを書くことにしました。

basic-mod1

message.txtが与えられて問題文の指示通りにする。はい、やるだけ問題。

a=list(map(int,input().split()))
ans=''
for i in a:
  i%=37
  if i<26:
    ans+=chr(i+ord('a'))
  elif i!=36:
    ans+=chr(i-26+ord('0'))
  else:
    ans+='_'
print('picoCTF{'+ans+'}')
basic-mod2

またmessage.txtが与えられて問題文通りにやる。

a=list(map(int,input().split()))
ans=''
for i in a:
  i=pow(i,-1,41)-1
  if i<26:
    ans+=chr(i+ord('a'))
  elif i!=36:
    ans+=chr(i-26+ord('0'))
  else:
    ans+='_'
print('picoCTF{'+ans+'}')
credstuff

usernames.txtpasswords.txtが与えられるので、該当ユーザーがusernames.txtの何行目にあるか見て、同じ行をpasswords.txtで見てROT13を取ると答えがでる。

morse-code

morse_chal.wavが与えられるのでテキトーな波形表示ソフトで読み込むと、長音と短音と空白がわかりやすくなるので、それをテキトーなモールス信号復号ツールに投げる。

substitution0

quipqiup - cryptoquip and cryptogram solverに、つっこむ!w

substitution1

quipqiup - cryptoquip and cryptogram solverに、つっこむ!w

substitution2

quipqiup - cryptoquip and cryptogram solverに、つっこむ!w

transposition-trial

最初の三文字がpicになるような置換を3文字ごとに手動で適用すると出る

Vigenere

Vigenère Cipher (automatic solver) | Boxentriqに、つっこむ!w

Very Smooth

ここからが本番です。 gen .pyoutput.txtが与えられる。gen.pyを見ると、nは二つの素数p,qの積らしい。pは16bitの素数たくさんの積+1(pは1024bit)でqは17bitの素数たくさんの積+1(qは1024bit)っていうのがわかる。これはPollard's p − 1 algorithmが適用できる!!

Pollard's p − 1 algorithm - Wikipedia

テキトーに早そうなコードをググり、nを素因数分解しました。あとはいつも通りのRSAを解くだけ。

def factor(n):
  a=2
  j=2
  while True:
    a=pow(a,j,n)
    d=math.gcd(a-1,n)
    if d>1 and d<n:
      return d
    j+=1

n=hoge
c=fuga
p=factor(n)
assert(n%p==0)
q=n//p
phi=(p-1)*(q-1)
e=65537
d=pow(e,-1,phi)
print(long_to_bytes(pow(c,d,n)))
Sequences

First Blood(FA)だった。sequences.pyが与えられるので見てみると、これは数列があるので第20000000項目を求めるというものだった。mod 101000なので愚直じゃ普通に間に合わない。だから行列累乗とかすると高速に求まる。他にもWolfram Alphaに突っ込むなどするとうまくいく。行列累乗とか、競プロの知識が役立ってうれしい。(コードは残ってない) あとは数がもとまったら。うまくコード変えてflagを吐かせればよい。

Sum-O-Primes

gen.pyoutput.txtが与えられる。gen.pyを見るとnが二つの素数p,qの積でxがp+qらしい。よくよく考えると、φ(n)=n-p-q+1だからn-x+1になる。これでもう求まりますね!

x = hoge
n = fuga
c = hogefuga
phi=n-x+1
e=65537
d=pow(e,-1,phi)
print(long_to_bytes(pow(c,d,n)))

これで フラグが出てくる。

NSA Backdoor

まず、素数の生成がVery Smoothと同じだとわかるから、素因数分解ができることは確実。そこからどうするかを考えると、pとqにおいて離散対数問題をそれぞれ解いて中国剰余定理を適用すればいい。それぞれのp,qについてはPohlig–Hellman algorithmを適用すればいい。これで解けました!コードは消えたので残っていません。

【色変記事】AtCoder黄色になりました

おひさしぶりです。MtSakaです。前回の記事から160日くらいです。時間が過ぎるのが早いですね。

この通り、2022/2/13のAtCoder Regular Contest 135で黄色になったので色変記事を書きました。

前回の色変記事

青になった時のはこちらです。内容が薄っぺらいので今回の記事を読むだけで十分だと思いますがぜひ見てみてください。

mt-saka.hatenablog.com

自己紹介

こちらで自己紹介はしていますがこの記事でもしときます。
mtsaka.github.io

中学二年生のMtSakaです。趣味は競プロとか数学です。最近はボカロにかなりハマっています。もともと学校の数学研究部に所属していて競技数学をやっていたのですが、ツイッターで見つけたAtCoderというのが気になって登録してみたらいつのまにか競プロしかやっていませんでした。競プロではC++を使っています。現在はイギリスに留学中です。

競プロ始めてからを振り返る

初参加

2020/12/05の鹿島建設プログラミングコンテスト2020(AtCoder Regular Contest 110)が初めてでした。なんとAの1完でした。

茶色になるまで

AtCoderにあるAPG4bでC++をお勉強しながらコンテストに参加していました。そして、2021/1/30のABC190で水色パフォーマンスを出して一気にレート600まで上げました。

緑になるまで

C++の基本文法は理解できてソラでコードをかけるようになってきたので、基本的なアルゴリズムの勉強をしました。具体例でいうとグラフの基本の探索アルゴリズムや、素因数分解などの整数系のアルゴリズム、UnionFindなどのデータ構造と簡単なDPとかはここらへんで理解し始めたと思います。

水色になるまで

過去問をたくさん解くようになりました。確かこのころにCodeforcesTopcoderにも参加するようになりました。この頃にもうちょっと発展的なDPやグラフの最短経路アルゴリズム、累積和、imos法、尺取り法、二分探索などの典型テクニックを勉強しました。ほかにもいろいろ勉強したと思います。

青になるまで

このころから多少ライブラリ整備というものをし始めました。といってもローカルのファイルに全部ぶっこむだけで大したことはしてないです。この頃は弊校名物の運動会の後の燃え尽き症候群と学年旅行の準備(旅行委員副委員長でした)も相まって、モチベが少し低下していました。イギリスに移住してからは友人がいなかったので廃人のように競プロとネットに浸かっていました。今考えると恐怖です(と言いながら今もかなり廃人だとは思っています)。そして、イギリスに来てからライブラリ整備をgithubで管理するなどしてもう少し真面目にやり始めました。体系的に知識を整理できるのでいいですよね。そして、この頃にセグメントツリーの勉強しました。

黄色になるまで

開発がしてみたいという気持ちからテキトーに競技ではないプログラミングを勉強をしていて、競プロのモチベが下がっていました。同時にHTTFもありマラソンをかなりしてた時もありました。おかげで少し休めたので結果的に良かった気がします。そして、ライブラリ整備にはまりました

mtsaka.github.io

ここにあるアルゴリズムなどを黄色になるまでお勉強してます。githubの更新履歴などを見ればいつ何を勉強したかわかります(これ、便利ですよね)。なんかいろいろ勉強/実装しましたね。特に遅延セグメントツリーとかFPS(形式的冪級数)とかフローとかがメインですね。そして、JOI埋めをがっつりやりました。同級生たちはJOIに出るので精進している中、やらないわけないですよね。結果非公式難易度の8まで埋めました。

競プロをやる上で意識してることなど

  • 行き詰った時はベッドに寝転がるなどして気分を切り替える(これで問題が解けることが何回かあったり)
  • Upsolveをする(大事)
  • コンテストに出れるときは出る(出るときの高揚感というか緊張感が好きで、実力が発揮できる気がするので)
  • やる気を維持する
  • すべての問題に目を通してから解く(行き詰った時やパニックになった時にでも冷静な判断をするために)
  • ライバルを見つける(これはモチベ維持と関連しますが競プロが楽しくなるってのもあります)

これからは

まずは1週間くらい黄色になった余韻に浸りながら気楽に生きようと思います。そして、自己紹介にあるように最近はボカロにはまってるのでとにかく聞きまくろうと思います。他にも今やっているAHC008を頑張ったり、ゲームをやったりしたいです。あと、せっかく黄色になったのでいつかユーザー解説を投稿してみたいなーと思ったり。普通に教育的な内容の記事を書きたいなーだとか、(日本の)同級生にもっと競プロを布教したいなーだとかいろいろやりたいことありますね~。ちなみに応用情報技術者試験を秋に受けたいなーとか思っています。最近やってなかったCTFをやったり、Kaggleにちょいちょい手を出したりもしたいですね。とやかく競プロ以外のことも力を入れたいです。とりあえず今は休んで英検1級の二次試験に合格します。神様よろしくお願いします。

追記:

ハイスぺPCが欲しいです。今Cドライブがカツカツなんです...

質問来てた

ツイッターなどで質問募集したので答えていきます

モチベはどう維持していましたか?

ライバル(特に同級生)を強く意識しながら競プロをやっていました。おかげでかなりやる気が出たと思っています。

彼女いますか

いません!!!

好きなアルゴリズム/データ構造は何ですか?

好きなデータ構造はセグ木です!!好きなアルゴリズムFFT/NTTです!!

出ているコンテストサイトは何ですか?

AtCoderCodeforcesTopcoder、Codechef、TOKI、Leetcodeあたりですかね。他にもあるかもしれませんがよく覚えてません。

好きな問題は何ですか?

去年の年末あたりに解いたWTF2019のE問題のeですかね~。解けたときはめちゃくちゃうれしかったです。これ↓ atcoder.jp

水diff以下くらいの比較的簡単な問題をたくさん解く時間と暖色diffなどの考察が重要な問題/実装が非常に困難な問題に立ち向かう時間はどれくらいのバランスを取っていますか
またどちらをやっているときのほうが楽しいですか

自分はどちらかといえば早解きタイプなので強みを伸ばす/安定させるという意味で前者も大事だとは思っているのですが、後者をやってもっと実力をつけたいという気持ちのほうが最近強いので時間比は2:3くらいです。問題の分野のほうが個人的には解いてるときの楽しさに大きく影響するのでどちらが好きかというのはっきりとはないですね。

精進記録など

おわりに

黄色になったからにはもちろん橙を目指していくのですが、競プロではJOIなどその他もろもろのコンテストを頑張りたいと思っています。そして、我が学年トップの層にもっと近づいて同等に戦える日が来たら嬉しいです。これからもよろしくお願いします。では次回の記事でお会いしましょう。

AtCoder 青色になりました!!

f:id:mt_saka:20210911004106p:plain



はじめに

9/4日に行われた、ABC217にて青色になったので色変記事を書きました。逆色変しそうなのでしないようにと自分に言い聞かせるために書いてもいます。

誰ですか?

MtSakaです。イギリスにいます。日本の中二で13歳です。C++使いです。詳細は私のツイッター(@mt_saka)を見てください。競プロは去年の12月に始めました。

ABC217本番

A,B,C,D,E,Gを通しました。A,B,CをとりあえずやってDでstd::setがすぐ出てきました。ここでトイレにいきました(なんか焦ってたので)。Eをみてstd::multisetとstd::vectorでうまく管理してやればいいかな~って感じで通しました。Fを実装しましたがN^4程度だったうえ、嘘解法でした(悲しい)。そして、FをあきらめGをみたらなぜかすぐdpの遷移が見えました。一瞬嘘かと思い確認しましたがあってるっぽく、提出しACしました。ここで興奮してしまい、ABCを撤退しました(昼飯を食べました)。

今までしてきたこと

まず、水色になってすぐは競プロのやる気が出ておらずあまり精進していません。問題を一切といてない日もありました。しかし、夏休み前になり精進をまじめにやり始めました。まずはE869120さんの競プロ典型90問を埋めました(現在☆5まで埋めてます)。ほかにもJOIを埋め始めました。そして、イギリスに移住してからはライブラリ整備と新しいアルゴリズムの習得に時間をかけました。ライブラリはGitHubに載せています(間違ってるところあれば教えてほしいです)。ライブラリ整備をして、知識の整理ができたので非常によかったなと思ってます。

さいごに

記事の内容がペラペラですみません。↓に自分のAtCoder Problemsのデータと精進グラフを載せておきます。(2021年9月10日時点)

f:id:mt_saka:20210911004239j:plain

f:id:mt_saka:20210911004336j:plain

f:id:mt_saka:20210911004456j:plain

f:id:mt_saka:20210911004536j:plain

 

f:id:mt_saka:20210911004630p:plain