[libmath-prime-util-perl] 51/55: BM and BBS examples

Partha P. Mukherjee ppm-guest at moszumanska.debian.org
Thu May 21 18:53:43 UTC 2015


This is an automated email from the git hooks/post-receive script.

ppm-guest pushed a commit to annotated tag v0.41
in repository libmath-prime-util-perl.

commit a72818085a3a3b1a9d1f27c694e377037e24ca11
Author: Dana Jacobsen <dana at acm.org>
Date:   Fri May 16 16:03:30 2014 -0700

    BM and BBS examples
---
 MANIFEST           |  1 +
 examples/csrand.pl | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 60 insertions(+)

diff --git a/MANIFEST b/MANIFEST
index 3d83c15..8199863 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -58,6 +58,7 @@ bench/bench-mp-psrp.pl
 bench/bench-mp-prime_count.pl
 bench/factor-gnufactor.pl
 examples/README
+examples/csrand.pl
 examples/sophie_germain.pl
 examples/twin_primes.pl
 examples/abundant.pl
diff --git a/examples/csrand.pl b/examples/csrand.pl
new file mode 100644
index 0000000..77551b8
--- /dev/null
+++ b/examples/csrand.pl
@@ -0,0 +1,59 @@
+#!/usr/bin/env perl
+use strict;
+use warnings;
+use Math::BigInt try => "GMP,Pari";
+use Math::Prime::Util qw/:all/;
+$|=1;
+
+# Example of Blum-Micali and Blum-Blum-Shub CSPRNGs.
+# Not very practical, but works as an example.
+
+my $nbits = shift || 10;
+my $type = shift || 'BBS';  # BM or BBS
+my $bits = shift || 512;
+
+die "Type must be BM or BBS" unless $type =~ /^(BBS|BM)$/;
+
+if ($type eq 'BM') {
+  my($p, $x0);
+  # Select P
+  do { $p = 2*random_nbit_prime($bits-1)+1 } while !is_prime($p);
+  # Get generator
+  my $g = Math::BigInt->new( "" . znprimroot($p) );
+  # Select X0.  This could be done better.
+  do { $x0 = random_nbit_prime($bits) ^ (random_nbit_prime($bits) >> 1) }
+    while $x0 <= 1;
+  # Generate bits
+  my $xn = Math::BigInt->new("$x0");
+  my $thresh = ($p-1) >> 1;
+  while ($nbits-- > 0) {
+    $xn = $g->copy->bmodpow($xn,$p);
+    print 0 + ($xn < $thresh);
+  }
+  print "\n";
+} else {
+  my($M,$x0);
+  # Select M = p*q
+  while (1) {
+    my($p,$q);
+    do { $p = random_nbit_prime($bits); } while ($p % 4) != 3;
+    do { $q = random_nbit_prime($bits); } while ($q % 4) != 3;
+    if ($bits < 200) {
+      my $gcd = gcd(euler_phi($p-1),euler_phi($q-1));
+      next if $gcd > 10000;
+    }
+    $M = $p * $q;
+    last;
+  }
+  # Select X0.  This could be done better.
+  do { $x0 = random_nbit_prime($bits) ^ (random_nbit_prime($bits) >> 1) }
+    while $x0 <= 1 || gcd($x0,$M) != 1;
+  # Generate bits
+  my $xn = Math::BigInt->new("$x0");
+  my $two = Math::BigInt->new(2);
+  while ($nbits-- > 0) {
+    $xn->bmodpow($two,$M);
+    print $xn->is_odd ? 1 : 0;
+  }
+  print "\n";
+}

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libmath-prime-util-perl.git



More information about the Pkg-perl-cvs-commits mailing list