ぺんぎんさんのおうち

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

Pythonを使って結月ゆかりに喋ってもらいたい [Windows編]

自由に使えるWin機が手元にやって来たのでゆかりんのボイロを使って遊んでみたかった. Linux編/Mac編は待って

環境

  • Windows10
  • Anaconda
  • Python3.5
  • 結月ゆかりVOICEROID+ EX - amazonで買った

やったこと

Anaconda Prompt で実行すると

$ python yukari.py TEXT1 TEXT2 ... TEXT_N

テキストを読み上げてくれる.
VOICEROIDが起動していない場合は起動してから読み上げ, すでに起動している場合はそのまま読み上げてくれる.


ほとんどここを参考
blog.sky-net.pw

最初, VOICEROID+ (EXではなく)で動かそうとしていたためn時間苦しんだ(EXにしたらうまくいきました)

EXにした方がいい理由

  • 上記のサイトのコードが動かない(それはそう).
  • EnumChildWindowsで得られる情報が多い(winAPI操作が楽)
    VOICEROID+だとテキストボックスのhwndを探すのが大変(頑張れば見つかると思う). 再生ボタンは見つかった.
  • クリックが win32con.BM_CLICK ではなく win32con.BN_CLICKED になる.
    もし前者で動いたら, 教えてくれると助かります.
  • そもそも最新版を使わない理由とは

ソースコード

まって
github.com

ゆかりねっと

すごい(すごい)
僕もこれくらいのものを作っていきたい
www.okayulu.moe

感想

買うならEX+にしようね!!
subprocess.Popenよりも.callの方が良いみたいな記事を見たけど, callがいい感じに動いてくれなかったのでPopenにした.
Windowsって難しいなぁ.. winAPIで色々と遊べそうなので今後も頑張りたい.

今後

Linux, Macから動かせるようにしたい.
Winで動かすならゆかりねっと使えばいいよね...よくない?

他OSからでも動かせるようになったら音声認識ソフトの作成もやっていきたい.


何に使うの?

内緒

近況

先月ドイツから帰って来て投稿するの忘れてました。

帰国した次の日に夜行バスに乗ってSECCON決勝観戦しに行きました。かなりハードだと思います。

SECCONの後は大学見学したり観光したりですかね。あ、あとGoogle Homeを買っちゃったりもしました。毎朝起こしてくれます。

 

その後は何度か学校行って先輩の作業手伝ったり..とかしてました。

先々週くらいに卒業式があり、僕はまだ1年あるので旅立つ友人を見送りました。

まあ、その日は起きたら昼だったので式は出席してませんけどね。

 

 

さてさて、近況報告のお時間です。

Twitterの方で何度か呟いていましたが、まずは夏にかけて(最終6月末)受験シーズンです。なのでCTFなど諸々をお休みしてます。次の週末久しぶりにやろうかな〜とか考えていましたが、新居は当分ネットが使えないのでだめそうです(学校では基本的にctfへ接続できない)。

 

SecHack365やセキュキャンの募集要項の提出時期と被ってるのが辛いですが、受験勉強と共に頑張りたいと思います。絶対合格してやるからな。

 

後もう1つ、一番大事なことですが、卒業できるかどうか怪しいです。

留学したせいで色々と面倒なことになってしまいました。あと不運が重なりました。

どうなることやら。

 

卒業が確定したら詳細を書きたいと思います。では。

 

11.02.2018

いよいよ明日は寮の鍵を返却して空港(近くのホテル)へ向かう.

これが本当に本当の終わり.

 (飛行機)止まるんじゃねえぞ..💃

 

1

HarekazeCTF2018 Fight, Round and Round 想定解法

問題ファイル, solverをGitHubで公開しています

[Crypto 100] Fight

この問題ではシード値の算出に Euler's totient function を使用しています。
ソースコードからgen_seedオイラーのトーシェント関数であることが判ればあとは計算するだけです。
sageMathを使いました。

s = 4529255040439033800342855653030016000
seed = 1
for p, e in factor(s):
  seed *= pow(p, e) - pow(p, e-1)
print(seed)

seedがわかれば復号可能になります。

enc = base64.b64decode(b#7XDZk9F4ZI5WpcFOfej3Dbau3yc1kxUgqmRCPMkzgyYFGjsRJF9aMaLHyDU=")
random.seed(str(seed).rstrip("0"))
key = bytes([random.randint(0,255) for _ in enc])

flag = xor(enc, key)
print(flag)

実は問題名のFightはPhi(φ)と掛けてありました。
気づいた方がいれば嬉しいです。

[Crypto 200] Round and Round

巡回群の問題です。

(p-1)i : i = 0, 1, 2, 3, ..., -> 1, p-1, 1, p-1, ...
となり
1p-1 が繰り返し現れるので、順に足していくと2回毎にpになります。

これを一般化したものを考えます。

pを素数, zを繰り返し数とします
このとき、合計値は

sum_p = p * (z-1)/2 + 1 : z は奇数

で表す事ができます

この問題では

p1 = p * (q-1)/2 + 1
q1 = q * (p-1)/2 + 1

となります。

これをさらに変形し

2*(p1-1) = p * (q-1)  = x       (1)
2*(q1-1) = q * (p-1)  = y       (2)

(1)をpの式にすることで

p = x/(q-1)                     (3)

これを(2)に代入

y = q * x/(q-1) - q             (4)

となり、未知な変数をqだけにできます
(x, yはそれぞれp1, q1から計算ができるので定数です)

(4)をqで微分すると単調減少することがわかるので、二分探索によりqを求めることができます。
qが求まれば(3)からpを求められます。

またこの問題は方程式からp, qを求めることもできます。 何人かの方から他にもこういう解き方もあるぞ!とコメントをいただきました。ありがとうございます。

10.02.2018

CTFがある日. 起きたら寮のネットワークが他界してた.

昼頃にやっと復旧したのでギリギリアウト.

 

こっちの時間だと明日の朝7時に終了なので最後まで頑張って起きていたい,

終わったら部屋の片付け. ゴミ捨てたり荷物をまとめたり..

 

2