誊肌

导击宛眶栏喇达

 芭规池弄に奥链な导击宛眶栏喇达∈psudo-random generator¨PRG∷とは、肌の拉剂を积たす宛眶でなければならない。

  • 办屯尸邵拉¨叫蜗される宛眶废误に0と1の市りがないこと。
  • 徒卢稍材墙拉¨册殿の宛眶废误から经丸の宛眶废误を徒卢できないこと。

导击宛眶栏喇达の慌寥み

  • 导击宛眶栏喇达は柒婶觉轮を积ち、嘲婶から涂えられた硷を傅に导击宛眶误を栏喇する。
  • 导击宛眶を1改栏喇するという炭吾が叫たとき、导击宛眶栏喇达はメモリの猛∈柒婶觉轮∷を傅に纷换をして、その纷换冯蔡を导击宛眶として叫蜗する。そして、肌の导击宛眶の叫蜗炭吾に洒えて、极尸の柒婶觉轮を恃步させておくのである。つまり、柒婶觉轮から导击宛眶を纷换する数恕と柒婶觉轮を恃步させる数恕の2つが、导击宛眶栏喇达のアルゴリズムである。
  • 悼击宛眶栏喇达で悼击宛眶を栏喇するためには、悼击宛眶の硷∈seed∷という攫鼠が涩妥である。悼击宛眶の猛は、悼击宛眶栏喇达の柒婶觉轮を介袋步するために脱いられる。つまり、メモリの猛を硷として蝗うのである。硷はもちろんアタッカ〖に徒卢されてはなりません。毋えば、附哼の箕癸といってものを硷としてしまうと廊煎ということである。

称硷プログラミング咐胳ˇスクリプト咐胳における导击宛眶栏喇

C咐胳

rand()

  • stdlib.hに脱罢されているsrand()に导击宛眶の栏喇のためのseedを畔すことができる。
    • seedとして、time簇眶で艰评した附哼箕癸を回年することが驴い。
      • 毋¨srand*1;
      • time簇眶は擅帽疤の猛を手すため、ル〖プ柒でsrand()とrand()を蝗ってしまうと、1擅粗は票じ宛眶猛が叫蜗されてしまうことになる。よって、srand()はル〖プの嘲で1搀乖えばよい。
  • rand()で导击宛眶∈腊眶∷を艰评することができる。
    • 导击宛眶の认跋は0笆惧32768踏塔である。
  • 认跋を故り哈んで导击宛眶を栏喇するときは%遍换灰を脱いた娟途纷换を网脱する眷圭が驴い。
    • ≈导击宛眶猛♂rand() % 认跋の妥燎眶 + 认跋の呵井猛∽とする。

OpenSSL烧掳のBIGNUMライブラリ

 导击宛眶を积つBIGNUMオブジェクトを艰评するにはBN_rand_range()簇眶を脱いる。BN_rand_range()簇眶の今及は肌の奶り。

int BN_rand_range(BIGNUM *result, BIGNUM *range);

 この簇眶の苞眶は肌の奶り。

  • result
    • 介袋步貉みのBIGNUMオブジェクトのポインタ。
    • 栏喇された燎眶はこのオブジェクトに呈羌される。
  • range
    • 0×ここで回年した猛までの导击宛眶を栏喇する。

 また、BN_generate_prime()簇眶を蝗えば、ランダムな燎眶を栏喇することができる。BN_generate_prime()簇眶の今及は肌の奶り。

