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

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

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

1. Сохраните скрипт в файл, например, с именем caesar.sh.
2. Сделайте скрипт исполняемым:
```bash
chmod +x caesar.sh
```
3. Запустите скрипт, передав нужные аргументы:
- Для шифрования (ключ -e), например:
```bash
./caesar.sh -e file.txt
```
- Для дешифрования (ключ -d):
```bash
./caesar.sh -d file.txt
```
Кирилл Чернышов Мыслитель (6165) Кирилл Чернышов, При этом 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 Гуру (4894) 1 месяц назад
Улучшенный скрипт шифрования с оптимизацией и расширенным функционалом:

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

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

Рекомендация: Для реальной криптографической защиты используйте профессиональные алгоритмы шифрования.
AlexKurov Мыслитель (9313) 1 месяц назад
 #!/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"
resurce Гуру (4786) 4 недели назад
 #!/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
Похожие вопросы