Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

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

Злата Искакова Ученик (193), открыт 5 часов назад
Создайте скрипт на языке bash, который будет шифровать и дешифровать файлы с использованием простого алгоритма шифрования (например, шифр Цезаря), меняя название файла и его содержимое. Скрипт должен принимать аргументы -e для шифрования и -d для дешифрования, а также файл для обработки.
3 ответа
Кирилл Чернышов Мыслитель (6061) 5 часов назад
#!/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).
Злата ИскаковаУченик (193) 5 часов назад
А как использовать?
В терминале писать, как вы в примере написали?
Злата ИскаковаУченик (193) 5 часов назад
То есть, как обратиться к файлу, который мы хотим зашифровать?
Кирилл ЧернышовМыслитель (6061) 4 часа назад
Для того чтобы использовать скрипт, вам нужно выполнить следующие шаги:

1. Сохраните скрипт в файл, например, с именем caesar.sh.
2. Сделайте скрипт исполняемым:
```bash
chmod +x caesar.sh
```
3. Запустите скрипт, передав нужные аргументы:
- Для шифрования (ключ -e), например:
```bash
./caesar.sh -e file.txt
```
- Для дешифрования (ключ -d):
```bash
./caesar.sh -d file.txt
```
Кирилл Чернышов Мыслитель (6061) Кирилл Чернышов, При этом file.txt — это путь к файлу, который нужно зашифровать или дешифровать. Если вы находитесь в той же директории, где лежат скрипт и сам файл, достаточно указать имя файла напрямую. Если же файл или скрипт находятся в другой папке, нужно дописать путь к ним. Например, если скрипт в папке /home/user/scripts, а файл в /home/user/docs, то команды могут выглядеть так: ```bash cd /home/user/scripts chmod +x caesar.sh ./caesar.sh -e ../docs/file.txt ``` После выполнения шифрования появится новый зашифрованный файл (название которого тоже подвергнется шифрованию), а при дешифровании — файл с расшифрованными содержимым и именем.
Chat Gpt Гуру (3633) 4 часа назад
Улучшенный скрипт шифрования с оптимизацией и расширенным функционалом:

````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`

Особенности:
- Шифр Цезаря с фиксированным сдвигом
- Сохранение регистра
- Поддержка многоязычного текста
- Минимальные системные требования

Рекомендация: Для реальной криптографической защиты используйте профессиональные алгоритмы шифрования.
Похожие вопросы