Simple php implementation of Blum Blum Shub.
$bbs= newBlumBlumShub(400);var_dump(bin2hex($bbs->getRandomPseudoBytes(32)));// out like 02b3b55d6aea2f26a0ddfcd8967597fb0d38d7c6c4027f0595f5a614b9f06400classBlumBlumShub{
private$p,$q,$s,$m,$init,$x0;
private$size=1024;
public function__construct($size=false,$p=false,$q=false,$s=false)
{
if($p!==false&&$q!==false&&$s!==false)
{$this->p=$p;$this->q=$q;$this->m=bcmul($p,$q);$this->s=$s;
} else {
if($size!==false)$this->size=$size;$this->init();
}$this->xn=bcmod(bcmul($this->s,$this->s),$this->m);
for($i=0;$i<10;$i++)$this->xn=bcmod(bcmul($this->xn,$this->xn),$this->m);
}
private functioninit()
{$this->p=$this->genPrime();$this->q=$this->genPrime();$this->m=bcmul($this->p,$this->q);$mCoPrime=gmp_init($this->m);# try find co-primewhile(1)
{$s=genPrime($this->size);$sCoPrime=gmp_init($s);$g=gmp_gcdext($mCoPrime,$sCoPrime);$g=gmp_strval($g['g']);
if($g==='1')
break;
}$this->s=$s;
}
public functiongenPrime()
{
while(1)
{$min=gmp_init(str_pad('1',$this->size,'0'));$max=gmp_init(str_pad('9',$this->size,'0'));$prime=gmp_strval(gmp_random_range($min,$max));$validate=bcmod($prime,'4');
if($validate==='3')
break;
}
return$prime;
}
public functiongetRandomPseudoBytes($length)
{$bytes='';
for($i=0;$igetByte();
return$bytes;
}
public functiongetByte()
{$byte='';
for($i=0;$i<8;$i++) {$this->xn=bcmod(bcmul($this->xn,$this->xn),$this->m);$byte.=substr(decbin($this->xn[strlen($this->xn)-1]), -1);
}
returnchr(bindec($byte));
}
}?>