BIGNUM *BN_generate_prime(BIGNUM *ret, int num, int safe, BIGNUM *add, BIGNUM *rem, void (*callback)(int, int, void *), void *cb_arg);

 この簇眶の苞眶は肌の奶りである。

  • ret
    • 充り碰てられたBIGNUMオブジェクト。
      • 栏喇された导击ランダムな燎眶はこのオブジェクトに呈羌される。
    • 喇根した眷圭にもこのオブジェクトが手される。
    • NULLを回年すると、糠しいBIGNUMオブジェクトが手される。
  • num
    • 栏喇される燎眶の积つべきビット眶。
  • safe
    • 奥链な燎眶を手すかどうかの回年する。
      • ここでいう奥链な燎眶とは1を苞いて、2で充っても燎眶である眶のことである。
      • 毋えば、DH赴蛤垂で蝗脱する燎眶は奥链な燎眶である涩妥がある。
  • add
    • 润NULLが回年された眷圭、栏喇された燎眶をこの眶で充ったときの途りはrem苞眶で涂えられた猛に办米する涩妥がある。
  • rem
    • add苞眶に润NULLが回年された眷圭、栏喇された燎眶をadd苞眶で充ったときの途りはこの猛になる涩妥がある。
    • NULLが回年された眷圭は、猛として1が蝗脱される。
  • callback
    • 燎眶栏喇の狠に、その渴乖觉斗を鼠桂させたい眷圭に蝗脱するコ〖ルバック簇眶へのポインタ。
    • NULLを回年すればコ〖ルバックしない。
  • cb_arg
    • 渴乖觉斗を雌浑するコ〖ルバック簇眶が回年された眷圭、この苞眶がコ〖ルバック簇眶に木儡畔される。

RANDLIB

C++

rand()

  • C咐胳のrand()と票屯。

Ruby

Perl

rand

  • ≈rand EXPR∽とすると0笆惧EXPR踏塔の导击宛眶を手す。
    • EXPRを臼维すると、0笆惧1踏塔の导击宛眶を手す。
  • srandでseedを肋年できる。

Math::Random::MTモジュ〖ル

  • Math::Random::MTモジュ〖ルを蝗うことで词帽にメルセンヌツイスタ〖で栏喇した导击宛眶を艰评することができる。
  • ≈use Math::Random::MT qw(srand rand);∽としておけば、稿は筛洁のrandやsrandと票じように蝗える。

PHP

rand()

  • rand()により0笆惧getrandmax()踏塔の导击宛眶を手す。ˇ
    • Windowsなどのではgetrandmax()の猛は32768となっている。
      • 32768より络きい导击宛眶が瓦しい眷圭は、苞眶ありのrand()を蝗った数が词帽である。
  • rand(int ○min, int ○max)を蝗えば、认跋を肋年できる。
    • 回年した呵井猛と呵络猛を崔む。
  • srand()を蝗えば、seedを肋年できる。
  • libcの导击宛眶栏喇达を网脱する。

mt_rand()

  • 筛洁のrand()よりも4擒笆惧光庐。
  • メルセンヌツイスタ〖を脱いて导击宛眶を栏喇するため、光篮刨である。
  • 斧た誊惧は筛洁のrand()の簇眶叹に≈mt_∽という儡片胳が烧いているだけであり、蝗い数は票じである。
    • ただし、苞眶なしのmt_rand()を蝗脱した眷圭、0笆惧mt_getrandmax()踏塔の猛となる。

VB.NET

Rnd

  • Rnd()簇眶により、0笆惧1踏塔の导击宛眶を评ることができる。
  • Randomizeステ〖トメントでseedを肋年することができる。
  • 导击宛眶を栏喇するアルゴリズムは24ビット俐妨圭票恕である。

Randomクラス

  • Randomクラスが脱罢されています。
  • 导击宛眶を栏喇するアルゴリズムはKnuthの负换恕である。
  • Randomクラスのコンストラクタにseedを肋年できる。
    • 苞眶痰しのコンストラクタを蝗うと、seedとしてEnvironment.TickCountが蝗脱される。
  • Random#Next()により导击宛眶猛(Integer)を艰评することができる。Next()には苞眶を积つものと积たないものがあり、积つものを蝗えば回年する认跋柒の导击宛眶猛を评ることができる。

毋¨

Dim rnd As New System.Random()
Dim r1 As Integer = rnd.Next(6)			'0笆惧6踏塔の导击宛眶を栏喇する。
MessageBox.Show(r1.ToString())
Dim r2 As Integer = rnd.Next(-10, 10)	'-10笆惧10踏塔の导击宛眶を栏喇する。
MessageBox.Show(r2.ToString())
Dim r3 As Integer = rnd.Next()			'0笆惧Int32.MaxValue踏塔の导击宛眶を栏喇する。
MessageBox.Show(r3.ToString())
  • Integer笆嘲の导击宛眶を评るために、NextBytes()やNextDouble()なども赂哼する。

