メモ帳

楽しいアウトプットの場所

Githubリポジトリの作り方

リポジトリのNEWボタンを押す。
f:id:nya__nya:20210327170408p:plain
リポジトリの名前を登録する
f:id:nya__nya:20210327170636p:plain
f:id:nya__nya:20210327170753p:plain
リポジトリを作ったらgit cloneしてきて編集を行いコミットする。

$ mkdir folda
$ cd folda
$ touch README.md
$ echo "#test" >> README.md
$ touch sample.py
$ git init
$ git add .
$ git commit -m "first commit"
$ git branch -M main
$ git remote add origin https://github.com/englishta/Algo.git
$ git push -u origin main

基本情報技術者試験

基本情報技術者試験を受けてきました。就職活動でIT系の企業を受ける際に役立ちそうなので受けてみました。なお、私自身は機械工学を大学で学んでおり、情報系の知識が皆無の状態で勉強を始めました。ただし、C言語は大学で履修していました。

試験の結果

結果は午前試験76%, 午後試験77%でした。
午前午後試験のどちらとも60点以上をとることが合格基準なので、受かったと思います。
午前試験の得点率です。
f:id:nya__nya:20210325220831p:plain
午後試験の得点率です。
f:id:nya__nya:20210325220734p:plain

午前試験に向けて勉強したこと

合計で100時間ほど午前試験の対策にあてました。午前試験対策として参考書を2週して、過去問道場の問題を500問くらい解きました。午前試験は、過去の問題と全く同じ問題や類題が出題される確率が高い試験なので過去問演習を中心に対策をしました。基本的な知識はYoutubeや参考書で身に着けて、後は過去問をひたすら解きました。
books.rakuten.co.jp
www.fe-siken.com

午後試験に向けて勉強したこと

主に過去問道場の問題を解いて問題の傾向や前提知識を補いました。ソフトウェア、ハードウェアの大問で過去問と全く同じ問題が出題されました。C言語でも過去に似たような問題が出題されていたため、本番でスムーズに問題を解くことが出来ました。

「RSA暗号」 SECCON Beginners CTF 2018 RSA is power

import Crypto.PublicKey.RSA as RSA

# 与えられたもの
N = 97139961312384239075080721131188244842051515305572003521287545456189235939577
E = 65537
C = 77361455127455996572404451221401510145575776233122006907198858022042920987316

# ./mesieve を使ってN=p*qのp,qを求める
p = 299681192390656691733849646142066664329
q = 324144336644773773047359441106332937713
l = (p-1)*(q-1)

# dを求めるときは、どっちでもok
d = RSA.inverse(E, (p-1)*(q-1))
d = pow(E, -1, l)
m = pow(C, d, N)

print(RSA.long_to_bytes(m))
b'ctf4b{5imple_rs4_1s_3asy_f0r_u}'


N = 97139961312384239075080721131188244842051515305572003521287545456189235939577\\
E = 65537\\
C = 77361455127455996572404451221401510145575776233122006907198858022042920987316\\

が与えられる。そこから秘密鍵dを求めて、平文mを復号する。

nを素因数分解してn=p\times qとなる素数p, qを求める。nが大きすぎるため、Linux上でmsieveを利用して素因数分解を行うか、factordb.comを使って行う。msieveについてはは以下の記事を参照してください。

nyaonn.hatenablog.com

Pythonのライブラリを使うためにpycryptoをインストール

$ pip install pycrypto

d = e^{-1} mod (p-1)(q-1)\\m = c^{d} mod(n)

素因数分解パッケージ msieveインストール方法(wsl Ubuntu版)と使い方

素因数分解パッケージmsieveのインストール方法を紹介します。
以下のコマンドを実行します。

$ sudo apt-get install build-essential libgmp3-dev zlib1g-dev libecm-dev

次に以下のコマンドを実行します。少し時間がかかります。

$ wget "http://downloads.sourceforge.net/project/msieve/msieve/Msieve%20v1.52/msieve152.tar.gz?r=&ts=1452107977&use_mirror=jaist" -O msieve152.tar.gz
$ tar xvf msieve152.tar.gz
$ cd msieve-1.52/
$ make all ECM=1

これで使えるようになりました。

./msieve -q -v -e 22222

22222を素因数分解してみます。

Msieve v. 1.52 (SVN unknown)
Tue Mar 23 20:19:05 2021
random seeds: 18e2b498 6e696c40
factoring 22222 (5 digits)
p1 factor: 2
p2 factor: 41
p3 factor: 271
elapsed time 00:00:00

222222=2\times41\times271だと分かります

Python コード短縮!!(他人のコードを観察したメモ)ABC187より

'12345'などの数字からなる文字列があったときに、各桁の数を整数型(int型)の配列へと変換

s = input()
A = []
for e in s:
    A.append(int(e))

上の書き方よりも

s = input()
A = [int(i) for i in s]


ABC187 A問題の解答
A - Large Digits

a, b = input().split()
sa = sum([int(i) for i in a])
sb = sum([int(i) for i in b])
print(max(sa, sb))