Saataa andagii !

This commit is contained in:
Lukian 2024-11-30 18:31:38 +01:00
commit 092492ba24
13 changed files with 389 additions and 0 deletions

2
keygen/.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
/target
Cargo.lock

10
keygen/Cargo.toml Normal file
View file

@ -0,0 +1,10 @@
[package]
name = "rust_rsa_key_gen"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
num-bigint-dig = "0.8.4"
rand = "0.8.5"

21
keygen/src/main.rs Normal file
View file

@ -0,0 +1,21 @@
mod rsa;
use rsa::gen_keys;
use std::io::Write;
use std::io;
fn main() {
let mut input = String::new();
print!("Enter an integer: ");
io::stdout().flush().unwrap();
io::stdin().read_line(&mut input).expect("Failed to read line");
let num: i32 = input.trim().parse().expect("Invalid input");
let (e, d, n) = gen_keys(num.try_into().unwrap());
println!("e : {}", e);
println!("d : {}", d);
println!("n : {}", n);
}

91
keygen/src/rsa.rs Normal file
View file

@ -0,0 +1,91 @@
use num_bigint_dig::{ToBigUint, RandBigInt, BigUint};
use num_bigint_dig::traits::ModInverse;
fn get_s_and_d(n: &BigUint) -> (BigUint, BigUint) {
let mut d = n - 1.to_biguint().unwrap();
let mut s = 0.to_biguint().unwrap();
while &d % 2.to_biguint().unwrap() == 0.to_biguint().unwrap() {
s += 1.to_biguint().unwrap();
d /= 2.to_biguint().unwrap();
}
(d, s)
}
fn miller_witness(n: &BigUint, a: &BigUint) -> bool {
let (d, s) = get_s_and_d(&n);
let mut x = a.modpow(&d, &n);
if x == 1.to_biguint().unwrap() {
return false;
}
let mut i = 0.to_biguint().unwrap();
while i < s.clone(){
if x == n.clone() - 1.to_biguint().unwrap() {
return false;
}
x = x.modpow(&2.to_biguint().unwrap(), &n);
i += 1.to_biguint().unwrap();
}
true
}
fn is_prime(n: BigUint, k: u16) -> bool {
if n.clone() == 3.to_biguint().unwrap() || n.clone() == 2.to_biguint().unwrap() {
return true;
}
if n.clone() == 1.to_biguint().unwrap() {
return false;
}
if n.clone() % 2.to_biguint().unwrap() == 0.to_biguint().unwrap() {
return false;
}
for _ in 0..k {
let mut rng = rand::thread_rng();
let min = 2.to_biguint().unwrap();
let max = n.clone() - 1.to_biguint().unwrap();
let a = rng.gen_biguint_range(&min, &max);
if miller_witness(&n, &a) {
return false;
}
}
return true;
}
fn gen_prime_number(lenght: usize) -> BigUint {
let mut rng = rand::thread_rng();
let mut a = rng.gen_biguint(lenght);
while !is_prime(a.clone(), 50) {
a = rng.gen_biguint(lenght);
}
a
}
pub fn gen_keys(lenght: usize) -> (BigUint, BigUint, BigUint) {
let p = gen_prime_number(lenght / 2);
let mut q = gen_prime_number(lenght / 2);
while p == q {
q = gen_prime_number(lenght / 2);
}
let n = &p * &q;
let phi_n = (&p - 1.to_biguint().unwrap()) * (&q - 1.to_biguint().unwrap());
let e = 65537.to_biguint().unwrap();
let d = e.clone().mod_inverse(&phi_n).unwrap().to_biguint().expect("error");
(e, d, n)
}