Top.Mail.Ru
Ответы

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

Создайте скрипт на языке bash, который будет шифровать и дешифровать файлы с использованием простого алгоритма шифрования (например, шифр Цезаря), меняя название файла и его содержимое. Скрипт должен принимать аргументы -e для шифрования и -d для дешифрования, а также файл для обработки.

По дате
По рейтингу
Аватар пользователя
Мыслитель
5мес
12345678910111213141516
 #!/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 
Аватар пользователя
Мудрец
5мес
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
 #!/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"  
Аватар пользователя
Просветленный
5мес

да, похоже на правду

Аватар пользователя
Мыслитель
5мес

Улучшенный скрипт шифрования с оптимизацией и расширенным функционалом:

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

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

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

Аватар пользователя
Мыслитель
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).