1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
use crate::utils::powmod;
use crate::window_state::WindowState;
use eframe::egui;
pub struct Window {
e: u64,
k: u64,
phi: u64,
closed: Option<u64>,
error: Option<String>,
}
impl Default for Window {
fn default() -> Self {
Self {
e: 0,
k: 0,
phi: 0,
closed: None,
error: None,
}
}
}
impl Window {
fn compute(&mut self) {
self.closed = Some(powmod(self.e, self.k - 1, self.phi));
}
}
impl WindowState for Window {
fn get_name(&self) -> &str {
"Вычисление секретной экспоненты"
}
fn update(&mut self, ui: &mut egui::Ui) {
ui.label("Открытая экспонента e:");
let resp1 = ui.add(egui::DragValue::new(&mut self.e));
ui.label("Модуль phi(e):");
let resp2 = ui.add(egui::DragValue::new(&mut self.phi).clamp_range(1..=u64::MAX));
ui.label("Порядок k элемента e по модулю phi(n):");
let resp3 = ui.add(egui::DragValue::new(&mut self.k).clamp_range(1..=u64::MAX));
if resp1.changed() || resp2.changed() || resp3.changed() {
self.closed = None;
self.error = None;
}
if ui.button("Вычислить секретную экспоненту d").clicked() {
self.compute();
}
if let Some(d) = &self.closed {
let mut tmp = d.to_string();
ui.label("Секретная экспонента d:");
ui.add_enabled(false, egui::TextEdit::singleline(&mut tmp));
}
if let Some(err) = &self.error {
ui.label(err);
}
}
}
|