package main import ( "fmt" "strings" ) // Функция для шифрования текста с помощью шифра Гронсфельда func encrypt(text string, key []int) string { ciphertext := "" keyLen := len(key) // Проходим по каждому символу в тексте for i, char := range text { // Пропускаем пробелы и символы, которые не являются буквами if char == ' ' || !isLetter(char) { ciphertext += string(char) continue } // Находим индекс текущей буквы в алфавите charIndex := getIndex(char) // Получаем новый символ, добавляя смещение по ключу и обрабатывая случаи переполнения newChar := shift(charIndex, key[i%keyLen]) // Добавляем новый символ к зашифрованному тексту ciphertext += string(newChar) } return ciphertext } // Функция для дешифрования текста func decrypt(ciphertext string, key []int) string { plaintext := "" keyLen := len(key) // Проходим по каждому символу в зашифрованном тексте for i, char := range ciphertext { // Пропускаем пробелы и символы, которые не являются буквами if char == ' ' || !isLetter(char) { plaintext += string(char) continue } // Находим индекс текущей буквы в алфавите charIndex := getIndex(char) // Получаем новый символ, вычитая смещение по ключу и обрабатывая случаи переполнения newChar := shift(charIndex, -key[i%keyLen]) // Добавляем новый символ к расшифрованному тексту plaintext += string(newChar) } return plaintext } // Функция для получения индекса буквы в алфавите (от 0 до 25) func getIndex(char rune) int { return int(char - 'a') } // Функция для проверки, является ли символ буквой func isLetter(char rune) bool { return (char >= 'a' && char <= 'z') || (char >= 'A' && char <= 'Z') } // Функция для смещения символа в алфавите на заданное количество позиций func shift(index, offset int) rune { return rune((index+offset+26)%26 + 'a') } func main() { // Запрос ввода текста с консоли var text string fmt.Print("Введите текст: ") fmt.Scanln(&text) // Запрос ввода ключа с консоли var keyStr string fmt.Print("Введите ключ (числа через пробел): ") fmt.Scanln(&keyStr) // Преобразование введенного ключа в массив целых чисел keyParts := strings.Fields(keyStr) var key []int for _, part := range keyParts { num := 0 fmt.Sscanf(part, "%d", &num) key = append(key, num) } // Зашифруем текст encryptedText := encrypt(text, key) // Выведем зашифрованный текст fmt.Println("Зашифрованный текст:", encryptedText) // Расшифруем текст decryptedText := decrypt(encryptedText, key) // Выведем расшифрованный текст fmt.Println("Расшифрованный текст:", decryptedText) }