Другие языки и технологии

Программирование на Bash

Создайте скрипт на языке bash, который будет шифровать и дешифровать файлы с использованием простого алгоритма шифрования (например, шифр Цезаря), меняя название файла и его содержимое. Скрипт должен принимать аргументы -e для шифрования и -d для дешифрования, а также файл для обработки.
Ответы
#!/usr/bin/env bash # Скрипт для шифрования (-e) и дешифрования (-d) файлов # Пример использования: # ./caesar.sh -e file.txt # ./caesar.sh -d file.txt # Проверяем количество аргументов if [ $# -lt 2 ]; then echo "Использование: $0 [-e|-d] <имя файла>" exit 1 fi MODE="$1" FILE="$2" # Проверяем, существует ли файл if [ ! -f "$FILE" ]; then echo "Файл $FILE не найден!" exit 1 fi # Создадим временный файл для преобразованного содержимого TEMP_FILE="$(mktemp)" # Зададим соответствие для шифрования и дешифрования сдвигом на 3 ENCRYPT_IN="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" ENCRYPT_OUT="DEFGHIJKLMNOPQRSTUVWXYZABCdefghijklmnopqrstuvwxyzabc" DECRYPT_IN="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" DECRYPT_OUT="XYZABCDEFGHIJKLMNOPQRSTUVWxyzabcdefghijklmnopqrstuvw" # Функции для шифрования/дешифрования имени файла encrypt_name() { echo "$1" | tr "$ENCRYPT_IN" "$ENCRYPT_OUT" } decrypt_name() { echo "$1" | tr "$DECRYPT_IN" "$DECRYPT_OUT" } case "$MODE" in -e) # Шифруем содержимое tr "$ENCRYPT_IN" "$ENCRYPT_OUT" < "$FILE" > "$TEMP_FILE" # Генерируем новое имя файла (зашифрованное) NEW_NAME="$(encrypt_name "$FILE")" # Перемещаем временно зашифрованный файл в файл с новым именем mv "$TEMP_FILE" "$NEW_NAME" echo "Файл $FILE зашифрован и переименован в $NEW_NAME" ;; -d) # Дешифруем содержимое tr "$DECRYPT_IN" "$DECRYPT_OUT" < "$FILE" > "$TEMP_FILE" # Генерируем новое имя файла (расшифрованное) NEW_NAME="$(decrypt_name "$FILE")" # Перемещаем временный файл в файл с расшифрованным именем mv "$TEMP_FILE" "$NEW_NAME" echo "Файл $FILE расшифрован и переименован в $NEW_NAME" ;; *) echo "Неверный режим! Используйте -e (encrypt) или -d (decrypt)." rm "$TEMP_FILE" exit 1 ;; esac Как это работает: 1. Скрипт принимает два аргумента: режим шифрования (-e) или дешифрования (-d) и имя файла. При -e буквы сдвигаются на 3 позиции вперёд, при -d — на 3 назад. 2. Содержимое файла обрабатывается командой tr и временно сохраняется в $TEMP_FILE. 3. Генерируется новое имя (тоже шифруется/дешифруется), и $TEMP_FILE переименовывается. 4. Старый файл остаётся, при желании можно его удалить для полной замены. 5. Пример: • Шифрование: ./caesar.sh -e file.txt • Дешифрование: ./caesar.sh -d Dloh.txt Учтите, что шифрование может изменить и расширение (например, .txt).
А как использовать? В терминале писать, как вы в примере написали?
То есть, как обратиться к файлу, который мы хотим зашифровать?
Для того чтобы использовать скрипт, вам нужно выполнить следующие шаги: 1. Сохраните скрипт в файл, например, с именем caesar.sh. 2. Сделайте скрипт исполняемым: ```bash chmod +x caesar.sh ``` 3. Запустите скрипт, передав нужные аргументы: - Для шифрования (ключ -e), например: ```bash ./caesar.sh -e file.txt ``` - Для дешифрования (ключ -d): ```bash ./caesar.sh -d file.txt ```
Кирилл Чернышов, При этом file.txt — это путь к файлу, который нужно зашифровать или дешифровать. Если вы находитесь в той же директории, где лежат скрипт и сам файл, достаточно указать имя файла напрямую. Если же файл или скрипт находятся в другой папке, нужно дописать путь к ним. Например, если скрипт в папке /home/user/scripts, а файл в /home/user/docs, то команды могут выглядеть так: ```bash cd /home/user/scripts chmod +x caesar.sh ./caesar.sh -e ../docs/file.txt ``` После выполнения шифрования появится новый зашифрованный файл (название которого тоже подвергнется шифрованию), а при дешифровании — файл с расшифрованными содержимым и именем.
Кирилл Чернышов, получится ли всё это сделать исполюзуя VSCode?
Злата Искакова, Да.
Улучшенный скрипт шифрования с оптимизацией и расширенным функционалом: ````bash #!/bin/bash # Константы шифрования SHIFT=3 SUPPORTED_CHARS='A-Za-zА-Яа-я' # Функция логирования log_message() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" } # Универсальная функция шифрования/дешифрования process_file() { local input_file="$1" local mode="$2" local output_file="" local transform_shift=$([[ "$mode" == "encrypt" ]] && echo "$SHIFT" || echo "-$SHIFT") # Проверка файла [[ ! -f "$input_file" ]] && { log_message "Ошибка: Файл не найден" exit 1 } # Определение выходного файла if [[ "$mode" == "encrypt" ]]; then output_file="${input_file}.encrypted" else output_file="${input_file%.encrypted}" fi # Основной алгоритм шифрования while IFS= read -r line || [[ -n "$line" ]]; do transformed_line="" for (( i=0; i<${#line}; i++ )); do char="${line:$i:1}" # Проверка на поддерживаемый символ [[ ! "$char" =~ [$SUPPORTED_CHARS] ]] && { transformed_line+="$char" continue } # Определение базы алфавита case "$char" in [A-Z]) base=65; alphabet_size=26 ;; [a-z]) base=97; alphabet_size=26 ;; [А-Я]) base=1040; alphabet_size=32 ;; [а-я]) base=1072; alphabet_size=32 ;; esac # Шифрование/дешифрование transformed_char=$(( ($(printf '%d' "'$char") - base + transform_shift + alphabet_size) % alphabet_size + base )) transformed_line+=$(printf "\\$(printf '%03o' "$transformed_char")") done echo "$transformed_line" done < "$input_file" > "$output_file" log_message "Файл обработан: $output_file" } # Главная функция main() { # Проверка аргументов [[ $# -ne 2 ]] && { echo "Использование: $0 [-e|-d] <файл>" exit 1 } case "$1" in -e) process_file "$2" "encrypt" ;; -d) process_file "$2" "decrypt" ;; *) echo "Неверный режим. Используйте -e/-d" exit 1 ;; esac } # Запуск основной функции main "$@" ```` Ключевые улучшения: 1. Оптимизация кода 2. Добавлено логирование 3. Универсальная функция обработки 4. Поддержка кириллицы и латиницы 5. Улучшенная обработка ошибок 6. Компактность и читаемость Примеры использования: - `./script.sh -e text.txt` - `./script.sh -d text.txt.encrypted` Особенности: - Шифр Цезаря с фиксированным сдвигом - Сохранение регистра - Поддержка многоязычного текста - Минимальные системные требования Рекомендация: Для реальной криптографической защиты используйте профессиональные алгоритмы шифрования.
да, похоже на правду
 #!/bin/bash 
 
