improve prime check by getting rid of it
This commit is contained in:
parent
b7cc408f58
commit
98adfff871
1 changed files with 10 additions and 19 deletions
|
@ -1,6 +1,9 @@
|
|||
use std::str::FromStr;
|
||||
|
||||
use rand::thread_rng;
|
||||
use num_bigint::{BigInt, BigUint, RandBigInt, ToBigInt};
|
||||
use num_traits::{One, Zero};
|
||||
use num_prime::nt_funcs::is_prime;
|
||||
|
||||
#[derive(Clone, Debug, PartialEq)]
|
||||
struct Key {
|
||||
|
@ -14,17 +17,6 @@ struct KeyPair {
|
|||
public: Key,
|
||||
}
|
||||
|
||||
fn is_prime(n: &BigUint) -> bool {
|
||||
let mut i = BigUint::from(2u32);
|
||||
while &i < &n.sqrt() {
|
||||
if n % &i == 0u32.into() {
|
||||
return false;
|
||||
}
|
||||
i += 1u32;
|
||||
}
|
||||
true
|
||||
}
|
||||
|
||||
fn euclid(a: &BigUint, b: &BigUint) -> BigUint {
|
||||
let mut s0 = BigInt::one();
|
||||
let mut s1 = BigInt::zero();
|
||||
|
@ -68,7 +60,7 @@ fn find_e(phi: &BigUint) -> BigUint {
|
|||
}
|
||||
|
||||
fn generate_key_pair(p: &BigUint, q: &BigUint) -> Option<KeyPair> {
|
||||
if !is_prime(p) || !is_prime(q) || p == q {
|
||||
if !is_prime(p, None).probably() || !is_prime(q, None).probably() || p == q {
|
||||
return None;
|
||||
}
|
||||
|
||||
|
@ -120,7 +112,6 @@ fn find_private_key(n: &BigUint, e: &BigUint, d: &BigUint) -> (BigUint, BigUint)
|
|||
let kphi = d * e - 1u32;
|
||||
let mut t = kphi.clone();
|
||||
while &t % 2u32 == BigUint::zero() {
|
||||
// println!("t: {t}");
|
||||
t /= 2u32;
|
||||
}
|
||||
|
||||
|
@ -130,16 +121,12 @@ fn find_private_key(n: &BigUint, e: &BigUint, d: &BigUint) -> (BigUint, BigUint)
|
|||
while a < 100u32.into() {
|
||||
let mut k = t.clone();
|
||||
while k < kphi {
|
||||
// println!("a: {a}, kphi: {kphi}, k: {k}, n: {n}");
|
||||
let x = pow_mod(&a, &k, n);
|
||||
// println!("x: {x}; n: {n}");
|
||||
if x != BigUint::one() &&
|
||||
x != (n - 1u32) &&
|
||||
pow_mod(&x, &2u32.into(), n) == BigUint::one()
|
||||
{
|
||||
// println!("x: {x}; n: {n}");
|
||||
p = gcd(&(x - BigUint::one()), n);
|
||||
// println!("p: {p}");
|
||||
break;
|
||||
}
|
||||
k *= 2u32;
|
||||
|
@ -153,8 +140,12 @@ fn find_private_key(n: &BigUint, e: &BigUint, d: &BigUint) -> (BigUint, BigUint)
|
|||
}
|
||||
|
||||
fn main() {
|
||||
let p1 = BigUint::from(1234577u32);
|
||||
let p2 = BigUint::from(1234567891u32);
|
||||
let p1 = BigUint::from_str(
|
||||
"4749005082931655265795279207137334688882888522100146336507022668451002460179375611672565276762330501"
|
||||
).unwrap();
|
||||
let p2 = BigUint::from_str(
|
||||
"9310861498193275957242744132472955539605730477090317642199650992920633866919589011169367627123252973"
|
||||
).unwrap();
|
||||
|
||||
let pair_a = generate_key_pair(&p1, &p2)
|
||||
.expect("failed to generate key pair a");
|
||||
|
|
Loading…
Reference in a new issue