はじめに
今回はuvを用いてCrypto環境を構築する方法を紹介します。
Crypto環境を構築しておくと、CTFでCryptoカテゴリの問題を解くときに便利です。
uvとは
uvはPythonのパッケージ管理システムで、pipと比較して高速であるということが特徴となっています。
Windowsでは、以下のようにインストールすることができます。
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
Linuxでは、以下のようにインストールすることができます。
curl -sL https://astral.sh/uv/install.sh | bash
以下のコマンドで、インストールしたかどうかを確認できます。
uv --version
Crypto環境の構築
ここからは実際にCrypto環境を構築していきます。
まず、以下のコマンドで作業ディレクトリを作成します。名前は任意ですがここではcrypto
とします。
uv init crypto
これによって、以下のような構成のディレクトリができます。
crypto/
.git
.gitignore
.python-version
hello.py
pyproject.toml
README.md
ここでは割愛しますが、オプションをつけるとREADMEを省略するなどの設定ができます。gitで公開する必要がなかったりしたら、git関連のディレクトリやファイルを消去するのも手です。
次に、以下のコマンドでPythonのバージョンを指定します。
uv python pin 3.9.6
これによって、Pythonのバージョンが3.9.6になります。特に指定しない場合は最新のバージョンがインストールされます。
次に、以下のコマンドでPythonの仮想環境を作成します。
uv sync
これによって、crypto
ディレクトリ内に.venv
ディレクトリが作成され、実際にPythonの仮想環境が構築されることとなります。
次に、requirements.txt
に必要なパッケージを記述します。例えば、Cryptoモジュールを使いたい場合は以下のように記述します。
pycryptodome == 3.20.0
requirements.txt
に記述したパッケージをインストールするには以下のコマンドを実行します。
uv add -r requirements.txt
これによって、pycryptodome
がインストールされます。uv add
コマンドによって個別にパッケージをインストールすることもできますが、requirements.txt
を使うことで管理が楽になります。必要に応じてパッケージのリストを更新するとよいでしょう。
これによって、Crypto環境の構築が完了しました。実際にCrypto問題を解いてみましょう。例えば、WaniCTF 2024のbeginners_rsa
という問題を解いてみます。
from Crypto.Util.number import *
#暗号文
#enc = pow(m, e, n)
enc = 127075137729897107295787718796341877071536678034322988535029776806418266591167534816788125330265
#公開鍵
e = 65537
#これを素因数分解すると鍵が求まる
n = 317903423385943473062528814030345176720578295695512495346444822768171649361480819163749494400347
#msieveで素因数分解した結果
p = 9953162929836910171
q=11771834931016130837
r=12109985960354612149
s=13079524394617385153
a=17129880600534041513
#秘密鍵を求める
phi = (p-1)*(q-1)*(r-1)*(s-1)*(a-1)
d = inverse(e, phi)
m = pow(enc, d, n)
flag=long_to_bytes(m).decode()
print(flag)
このプログラムをsolve.py
として保存し、以下のコマンドを実行します。
uv run solve.py
結果は以下のようになりました。
FLAG{S0_3a5y_1254!!}
おわりに
uvを用いて、Crypto環境を構築する方法を紹介しました。CTFをやっていると環境が汚れやすいので、このように専用の仮想環境を立ててその中で問題を解くとよいと思います。