#include <Arduino.h>

const int a = 5; // Ключ шифрования
const int b = 8; // Смещение

// Функция для нахождения обратного по модулю 26
int modInverse(int a, int m) {
    for (int x = 1; x < m; x++) {
        if ((a * x) % m == 1) {
            return x;
        }
    }
    return -1; // Если обратное не найдено, возвращаем -1
}

void setup() {
    Serial.begin(9600); // Инициализация последовательного порта
    Serial.println("Введите зашифрованный текст для расшифровки:");
}

void loop() {
    if (Serial.available()) {
        String input = Serial.readStringUntil('\n'); // Чтение строки из монитора порта
        String decrypted = affineDecrypt(input); // Дешифрование строки
        Serial.println("Расшифрованный текст:");
        Serial.println(decrypted); // Вывод расшифрованной строки
    }
}

String affineDecrypt(String text) {
    String result = "";
    int a_inv = modInverse(a, 26); // Нахождение обратного значения a по модулю 26

    for (char c : text) {
        if (isAlpha(c)) { // Проверяем, является ли символ буквой
            char base = isUpperCase(c) ? 'A' : 'a'; // Определяем базу для верхнего/нижнего регистра
            int C = c - base; // Преобразуем символ в число
            int P = (a_inv * (C - b + 26)) % 26; // Применяем обратное аффинное преобразование
            result += char(P + base); // Преобразуем обратно в символ
        } else {
            result += c; // Не изменяем пробелы и другие символы
        }
    }
    return result;
}
uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5