ぺんぎんさんのおうち

日本語勉強中のドイツ産ペンギンがいろんなことを書く

NITAC minictf

参加しとらん

馬刺し美味かった.

 

作問した -解説-

1問だけ.

crypto_300_blind

僕の草案から少し変わってるかもしれないので適宜読み替えてください(問題見てないのでわからん すまん 馬刺しは美味かった). 

 

crypto_300_blind

元ネタはこれ

Blind signature - Wikipedia

 

RSAで 攻撃対象の公開鍵{e, N}と秘密鍵d, 解読したい暗号文c, 暗号文cに対応する平文m

があるとして, 

 

1. 攻撃者が好きな数字rを公開鍵{e, N}を使って暗号化 (r_cとする)

2. 暗号化した r_c と 暗号文 c を 掛ける (s とする)

3. 攻撃対象にsを送りつけて秘密鍵dで署名してもらう 

4. 署名から平文が得られる

 

こんな感じの攻撃手法

 

-前提-

c ≡ m^e mod N

m ≡ c^d mod N 

N = p * q ; where p and q are sufficiently large

 

-証明-

好きな数字 r を公開鍵{e, N} で暗号化 : r_c

r_c ≡ r^e mod N

 

c と r_c を掛ける : s

s ≡ c * r_c mod N

 

s はさらに以下のように表される

s ≡ m^e * r^e mod N 

  ≡ (m*r)^e 

 

s を 秘密鍵 d で署名してもらう 

 

s^d mod N = (m*r)^ed mod N

s^d ≡ m*r mod N  

これで平文に1. で選択した数字rを掛けたものが得られた.

あとは Nを法としたrの逆元をm*r に掛けてあげると平文mが降ってくる.

 

 

今回の問題は

1. 2つの数字x1, x2を自分で決める

2. pow(x1, x2, n) * c を復号したものが返ってくる

 

といった感じになっている(はず),

 

これは

s ≡ (x1^x2 mod N * m^e mod N) mod N

≡ x1^x2 * m^e mod N

 

になって, s を d で署名するので

s^d ≡ x1^(x2*d) * m^(ed) mod N 

≡ (x1^(x2*d) mod N * m mod N) mod N

 

 

このとき x2 = e であれば

s^d ≡ x1 * m mod N

となる

 

あとは邪魔なx1を消せばよいので, x1の逆元(x1^-1)を掛けてあげると

x1 * x1^-1 * m mod N 

≡ m mod N 

 フラグが得られる

 

 

x1 = なんでもいい (ただし逆元が存在する数字)

x2 = e = 65537

 

 

おわりに

最近しずりん(静凛 (@ShizuRin23) | Twitter)がめっちゃ好き

どうすればいいかわからん ほんまかわいい

近況

続き.

ykm11.hatenablog.com

 

SecHack : 落ちた

セキュリティキャンプ : 合格した

受験 : 合格した ← 最強

 

打率6割強, まあいいのでは.

進路が決まり, とりあえずあとは卒業するだけなので, 夏季インターンとかリモートでできるプログラミング系のバイトを探しています. 下宿先でいんたねっと契約したいのでお金欲しいです. あと生活費のために.

 

 

しかし..

"卒業するだけ"とはいえ, そう簡単には卒業させてくれそうにありません.

1つ下の学年からカリキュラムが変わり, 留学からの留年をキメたので単位が足りない という状況に陥りました.

5学年で受講可能な科目が減ったのが主な原因です. 

補講・レポート等で対応してくれるので余裕じゃん〜とか思ってたら, あてにしていた科目の担当の先生が某の校長に着任ということで弊学からいなくなりました.

 

教授みてるか!! 俺だ!! 

異動の前に単位くれ!! じゃあな!!

 

 

さて, どうすっかな.

参考にならない, 高専からの編入受験記

※あてにするな

 

短期間の定期試験ですら集中して勉強できない人間が長期戦の編入試験をクリアできると思うな.

僕は無理だった.

 

4年春~冬

ひたすら実習やレポート.

勉強する時間が取れないレベル. 進学よりも就職を強くしようとしてる感じがする.

進学勢辛そう.

 

5年

ドイツ行った.

なんかよくわからんけど留年した.

 

 

ここから5年second season

春休み

友人とMHXXやってた. 高専受験前も無限にMHFやってた気がする.

数学(線形代数微分積分, 微分方程式)の問題を解く.

 

4月

卒研.

 

5月

願書関係の書類を揃えていく.

 

セキュリティキャンプの課題やってた.

 

6月

そわそわしてた

 

試験前日

ゲームセンター行ったり友人とHUBに飲みに行ったりした.

帰ってから友人宅でゲームしてた.

 

試験後

駅の近くで油そば食べた後デッドプール2観に行った.

 

 

 

申し訳程度のアドバイス

