#!/usr/bin/perl use CGI ':standard'; use Digest::SHA qw(sha512); use Crypt::OpenSSL::Random; use Crypt::OpenSSL::RSA; $passphrase = param('genpass'); $prngdata = ""; print "Content-Type: text/html\n\n"; if ($passphrase) { Crypt::OpenSSL::Random::random_seed(&genrsarandom(1024)); Crypt::OpenSSL::RSA->import_random_seed(); $rsa = Crypt::OpenSSL::RSA->generate_key(1024); print "PRNG data length: ". length($prngdata)."
"; print "PRNG data in hex: " . uc(unpack("H*", $prngdata)) . "

"; $pubkey = $rsa->get_public_key_string(); $privkey = $rsa->get_private_key_string(); $pubkey =~ s/\n/
/sgi; $privkey =~ s/\n/
/sgi; print "Public key:
" . $pubkey . "

"; print "Private key:
" . $privkey; } else { print "
PassPhrase:
"; } #################################################### # CSPRNG BASED ON A PASSWORD # RETURNS SAME RANDOM DATA UPON SUPPLYING # THE SAME PASSWORD #################################################### sub genrsarandom() { $bytes = $_[0]; $randomdata = ""; $numberofrounds = int($bytes / 64) + 1; for ($i = 0; $i < $numberofrounds; $i++) { $randomdata = $randomdata . sha512($passphrase . sha512($i.$i)); } $randomdata = substr($randomdata, 0, $bytes); $prngdata = $randomdata; return $randomdata; }