RNGCryptoServiceProviderクラス

  • 芭规脱の导击宛眶を栏喇するクラス。

毋¨

Dim random() As Byte = New Byte(100) {}
Dim rng As New System.Security.Cryptography.RNGCryptoServiceProvider()
rng.GetBytes(random)	'ランダムな100バイト墓の芹误を侯る。
  • 0笆嘲の导击ランダムなByte猛を评る眷圭は、GetNonZeroBytes()を蝗う。

Java

BigIntegerの宛眶

 BigIntegerのコンストラクタの妈1苞眶に认跋∈nを回年すると、0×2nビットの认跋∷、妈2苞眶にRandamインスタンスを回年すると、BigInteger房の宛眶を栏喇することができる。

BingInteger int = new BigInteger(int bit , new Random());

 ランダムな燎眶を评る眷圭は肌のようにする。ただし、probablePrime()の妈1苞眶はMiller-Rabinの帆り手し眶なので、毋えば1を回年した眷圭は燎眶を栏喇する澄唯は1/2になる。

BigInteger primeInt = BigInteger.probablePrime(1, new Random());

Randomクラス

  • Randomクラスを网脱して词帽に宛眶を艰评することできる。
  • 导击宛眶を栏喇するアルゴリズムは48ビット俐妨圭票恕である。
  • nextInt()の苞眶でnを涂えたときは、提り猛として0×n-1の认跋の宛眶猛となる。
  • 啼玛爬が∝Effective Java≠の灌誊47≈ライブラリ〖を梦り、ライブラリ〖を蝗う∽のところに今いてある。 →
Random rand = new Random();
System.out.println(rand.nextInt([眶猛]));
  • nextInt()だと提り猛の房はintであるが、提り猛の房としてboolean,long,double,floatであるメソッドも脱罢されている。
メソッド叹提り猛の房苞眶を回年しないときの认跋
nextBoolean()boolean房true or false
nextInt()int房-2147483648×+2147483647
nextLong()long房-9223372036854775808×+9223372036854775807
nextDouble()double房0.0笆惧1.0踏塔
nextFloat()float房0.0笆惧1.0踏塔
  • 导击宛眶の硷(long猛)を涂えるときはRandonクラスのコンストラクタで肋年する。あるいはRandom#setSeed(long)で肋年することもできる。
Random rand = new Random(seed);

Math.random()

  • 0笆惧1踏塔のdouble房の导击宛眶を栏喇するためにはMath.random()を悸乖する。
  • seedを肋年する怠墙がない。

毋¨回年认跋の腊眶の导击宛眶を手すメソッド

/**
 * 回年认跋の腊眶の导击宛眶を手す.
 * <p>呵络猛、呵井猛鼎に导击宛眶の认跋に崔まれる.
 * @param max 呵络猛
 * @param min 呵井猛
 * @return 导击宛眶
 */
private static int getRandom(final int max, final int min) {
	return (int) Math.floor(Math.random() * (max - min + 1)) + min;
}

シェルスクリプト(bash)

 RANDOM恃眶を徊救するだけで词帽に导击宛眶を艰评することができる。

$ echo $RANDOM
  • この数恕で艰评できる宛眶猛は0×32767の腊眶である。
  • RANDOM恃眶に猛0×232-1を洛掐すると、导击宛眶误を介袋步することができる。
  • unsetコマンドでRANDOM恃眶を痰跟にすると、そのシェル柒のRANDOM恃眶の跟蜗は己う。

PowerShell

  • Get-Randomコマンドレットが脱罢されている。
    • 毋¨≈Get-Random 1000∽とすれば、0笆惧1000踏塔の导击宛眶を艰评できる。

SQL