数学, 物理 : 問題集をする. 過去問を解く. わからないところはちゃんと聞く.

英語 : 海外のニュースサイトを読む. 英作文をする.

 

これを早いうちからやっておくと余裕がでてくるので, ちゃんとしよう.

何より継続して入試レベルの問題をやっていけるようにするのが重要. 

 

 

進出VtuberをMecab辞書に追加する

Vtuberがどんどん排出されている昨今, Mecabの辞書を古いままにしておくと形態素解析の精度が悪くなる.
形態素解析を自作しても良いが, そこに労力を割くのも合理的ではないので自分で辞書を作って新出語を解析できるようにしてしまおう.

自己参照用のエントリなので詳しく知りたい人は下部の参考から各エントリに飛ぶと良い.

環境

MacOS X
システム辞書としてはipadicではなくmecab-ipadic-neologdを使用している.

コンパイル

そこまで難しくはない.

$ /usr/local/Cellar/mecab/0.996/libexec/mecab/mecab-dict-index \

-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd \

-u user.dic \

-f utf-8 \

-t utf-8 added.csv

-d : 使用しているシステム辞書を指定(デフォルトだとipadic)   
-u : 作成されるユーザー辞書 
-f : 文字コード(基本的にutf-8)
-t : 文字コード(基本的にutf-8)と登録したい言葉が記入されているCSVファイル

emitting double-array: 100% |###########################################| done!
が出ればコンパイル成功


added.csvは次のような感じ

名取さな,,,10,名詞,固有名詞,人名,一般,*,*,名取さな,ナトリサナ,ナトリサナ
月ノ美兎,,,10,名詞,固有名詞,人名,一般,*,*,月ノ美兎,ツキノミト,ツキノミト
樋口楓,,,10,名詞,固有名詞,人名,一般,*,*,樋口楓,ヒグチカエデ,ヒグチカエデ


ユーザー辞書登録

コンパイルが成功したら次はmecabがユーザー辞書を読み込むように設定する.

$ vim /usr/local/etc/mecabrc

userdicがコメントアウトされているので, この部分を先ほど作成したユーザー辞書のパスに書き換える.
*ユーザー辞書がどこにあるのかを確認しておくこと.

; userdic = /home/foo/bar/user.dic
userdic = /usr/local/lib/mecab/dic/user.dic

動作確認してみる,

<適用前> f:id:ushiromiya3:20180603214556p:plain

<適用後> f:id:ushiromiya3:20180603214638p:plain




Vtuberに限らず, 自分で定義したい言葉とかはこの方法を使うのが良さそう.

参考

Mecabのユーザー辞書をつくる - hatappi.blog
MeCabにユーザー辞書を追加する

Python pandasでラベルを数値に変換

前書き

機械学習において, 正解データのラベルが数値ではなく文字列("りんご", "ぶどう" など)になっていることがある.

2値分類であれば

y = np.where(y == "りんご", 0, 1); where y consists of ("りんご", ..., "ぶどう", ...)

とできるが, 3クラス以上の場合はどうすればいいのだろう. 助けて.

TL;DR

pandas.Series.map()pandas.Series.apply() を使う.
pandas関係のエントリはたくさんあるので探そう.



pd.get_dummies(df) をつかうと

["りんご",
"りんご",
"ぶどう",
"みかん",
"みかん",]

が

1 0 0
1 0 0
0 1 0
0 0 1
0 0 1

こんな感じになる. そうじゃない.

3クラス以上のラベルを数値に変換できるメソッドがあった気もするけれど, 見つからなかったので代替策としてpandasのmapとapplyを使うことにした.



pandas.Series.apply()

def label_to_int(label):
    if label == "りんご": return 0
    elif label == "ぶどう" : return 1
    elif label == "みかん" : return 2

    ... 

df[idx] = df[idx].apply(label_to_int)
# idxはラベルがある列番号

.apply()メソッドにラベル変換用の関数を渡してあげる.
もちろんlambdaを渡すこともできるが, クラス数が多くなってきたら後述のmap()を使った方が良さそう.

pandas.Series.map()

mapped = {"りんご" : 0, "ぶどう" : 1, "みかん" : 2}
df[idx] = df[idx].map(mapped)
# idxはラベルがある列番号

.map()メソッドに {変化させたいラベル:対応する値} の辞書を渡してあげれば良い.

有用かもしれないし無用かもしれないもの

変換されるラベルが2値のときは実数に, 3値以上は整数に変換される. なんか気持ち悪い.
f:id:ushiromiya3:20180601194751p:plain f:id:ushiromiya3:20180601195032p:plain 追記: set(y)ではなくnp.unique(y)を使った方が良い.

applyもmapも, 一致しない(指定されていない)ラベルはnanに置き換わる. 誤字とか気をつけよう.