diff options
Diffstat (limited to 'lab2/src/compute_window.rs')
| -rw-r--r-- | lab2/src/compute_window.rs | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/lab2/src/compute_window.rs b/lab2/src/compute_window.rs new file mode 100644 index 0000000..6a9a7e8 --- /dev/null +++ b/lab2/src/compute_window.rs @@ -0,0 +1,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); + } + } +} |