SQL Server

  • RAND()により导击宛眶∈0×1∷を艰评できる。
  • RAND()の苞眶にseedを回年できる。
  • RAND()は钙び叫されるごとに佰なる导击宛眶を手す。
    • ただし、1搀のSELECT柒で手されるRAND()の猛は票じである。

毋¨fooテ〖ブルに剩眶乖があるとき、SELECTの冯蔡はすべての乖が票じ猛になる。

SELECT RAND() FROM foo;

MySQL

  • RAND()により导击宛眶を艰评できる。
  • RAND()の苞眶にseedを回年できる。
  • 苞眶を臼维すると、钙び叫されるごとに、佰なる导击宛眶を手す。
    • 1搀のSELECT柒でも佰なる导击宛眶を手す。

PostgreSQL

  • RANDOM()により导击宛眶を艰评できる。
  • 宛眶のseedはSEED恃眶またはSETSEED簇眶により回年できる。
    • seedは0×1までの赦瓢井眶爬眶である。
  • 1搀のSELECT柒でも佰なる导击宛眶を手す。

悼击宛眶栏喇达の毋

でたらめな数恕

  • アルゴリズムを帽姐に剩花にしただけでは豺疯できない。
  • まず、件袋が没くなってしまうという啼玛がある。剩花にしただけのアルゴリズムを蝗って眶の误を栏喇させると、驴くの眷圭は没い件袋∈没い眶误の帆り手し∷に促ってしまう。芭规祷窖で蝗う宛眶は徒卢稍材墙拉でなければならないので、件袋が没いというのはダメである。
  • もうひとつの风爬として、プログラマ〖が拒嘿を妄豺できないようなアルゴリズムは概诺芭规のようにアルゴリズム极咳を入瓶しているだけであり、そのアルゴリズムが眶池弄に奥链であるかどうか删擦できないということである。

俐妨圭票恕

  • よく蝗われている悼击宛眶栏喇达だが、芭规祷窖に蝗うことはできない。
  • 海、R0,R1,∧という悼击宛眶の误を侯るとする。まず、悼击宛眶の硷∈seed∷から、肌の纷换及を蝗って呵介の悼击宛眶R0を侯る。

R_0~=~(~A~\times~seed~+~C~)~\,~mod~\,~M

 ここで、A,C,Mは≈A°M,C°M∽を塔たす年眶とする。

 肌に、R0から、肌のようにして悼击宛眶R1を侯る。

R_1~=~(~A~\times~R_0~+~C~)~\,~mod~\,~M

 笆惯票屯にして、RnからRn+1を侯る。

R_{n+1}~=~(~A~\times~R_n~+~C~)~\,~mod~\,~M

 つまり、附哼の悼击宛眶の猛をA擒してCを裁え、さらにMで充った途りを肌の悼击宛眶とするわけだ。俐妨圭票恕では、呵稿に栏喇した悼击宛眶の猛が柒婶觉轮になるといえる。

  • A,C,Mの猛を庙罢考く联买すれば、痰侯百拉を积つ悼击宛眶误を侯ることができるが、徒卢稍材墙拉は积たない。なぜならば、办枚票じ眶が叫てしまうと、肌からは涟に叫たか眶误が帆り手し叫てきてしまうからである。これが宛眶の件袋となってしまう。mを络きい眶にすれば件袋は墓くなるが、冯渡いつかは票じ眶误が叫てきてしまう。つまり、俐妨圭票恕は芭规祷窖に蝗えない。
  • プログラミング咐胳のライブラリ簇眶として脱罢されている悼击宛眶栏喇达の驴くが、俐妨圭票恕を脱いている。毋えば、C咐胳のrand簇眶、Javaのjava.util.Randomクラスなどがある。よってこうした簇眶を网脱した芭规祷窖は廊煎といえる。

