elcodedocle/cryptosecureprng

cryptographically secure pseudo-random number generator class with an mt_rand alike method interface

0.2.2 2024-09-02 16:19 UTC

This package is not auto-updated.

Last update: 2024-12-19 16:17:37 UTC


README

mt_rand for the moderately paranoid citizen

Copyright (C) 2014 Gael Abadin
License: MIT Expat / beerware

Motivation

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 ;-))

How to use

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.-