summaryrefslogtreecommitdiff
path: root/lab2/src/compute_window.rs
diff options
context:
space:
mode:
Diffstat (limited to 'lab2/src/compute_window.rs')
-rw-r--r--lab2/src/compute_window.rs62
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);
+ }
+ }
+}