俐妨圭票恕のプログラムによる悸赋

 俐妨圭票恕で蝗う称年眶は肌のように肋年しておく。

  • a¨8で充って5途る眶
  • c¨瘩眶
  • m¨2の芜捐の眶で、できるだけ络きなもの

 肌にjavaで瓢侯する俐妨圭票恕のプログラム∈SenkeiGoudouHou.java∷を绩す。

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 
 
 
 
 
-
|
-
|
|
|
|
|
-
|
|
|
|
-
|
|
|
!
|
-
|
|
!
!
!
/*
 * 俐妨圭票恕による∈导击∷宛眶の栏喇
 * 掐蜗¨x,a,c,m
 * 叫蜗¨导击宛眶¨x=(a*x+c) % mの冯蔡
 */
public class SenkeiGoudouHou {
 
    public static void main(String[] args) {
        int x=0;    //呵稿に滇めた宛眶。介袋猛をセットする。
        int m=0;    //2の芜捐の眶
        int a=8*5+5;    //8で充って5途る眶
        int c=123;    //瘩眶
        
        try{
            x=Integer.parseInt(args[0]);
            a=Integer.parseInt(args[1]);
            c=Integer.parseInt(args[2]);
            m=Integer.parseInt(args[3]);
        }catch(NumberFormatException e){
            System.out.println("俐妨圭票恕による导击宛眶栏喇");
            System.out.println("SenkeiGoudouHou <x> <a> <c> <m>");
            return;
        }
        
        for(int i=0;i<20;i++){
            x=(a*x+c)%m;
            System.out.println(x+",\t");
        }
    }
}

 惧淡プログラムを网脱して、俐妨圭票恕の悸赋をしてみる。

>java SenkeiGoudouHou 1 45 123 8
0,	3,	2,	5,	4,	7,	6,	1,
0,	3,	2,	5,	4,	7,	6,	1,
0,	3,	2,	5,

 m=8とすると、10改誊に0が判眷する。つまり件袋が判眷している。悸狠にそれ笆惯は票じ眶误の帆り手しであることを澄かめることができる。

 m=4にしてみる。

>java SenkeiGoudouHou 1 45 123 4
0,	3,	2,	1,
0,	3,	2,	1,
0,	3,	2,	1,
0,	3,	2,	1,
0,	3,	2,	1,

 このとき5改誊に0が判眷している。澄かにmを井さくすると、件袋が没くなったことがわかった。

 肌のようにmを络きくしてみると、叫蜗される猛も络きくなると票箕に件袋も墓くなる。警なくとも20改の叫蜗の面に件袋は赂哼していないことがわかる。

>java SenkeiGoudouHou 1 45 123 65536
168,	7683,	18178,	31701,	50412,
40439,	50406,	40169,	38256,	17707,
10506,	14141,	46644,	1951,	22382,
24273,	43832,	6483,	29714,	26533,

 笆惧の雇弧より、≈苞眶が票じならば部刨でも票じ导击宛眶が栏喇されること∽と≈mは井さいといけないこと∽がわかる。ところが、サイコロの誊の1×6の导击宛眶を叫蜗したいとする。このためm=6としてしまうと、件袋が没くなってしまうという啼玛が弹こる。そこで、m=65,536∈♂216∷のような络きな猛で导击宛眶を侯り、それを6で充った途りを滇めればよいというアイデアが蛔いつく。

 まとめると、0からn-1までの认跋の宛眶を侯りたいときには、络きなmで导击宛眶を栏喇して、それをmod nで雇えた叫蜗を导击宛眶として蝗えばよいということである。これを雇胃したJavaプログラム∈SenkeiGoudouHou2.java∷を肌に绩す。

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 
 
 
 
 
-
|
|
|
|
|
|
-
|
|
|
|
|
|
!
|
|
-
|
|
-
-
|
-
|
|
|
!
!
|
|
-
|
|
!
!
!
/*
 * 俐妨圭票恕による导击宛眶栏喇∈0×n-1の导击宛眶を滇める∷
 * 掐蜗¨n
 * 叫蜗¨0×n-1の20改の宛眶
 */
public class SenkeiGoudouHou2 {
    //クラス恃眶の年盗
    static int x=1;    //呵稿に滇めた宛眶。介袋猛をセットする。
    
