.
This commit is contained in:
63
src/main.rs
63
src/main.rs
@@ -2,7 +2,7 @@ use core::str;
|
|||||||
use std::fmt::Display;
|
use std::fmt::Display;
|
||||||
|
|
||||||
use hex::{FromHex, ToHex};
|
use hex::{FromHex, ToHex};
|
||||||
use inquire::{validator::Validation, CustomType, Select, Text};
|
use inquire::{validator::Validation, Confirm, CustomType, Select, Text};
|
||||||
|
|
||||||
mod pha;
|
mod pha;
|
||||||
mod rsa;
|
mod rsa;
|
||||||
@@ -26,6 +26,20 @@ impl Display for Mode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum InputMode {
|
||||||
|
Utf8,
|
||||||
|
Hex,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Display for InputMode {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
|
match self {
|
||||||
|
InputMode::Utf8 => write!(f, "UTF-8"),
|
||||||
|
InputMode::Hex => write!(f, "Hex"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn main() -> anyhow::Result<()> {
|
fn main() -> anyhow::Result<()> {
|
||||||
let mode = Select::new(
|
let mode = Select::new(
|
||||||
"Select a mode",
|
"Select a mode",
|
||||||
@@ -48,6 +62,21 @@ fn main() -> anyhow::Result<()> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn input_data(prompt: &str) -> anyhow::Result<Vec<u8>> {
|
||||||
|
let input_mode =
|
||||||
|
Select::new("Select input mode", vec![InputMode::Utf8, InputMode::Hex]).prompt()?;
|
||||||
|
|
||||||
|
let data = match input_mode {
|
||||||
|
InputMode::Utf8 => Text::new(prompt).prompt()?.into(),
|
||||||
|
InputMode::Hex => {
|
||||||
|
let data = Text::new("Enter encrypted data").prompt()?;
|
||||||
|
Vec::<u8>::from_hex(data)?
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(data)
|
||||||
|
}
|
||||||
|
|
||||||
fn generate_key() -> anyhow::Result<()> {
|
fn generate_key() -> anyhow::Result<()> {
|
||||||
let bits = CustomType::new("Enter the key size in bits")
|
let bits = CustomType::new("Enter the key size in bits")
|
||||||
.with_default(2048)
|
.with_default(2048)
|
||||||
@@ -96,20 +125,28 @@ fn encrypt() -> anyhow::Result<()> {
|
|||||||
let n = CustomType::new("Enter public key's N").prompt()?;
|
let n = CustomType::new("Enter public key's N").prompt()?;
|
||||||
let e = CustomType::new("Enter public key's E").prompt()?;
|
let e = CustomType::new("Enter public key's E").prompt()?;
|
||||||
|
|
||||||
let data = Text::new("Enter data").prompt()?;
|
let data = input_data("Enter data")?;
|
||||||
|
|
||||||
|
let chunkify = Confirm::new("Do you want to chunk data?")
|
||||||
|
.with_default(true)
|
||||||
|
.prompt()?;
|
||||||
|
|
||||||
let public_key = pha::PublicKey::new(n, e);
|
let public_key = pha::PublicKey::new(n, e);
|
||||||
let chunk_size = (public_key.bits() / 8) as usize;
|
let chunk_size = 1.max((public_key.bits() / 8) as usize);
|
||||||
let safe_chunk_size = chunk_size - 1;
|
|
||||||
let data = data.as_bytes();
|
|
||||||
|
|
||||||
if chunk_size < 2 {
|
let safe_chunk_size = if chunkify {
|
||||||
println!(
|
if chunk_size < 2 {
|
||||||
"This key cannot encrypt byte data! Key size {} bits is less than 16 bits.",
|
println!(
|
||||||
public_key.bits()
|
"This key cannot encrypt byte data! Key size {} bits is less than 16 bits.",
|
||||||
);
|
public_key.bits()
|
||||||
return Ok(());
|
);
|
||||||
}
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
|
chunk_size - 1
|
||||||
|
} else {
|
||||||
|
1
|
||||||
|
};
|
||||||
|
|
||||||
println!();
|
println!();
|
||||||
println!("data (raw) = {:?}", data);
|
println!("data (raw) = {:?}", data);
|
||||||
@@ -139,7 +176,7 @@ fn decrypt() -> anyhow::Result<()> {
|
|||||||
let encrypted = Text::new("Enter encrypted data").prompt()?;
|
let encrypted = Text::new("Enter encrypted data").prompt()?;
|
||||||
|
|
||||||
let private_key = pha::PrivateKey::new(n, d);
|
let private_key = pha::PrivateKey::new(n, d);
|
||||||
let chunk_size = (private_key.bits() / 8) as usize;
|
let chunk_size = 1.max((private_key.bits() / 8) as usize);
|
||||||
let encrypted = Vec::<u8>::from_hex(encrypted)?;
|
let encrypted = Vec::<u8>::from_hex(encrypted)?;
|
||||||
|
|
||||||
println!();
|
println!();
|
||||||
|
|||||||
Reference in New Issue
Block a user