RL78で真性乱数生成器(TRNG)

本家でも度々話題に出るRL78で真性乱数生成器(TRNG)の研究をしてみます。
 
JCMVP/CMVPの試験にパスできるレベルの乱数にするべく、
米国連邦政府情報処理標準FIPS PUB 140-2規格を満足できるかチャレンジ!
 
まずは、。評価ボード(QB-R5F104PJ-TB)を使って内蔵発振器の位相ノイズ(ジッター)を使った乱数の味見をしたところ、
エンベロープ的には正規分布っぽいですけれども、6の倍数の値が顕著になっています。
 
・LOCOで測定した2msec毎の、HOCOカウント値の分布 
 
 
 
 FIPS140-2で要求されている20,000ビットの乱数列に対する連続同値の出現頻度の規定(0と1それぞれに適用)
Parents
  • 値が6毎に偏る問題は解決できなかったので、とりあえずカウント値を6で割って、奇数(1)か偶数(0)かを乱数ビットとして取り込んでみました。

    12ビットタイマー(ITCMP)の値による連続同値の分布をみたところ
    測定時間が0.915msec(14+1x0.061msec)より短いとFIPS(20000bit毎に発生する連続同値の頻度)に適合できないようです。
    特に連続1~3ビット同値になる規格に不適合です。

    ということで、256msecあれば256ビットの真性乱数を生成することができました!

    ↑ 黒線が頻度上限、赤線が頻度下限

    グラフから測定時間が短いと同値が連続する傾向が読み取れますね。(6ビット以上連続して同じ値になる確率があり得ないほど高いです)

  • クロック差を利用した乱数生成のサンプルプログラムをアップしてみました。(CS+for CA版ですけど)
    japan.renesasrulz.com/.../385

  • 次は、A/D入力を使った乱数生成です。

    端子をオープンにした状態でA/D変換すると、ANI0はVDDレベル(3FFh)、ANI1はGNDレベル(000h)に張り付いてしまうので、ANI2を使ったところ変換時間に関わらず変換値は±5以内に収束してしまいました。
    A/D端子オープン状態の入力インピーダンス(10MΩ程度?)による熱雑音にしてはバラツキが大きいので、ESD保護用のショットキーダイオードなどから発生する1/fノイズ由来のバラツキみたいですね。

    とりあえず、AD変換値の最下位1ビットを乱数列とした場合、真性乱数にはなりませんでした。
    1と0の総数に偏り(5%以上)が出ていて、連続同値の成績が悪いです。

    変換時間が2.3usec、38usec共にFIPSの規格(黒と赤の範囲)から食み出しています。残念!

    入力インピーダンスが高いANI16以降のチャンネルを使うと更に状況悪くなって、0/1の偏りが20%以上になるようです。>_<
    ちなみに、内部基準電圧や温度センサーを変換対象にすると偏りか99%を超えます。

  • 以上の結果から、ハードウェア乱数発生源の選択肢として
    高速さを意識するならA/Dポートを使用した乱数、
    乱数品質を意識するなら2つのクロック差を利用した乱数ということになりますね。
  • Kirin様
    お世話になっております。

    大変参考になるデータの公開、ありがとうございます。

    自分が使うようなケースだと、
    初期値設定でクロック差による乱数、メイン処理実行時にA/Dポート式と
    使い分けるのがいう感じがよさそう・・・

Reply
  • Kirin様
    お世話になっております。

    大変参考になるデータの公開、ありがとうございます。

    自分が使うようなケースだと、
    初期値設定でクロック差による乱数、メイン処理実行時にA/Dポート式と
    使い分けるのがいう感じがよさそう・・・

Children
  • Sugachanceさん
    確かに、用途別に乱数生成法を変えて使うとパフォーマンスがよくなりますね^^
    乱数による自局アドレスの決定などは高品質の乱数、ふつうに使うのは高速な乱数とか、適材適所で。