    //宛眶を滇める簇眶
    //n¨n-1までの宛眶を滇める
    //提り猛¨滇めた宛眶
    static int MyRandom(int n){
        int m=65536;
        int a=8*5+5;
        int c=123;
        x=(a*x+c)%m;
        int r=x%n;
        return r;
    }
    
    //main
    public static void main(String[] args) {
        int n=10000;    //宛眶の认跋。苞眶が回年されなければ、これがデフォルト猛に肋年される。
        
        if(args.length==1){
            try{
                n=Integer.parseInt(args[0]);
            }catch(NumberFormatException e){
                System.out.println("俐妨圭票恕による导击宛眶山绩∈0からn-1の导击宛眶∷");
                System.out.println("SenkeiGoudouHou2 <n> n¨滇める认跋");
                return;
            }
        }
        
        //宛眶を20改侯って山绩
        for(int i=0;i<20;i++){
            int r=MyRandom(n);
            System.out.println(r+",\t");
        }
    }
}

 苞眶に4と2を回年したときの眷圭は肌のようになる。

>java SenkeiGoudouHou2 2
0,	1,	0,	1,
0,	1,	0,	1,
0,	1,	0,	1,
0,	1,	0,	1,
0,	1,	0,	1,

>java SenkeiGoudouHou2 4
0,	3,	2,	1,
0,	3,	2,	1,
0,	3,	2,	1,
0,	3,	2,	1,
0,	3,	2,	1,

 mは65,536なので、件袋は墓いはずだが、2,4の眷圭はそれぞれ件袋が2,4となってしまっている。なぜならば、俐妨圭票恕には、布疤の峰がランダムではなくなるという啼玛が栏じてしまうのである。ランダムでないものをさらにnで充った途りはもちろんランダムでなくなる。毋えば、n=4で、6XXを充った途りを滇めると、600は4で充り磊れるから、XXだけが途りの纷换に蝗われるのである。
 この啼玛を饯赖するには、惧疤の峰に庙誊すればよい。なぜならば、惧疤の峰はランダムだからである。惧疤の峰を蝗うには、xを2で充っていき、nの2擒よりも井さくなったら、途りを滇めるようにすればよい。惧淡プログラム∈SenkeiGoudouHou2.java∷柒に判眷したMyRandomメソッドを肌のように恃构すればよい。

	static int MyRandom(int n){
		int m=65536;
		int a=8*5+5;
		int c=123;
		x=(a*x+c)%m;
		int r=x;

		//rがnの2擒より络きい粗帆り手す
		while(r >= n*2){
			//rを2で充る
			r /= 2;
		}
		//rをnで充った途りを雇える
		r %= n;

		return r;
	}

 この饯赖惹MyRandomメソッドに恃构したプログラム∈SenkeiGoudouHou3.java∷は肌の奶りである。

>java SenkeiGoudouHou3 4
1,	3,	0,	3,	2,	0,
2,	0,	0,	0,	1,	2,
1,	3,	1,	1,	1,	2,
3,	2,

办数羹ハッシュ簇眶を蝗う数恕

ˇ办数羹ハッシュ簇眶を蝗って、徒卢稍材墙拉を积った悼击宛眶误∈动い悼击宛眶∷を栏喇する悼击宛眶栏喇达が侯れる。

ˇアドバ〖サリ〖が肌の悼击宛眶を徒卢するためには、附哼のカウンタ〖の猛を梦る涩妥がある。カウンタ〖の猛を梦るためには、办数羹ハッシュ簇眶の办数羹拉を撬らなければならないのである。これは端めて氦岂なので、アドバ〖サリ〖は肌の悼击宛眶を徒卢できない。つまり、この悼击宛眶栏喇达は、办数羹ハッシュ簇眶の办数羹拉が悼击宛眶栏喇达の徒卢稍材墙拉を毁えている。

メルセンヌˇツイスタ〖を蝗う数恕

M废误宛眶を蝗う数恕

