/** returns RSA key pair with length $bit_len */ function generate_key_pair($bit_len) { // generate two primes p and q $p_len = (int) ($bit_len / 2) + 1; $q_len = $bit_len - $p_len; $p = get_prime($p_len); $q = get_prime($q_len); // $n - is shared modulus $n = bi_mul($p, $q); // generate public ($e) and private ($d) keys $pq = bi_mul(bi_dec($p), bi_dec($q)); do { $e = bi_rand($q_len, 'microtime_generator'); } while (!bi_is_zero(bi_dec(bi_gcd($e, $pq)))); $d = bi_invmod($e, $pq); return array('n' => bi_serialize($n), 'public_key' => bi_serialize($e), 'private_key' => bi_serialize($d)); }
/** * Finds inverse number $inv for $num by modulus $mod, such as: * $inv * $num = 1 (mod $mod) * * @param big_int resource $num * @param big_int resource $mod * @return big_int resource * @access public */ function invmod($num, $mod) { return bi_invmod($num, $mod); }
echo '$modulus = next_prime($c) = [', bi_to_str($modulus), "]<br/>\n"; $c = bi_addmod($a, $b, $modulus); echo '$a + $b (mod $modulus) = [', bi_to_str($c), "]<br/>\n"; $c = bi_submod($a, $b, $modulus); echo '$a - $b (mod $modulus) = [', bi_to_str($c), "]<br/>\n"; $c = bi_mulmod($a, $b, $modulus); echo '$a * $b (mod $modulus) = [', bi_to_str($c), "]<br/>\n"; $c = bi_divmod($a, $b, $modulus); echo '$a / $b (mod $modulus) = [', bi_to_str($c), "]<br/>\n"; $c = bi_powmod($a, $b, $modulus); echo 'pow($a, $b) (mod $modulus) = [', bi_to_str($c), "]<br/>\n"; $c = bi_factmod(1000, $modulus); echo '1000! (mod $modulus) = [', bi_to_str($c), "]<br/>\n"; $c = bi_absmod(-1, $modulus); echo '-1 (mod $modulus) = [', bi_to_str($c), "]<br/>\n"; $c = bi_invmod($a, $modulus); echo '1 / $a (mod $modulus) = [', bi_to_str($c), "]<br/>\n"; $c = bi_sqrmod($a, $modulus); echo 'sqr($a) (mod $modulus) = [', bi_to_str($c), "]<br/>\n"; echo 'cmp($a, $b) (mod $modulus) = ', bi_cmpmod($a, $b, $modulus), "<br/>\n"; /* other functions */ echo '<h3>other functions</h3>' . "\n"; /* attention: second parameter of bi_pow() must have integer type (not BIG_INT!) */ $c = bi_pow($a, 4); echo 'pow($a, 4) = [', bi_to_str($c), "]<br/>\n"; // argument of bi_fact() must have integer type (not BIG_INT)