Slide 1

Slide 1 text

ハードウェア乱数を用いた 謝辞代表者の決定

Slide 2

Slide 2 text

自己紹介 - 河原颯太(かわはらそうた) @khwarizmi6514 - 法政大学応用情報工学科 学部4年 金井(ネットワークセキュリティ)研究室所属 - 小学5年から野球を初めて高校3年までやっていた. - 春日部高校出身です! (これを言うといろんなところで先輩後輩が釣れることに最近 気が付いた) - パソコンとは無縁の生活だったが, 大学入学時, 気が付いたらパソコンをやらなけ ればいけなくなっていた. - 一緒に研究をしてくれる後輩募集中 (一人で研究をしていて寂しい)

Slide 3

Slide 3 text

最近やってること - NICのデバドラ開発 - NICのハードウェア機能活用による性能比較調査 - Linuxネットワークパフォーマンス調査 - XDPとnetmap *最近やりたいこと* - FreeBSDで性能調査(ネットワークスタック参照したりしときながら触ったことがな い) - 自作キーボード(家でやったらニッパがざこくてまだ完成してない) - FPGA(購入してLEDチカチカまでしてそのままタンスの奥にいる) - EDM作りたみがある

Slide 4

Slide 4 text

経緯 やりたいわけないよねー 抽選して決めるかなー

Slide 5

Slide 5 text

経緯 そういえばこういうの参加した時 こういうLTがあったけどこれ使ってみよ

Slide 6

Slide 6 text

ここからは一部mipsparc氏のスライドを使っています

Slide 7

Slide 7 text

乱数 コンピュータや組み込みプロセッサで使われる乱数は、ふつうは疑似乱数 疑似乱数は、ランダムシード(種となる数値)から線形合同法やメルセンヌ・ツイスタなど のアルゴリズムで生成する たとえば、昔のゲーム機では起動してからの経過時間、プレイヤーの操作などをランダ ムシードとしていたので、乱数調整(*)ができた。 (*乱数調整: ランダムシードが同じであれば、まったく同じ乱数が出る。これを利用して、 ゲームで同じ挙動を再現したり、任意のパラメータを得ること)

Slide 8

Slide 8 text

真の乱数 自然界の物理現象などを利用してつくられた、まったく規則性がなく予測不可能な数列 熱雑音、核分裂などに基づく ただし、予測不可能であってもただちに乱数というわけではない。 偏りがなく一様分布でなければならない

Slide 9

Slide 9 text

最新のIntel/AMDの x86プロセッサには ハードウェア乱数発生器が搭載 されている

Slide 10

Slide 10 text

Intel® Digital Random Number Generator (DRNG) Software Implementation Guide

Slide 11

Slide 11 text

Nondeterministic Hardware Entropy Source "uses thermal noise within the silicon"

Slide 12

Slide 12 text

Intel® Digital Random Number Generator (DRNG) Software Implementation Guide

Slide 13

Slide 13 text

どちらも64bit長の出力を得られる Nondeterministic Hardware Entropy Source(ES)→ AES-CBC-MAC→ ● AES-CTR → RDRAND ● RDSEED

Slide 14

Slide 14 text

Intel® 64 and IA-32 Architectures Software Developer’s Manual - Instruction Set Reference

Slide 15

Slide 15 text

とりあえずRDSEED #include void rdseed(uint64_t *rand) { asm volatile ( "rdseed %0" : "=A" (*rand) ); } これだけで乱数発生器にアク セスできる

Slide 16

Slide 16 text

末尾1ビットを表示 000100000001000001000000001000000100000000 000011000001001000111100011110000100000011 001100000010000011001001001000100100010011 001101000111000010010000001000110100011000 000000000010100010000000101100000000000000 001000000010100000001000001100011010000010

Slide 17

Slide 17 text

なんか 偏ってない?

Slide 18

Slide 18 text

乱数を検定しよう (FIPS140-2) 乱数らしさにはいくつかの側面がある (参考: M.Hiroi's Home Page http://www.geocities.jp/m_hiroi/light/pystat05.html ) ● 等確率性 均一にばらけている ● 無規則性 出現順序に規則性がない

Slide 19

Slide 19 text

等確率性 The Monobit Test 20000bitにつき1が 9725個~10275個の間 に収まる

Slide 20

Slide 20 text

等確率性 The Monobit Test 試しに4回試行した結果 1. 6054 2. 9933 3. 6551 4. 6434 20000bitにつき1が 9725個~10275個の間 に収まる

Slide 21

Slide 21 text

わかったこと 予測不可能なのでランダムシードとしては適しているが, そのまま乱数として使えるビットレベルの統計的な偏りのなさを 持っていない

Slide 22

Slide 22 text

RDRAND使ってみる 100011011110100001001010001001011100000011 100111010100000111000111000000001011111001 000101000000010000000100101101000000110101 000000110110001011000001010111111101110110 110001001000011000111000000101011011011111 010111000010100010110011101101011101000101 000001111101101000110100110010010001001001

Slide 23

Slide 23 text

等確率性 The Monobit Test 20000bitにつき1が 9725個~10275個の間 に収まる

Slide 24

Slide 24 text

等確率性 The Monobit Test 結果 1. 10087 2. 9973 3. 9985 4. 9960 20000bitにつき1が 9725個~10275個の間 に収まる

Slide 25

Slide 25 text

等確率性 The Poker Test 4bitごとに区切るとビット列は16パ ターンになる 5000回試行して、16パターンにそれ ぞれ何回入るかをカウントする 回数をf(i)として、Nを求める (注意: 5000を引くのは最後)

Slide 26

Slide 26 text

等確率性 The Poker Test 2.16 ~ 46.17に 収まればよい 1. 16.985600 2. 16.512000 3. 20.576000 4. 15.571200

Slide 27

Slide 27 text

無規則性 The Runs Test (参考:http://www.fdk.co.jp/cyber-j/pdf/HM-RAJ103.pdf) 連続で同じビットが出てくる回数を数える uint64_t rand; unsigned long total[20000]; unsigned int same_count = 0; unsigned int now_same = 9; unsigned int same_count_result[6] = {0}; for (int i = 0; i < 20000; i++) { rdrand(&rand); total[i] = rand & 0b1; } for (int i = 0; i < 20000; i++) { if (total[i] == now_same) { same_count++; } else { now_same = total[i]; if (0 < same_count && same_count < 6) { same_count_result[same_count - 1]++; } else if (same_count > 5) { same_count_result[5]++; } same_count = 0; } } for (int i = 0; i < 6; i++) { printf("%d\n", same_count_result[i]); }

Slide 28

Slide 28 text

無規則性 The Runs Test

Slide 29

Slide 29 text

結論 RDSEEDはランダムシードとしては予測不可能性があるので優秀だが、そのまま乱数と して使ってはいけない。 RDRANDはそのままで十分に真の乱数である。 なお、SHA256などのハッシュ関数は十分な乱数らしさを備えているので、RDSEEDは ハッシュ関数をとおせば真の乱数として使える

Slide 30

Slide 30 text

とりあえず何も考えずにRDRANDを使えばいい

Slide 31

Slide 31 text

というわけで RDRANDを使って代表者抽選をします

Slide 32

Slide 32 text

No content