芭规を蝗う数恕

  • 芭规を蝗い、动い悼击宛眶を栏喇する悼击宛眶栏喇达を侯ることができる。
  • このときの芭规はAESのような滦据芭规であっても、RSA芭规のような给倡赴芭规であってもよい。
  • アドバ〖サリ〖が肌の悼击宛眶を徒卢するためには、附哼のカウンタ〖の猛を梦る涩妥がある。しかし、これまでに叫蜗された悼击宛眶误は、芭规矢に陵碰するので、カウンタ〖の猛を梦るというのは、芭规を豺粕することに戮ならない。これは端めて氦岂なので、アドバ〖サリ〖は肌の悼击宛眶を徒卢できない。つまり、この悼击宛眶栏喇达では芭规の怠泰拉が悼击ランダム栏喇达の徒卢稍材墙拉を毁えていることになる。
  • 芭规を蝗った悼击宛眶栏喇达の恶挛弄なものとして、ANSI X9.17およびANSI X9.31のAppendixに淡揭されている数恕がある。これは芭规ソフトウェアのPGPでも蝗われている。

悼击宛眶栏喇达に滦するアタック

  • 办忍には芭规に滦するアタックの逼に保れて、悼击宛眶栏喇达の赂哼はあまり罢急されない。しかし、悼击宛眶喇烙は赴を侯るという脚妥な舔誊を积っているので、アドバ〖サリ〖の苟封滦据となりやすい。

硷∈seed∷

  • 悼击宛眶の硷は、芭规の赴に嗓浓する脚妥拉を积つ。
  • 悼击宛眶の硷がアドバ〖サリ〖に梦られてしまえば、その悼击ランダム栏喇达が栏喇する悼击宛眶误はすべてアアドバ〖サリ〖に梦られたことになる∈悼击ランダム栏喇达で蝗われているアルゴリズムは、苟封荚に梦られていることを簿年する∷。よって、悼击宛眶の硷はアドバ〖サリ〖に入泰にしなければならない。
  • 硷をアドバ〖サリ〖に梦られないようにするためには、浩附稍材墙拉を积つ靠の宛眶极挛を硷にすることである。

ランダムプ〖ルに滦するアタック

  • 涩妥になったときにその眷で靠の宛眶を侯り叫すのではなく、ランダムプ〖ルと钙ばれるファイルにランダムなビット误を眠えておく数恕がある。芭规ソフトウェアが悼击宛眶の硷を涩妥とする箕は、このランダムプ〖ルから涩妥なだけのランダムのビット误を艰り叫して蝗う。
  • もし、アドバ〖サリ〖にこのランダムプ〖ルの柒推を梦られてしまうと、悼击宛眶の硷を徒卢されてしまう材墙拉がある。

PRGの眶侠弄菇蜜

one-way functionからPRGを侯る

[年妄]
≈one-way functionが赂哼する∽
⑼≈length-tripling pseudo random generator∈PRG∷が赂哼する∽

[年盗]
G=~\{~G_k~:~\{~0,1~\}^k~\to~\{~0,1~\}^{3k}~\}_{k~\in~\mathbb{N}}¨PRG∽
def\forall~D~\(~PPT~\,~distinguisher~\)~|~Pr~[~x~\overset{$}{\leftarrow}~\{~0,1~\}^{3k}~:~D~\(~x~\)~=1~]~-~Pr~[~s~\overset{$}{\leftarrow}~\{~0,1~\}^k~;~x=G_k~\(~s~\)~:~D~\(~x~\)~=1~]~|:neg

 咐い垂えると、肌が喇り惟つ。

U_{3k}~\approx~G~\(~U_k~\)

 ここで、Ukはkビットストリングの办屯尸邵を罢蹋する。

导击宛眶栏喇达の炳脱毋

 芭规の面では宛眶が蝗われる。毋えば、肌の眷烫で蝗われる。

  • 鼎奶赴芭规废の入泰赴の栏喇
  • 给倡赴芭规废やデジタル金叹におけるデ〖タ栏喇
  • ストリ〖ム芭规

徊雇矢弗

  • ∝呵糠芭规祷窖≠
  • ∝Eclipseによる挛赋池浆 Javaではじめるアルゴリズム掐嚏≠


*1 unsigned) time(NULL