# Function to display usage instructions 
usage() { 
    echo "Usage: $0 -e|-d <file>" 
    echo "  -e    Encrypt the file using Caesar cipher" 
    echo "  -d    Decrypt the file using Caesar cipher" 
    exit 1 
} 
 
# Caesar cipher function 
caesar_cipher() { 
    local input_file=$1 
    local output_file=$2 
    local shift=$3 
 
    # Perform Caesar cipher transformation 
    tr 'A-Za-z' "$(echo {A..Z} {a..z} | sed "s/.\{26\}/&\n/" | tail -n 1 | tr -d ' ')" \ 
       < "$input_file" > "$output_file" 
} 
 
# Check if sufficient arguments are provided 
if [[ $# -ne 2 ]]; then 
    usage 
fi 
 
# Parse command-line arguments 
operation="" 
file="" 
while getopts "ed" opt; do 
    case $opt in 
        e) operation="encrypt"; shift=3 ;; 
        d) operation="decrypt"; shift=-3 ;; 
        *) usage ;; 
    esac 
done 
file=${@:$OPTIND:1} 
 
# Ensure the file exists 
if [[ ! -f $file ]]; then 
    echo "Error: File '$file' not found!" 
    exit 1 
fi 
 
# Generate the output file name 
output_file="${file%.*}_$( [ "$operation" == "encrypt" ] && echo "encrypted" || echo "decrypted").${file##*.}" 
 
# Perform the operation 
caesar_cipher "$file" "$output_file" "$shift" 
 
# Notify the user of the result 
echo "$operation completed. Output file: $output_file"  
 #!/bin/bash 
shift=3 
 
encrypt() { 
    tr 'A-Za-z' 'D-ZA-Cd-za-c' < "$1" > "${1}.enc" && rm "$1" 
} 
 
decrypt() { 
    tr 'D-ZA-Cd-za-c' 'A-Za-z' < "${1%.enc}" > "${1%.enc}.dec" && rm "$1" 
} 
 
case "$1" in 
    -e) [ -f "$2" ] && encrypt "$2" ;; 
    -d) [[ "$2" == *.enc ]] && decrypt "$2" ;; 
    *) echo "Использование: ${0##*/} [-e файл] [-d файл.enc]" ;; 
esac