Copyright (C) 2014 Gael Abadin
License: MIT Expat / beerware
Ever wanted a crypto safe mt_rand()? Not useful for many things I guess (maybe not useful at all), but I recently wanted to build a class able to pick random words from a dictionary in a safe way, so they could be used as passwords (Correct, horse. That's a battery staple). I probably overdid it... The result is my attempt on a "cryptographically secure" PRNG implementation with an mt_rand alike interface, including a wrapper for selecting and using the best random bytes generator from available extensions and /dev/urandom (about 100 times slower than mt_rand on a single core, by the way, so clearly there is plenty of room for improvement if you want to fork it ;-))
In a similar way as mt_rand(), random integers are chosen from a given range following a uniform distribution:
require_once 'CryptoSecurePRNG.php';
$secGen = new synapp\info\tools\passwordgenerator\cryptosecureprng\CryptoSecurePRNG();
$randInt = $secGen->rand(); //between 0 and mt_getrandmax()
$randInt = $secGen->rand(1,100); //between 1 and 100
$randInt = $secGen->rand(-50,50); //between -50 and 50
You can also get a string of random bytes:
require_once 'CryptoSecurePRNG.php';
$secGen = new synapp\info\tools\passwordgenerator\cryptosecureprng\CryptoSecurePRNG();
$stringLength = 20; // number of random chars to be generated
$stringOfRandomChars = $secGen->getRandomBytesString($stringLength); // generate a string of $stringLength random ascii chars (non printable too)
And here is the code to visualize the output using matlab:
// PHP code, uses cryptosecureprng rand() to generate the samples
require_once 'CryptoSecurePRNG.php';
$prng = new synapp\info\tools\passwordgenerator\cryptosecureprng\CryptoSecurePRNG();
$out='';
for ($i=0;$i<1280;$i++) for ($j=0;$j<720;$j++) {
$out .= $prng->rand(0,255).','.$prng->rand(0,255).','.$prng->rand(0,255).',';
}
$fh = fopen('testout.txt','w');
fwrite ($fh, $out);
fclose($fh);
% Matlab code, reads and displays the generated samples
x=csvread('testout.txt');
C = reshape (x,720,1280,3);
C = uint8(C);
imwrite(C,'rgb_output.bmp');
hist(x,256);
saveas(gcf,'hist_output','png');
Check the code (or generate the docs using phpdocumentor) if you want more info on tweaks and available parameters.
If you like this class, feel free to buy me a beer ;-)
bitcoin: 15i9QKZqLuNdcyseHpjpZiPcty6FMazxk2
dogecoin: DCjimHzRu25smyjnEb7V9qFuVyf6P2JjBf
paypal: http://goo.gl/iQd1UL
Have fun.-