Skip to content

Commit 70aa9fb

Browse files
committed
Added cli interface
1 parent f245062 commit 70aa9fb

File tree

5 files changed

+290
-28
lines changed

5 files changed

+290
-28
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
/target
2+
id_rsa
3+
id_rsa.pub

Cargo.lock

+217
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+2-4
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,5 @@ edition = "2021"
88
[dependencies]
99
base64 = "0.13.0"
1010
num = { version = "0.4.0", features = ["rand"] }
11-
# num-traits = "0.2.14"
12-
# num-primes = "0.3.0"
13-
# num-bigint-dig = { version = "0.8.0", features = ["prime"] }
14-
rand = "0.8.4"
11+
rand = "0.8.4"
12+
clap = { version = "3", features = ["derive"] }

src/main.rs

+62-10
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,68 @@
1-
use prime_check::miller_rabin_single;
1+
#![allow(dead_code)]
2+
extern crate clap;
23

4+
use std::io::Read;
5+
use clap::{Parser, Subcommand};
6+
use num::BigUint;
7+
use prime_check::{oct_to_base64, base64_to_oct};
38
use crate::prime_check::{PrimeUtils, encrypt, decrypt};
49

510
mod prime_check;
6-
fn main() {
11+
12+
#[derive(Parser)]
13+
#[clap(author, version, about, long_about = None)]
14+
struct Cli {
15+
#[clap(subcommand)]
16+
command: Commands
17+
}
18+
19+
#[derive(Subcommand)]
20+
enum Commands {
21+
Gen,
22+
Encrypt { message: Option<String> },
23+
Decrypt { secret: Option<String> },
24+
}
25+
26+
fn key_to_base64(key: &(BigUint, BigUint)) -> String {
27+
oct_to_base64(&key.0) + "-" + &oct_to_base64(&key.1)
28+
}
29+
30+
fn base64_to_key(base64: &str) -> (BigUint, BigUint) {
31+
let parts: Vec<&str> = base64.split("-").collect();
32+
(base64_to_oct(parts[0]), base64_to_oct(parts[1]))
33+
}
34+
35+
fn main() -> std::io::Result<()> {
36+
let end_char = if cfg!(target_os = "windows") { 'Z' } else { 'D' };
737
let mut checker = PrimeUtils::new(1024);
8-
let (pub_key, pri_key) = checker.gen_key();
9-
let message = "moderncryptography";
10-
let secret = encrypt(&pri_key, message);
11-
println!("{}", secret);
12-
let message = decrypt(&pub_key, &secret);
13-
// checker.is_prime(testee)
14-
println!("{}", message);
15-
// println!("{}", miller_rabin_single(&341_u32, 20_u32));
38+
let cli = Cli::parse();
39+
match cli.command {
40+
Commands::Gen => {
41+
let (pub_key, pri_key) = checker.gen_key();
42+
std::fs::write("id_rsa.pub", key_to_base64(&pub_key).as_bytes())?;
43+
std::fs::write("id_rsa", key_to_base64(&pri_key).as_bytes())?;
44+
println!("id_rsa.pub & id_rsa have been generated.");
45+
},
46+
Commands::Encrypt { message } => {
47+
let message = message.unwrap_or_else(|| {
48+
println!("Please input the message. Ctrl + {} to end.", end_char);
49+
let mut content = String::new();
50+
std::io::stdin().read_to_string(&mut content).unwrap();
51+
content
52+
});
53+
let public_key = base64_to_key(&String::from_utf8(std::fs::read("id_rsa.pub").unwrap()).unwrap());
54+
println!("{}", encrypt(&public_key, &message))
55+
},
56+
Commands::Decrypt { secret} => {
57+
let secret = secret.unwrap_or_else(|| {
58+
println!("Please input the secret. Ctrl + {} to end.", end_char);
59+
let mut content = String::new();
60+
std::io::stdin().read_to_string(&mut content).unwrap();
61+
content
62+
});
63+
let private_key = base64_to_key(&String::from_utf8(std::fs::read("id_rsa").unwrap()).unwrap());
64+
print!("\n{}", decrypt(&private_key, &secret))
65+
}
66+
}
67+
Ok(())
1668
}

0 commit comments

Comments
 (0)