Программа для шифрования и расшифровки текстовых файлов

В мире, насыщенном информацией и коммуникациями, обеспечение безопасности данных становится все более критическим аспектом современных информационных технологий. Шифрование — один из ключевых инструментов, который обеспечивает конфиденциальность и целостность данных при их передаче и хранении. Шифрование текстовых данных является важной задачей в сферах информационной безопасности, защиты личной информации и обеспечения конфиденциальности переписки. В этой статье мы погрузимся в мир разработки программ для шифрования и расшифровки текстовых файлов на любом языке программирования.

Теория

Ниже будут представлены примеры программ на разных языках программирования с использованием разных методов шифрования. Сначала кратко рассмотрим ключевую информацию о них.

XOR-шифрование

XOR (или исключающее ИЛИ) — это операция, которая является одной из основных логических операций в компьютерной науке и криптографии. Операция XOR принимает на вход два бита (0 или 1) и возвращает результат, который также является битом.

Рассмотрим таблицу истинности для операции XOR:

0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0

Из таблицы видно, что XOR возвращает истину (1) только в том случае, если входные биты различны. Если оба бита одинаковы (или оба 0, или оба 1), XOR возвращает ложь (0).

Операция XOR имеет множество применений, включая:

  • Простое шифрование. XOR может использоваться для шифрования и дешифрования данных. Для этого данные шифруются путем применения XOR к каждому биту сообщения с соответствующим битом ключа. Для расшифровки того же сообщения снова применяется XOR с тем же ключом.
  • Генерация случайных чисел. XOR может использоваться для создания псевдослучайных последовательностей, которые могут быть использованы в криптографии и других приложениях.
  • Проверка на четность. XOR может использоваться для проверки четности битовых последовательностей.
  • Контроль ошибок. XOR может использоваться для обнаружения ошибок в данных, например, при передаче данных по сети.

Рассмотрим пример:

100 XOR 101 = 001

Таким образом шифруется значение методом XOR. Одно значение может быть использовано в качестве ключа, а другое значение может быть использовано в качестве слова до шифрования или какой-то любой другой информации для шифрования.

В компьютере любая информация (текст, видео, аудио) представлена как последовательность чисел. Поэтому шифрование справедливо к любой информации. Перед шифрованием информация переводится в двоичную систему или она напрямую является двоичной системой и применяет сам алгоритм. Алгоритму неважно, какие конкретно данные будут шифроваться.

Чтобы расшифровать сообщение, возьмём наши зашифрованное сообщение 001 и применим к нему наш ключ 101. Здесь для расшифровки также применяется операция XOR.

001 XOR 101 = 100

Рассмотрим пример, если ключ некорректный, например 111.

001 XOR 111 = 110

Таким образом сообщение отличается от изначального. То есть зашифрованное сообщение осталось непрочитанное.

AES-шифрование

AES (Advanced Encryption Standard) — это один из самых распространенных и надежных алгоритмов шифрования, который широко используется в веб-браузерах, мессенджерах и многих других приложениях.

AES является симметричным блочным шифром, что означает, что он принимает сообщение длиной 128 бит и шифрует его в сообщение длиной 128 бит с использованием определенного ключа. Ключ может быть длиной 128, 192 или 256 бит, и это обеспечивает разные уровни безопасности. Для 128-битного ключа выполняется 10 раундов шифрования, для 192-битного — 12 раундов, а для 256-битного — 14 раундов.

Операции, выполняемые внутри AES, происходят на 4×4 сетке байтов. Это означает, что 128-битное сообщение разбивается на 16 байтов, которые организованы в виде 4×4 сетки.

Процесс шифрования AES включает в себя несколько основных шагов:

  • Замена байтов. В этом шаге каждый байт заменяется на другой байт с использованием таблицы замены. Это делается для добавления нелинейности в алгоритм.
  • Сдвиг строк. Байты в каждой строке сдвигаются на определенное количество позиций влево. Это перемешивает данные внутри каждой строки.
  • Смешивание столбцов. В этом шаге данные в каждом столбце перемешиваются путем матричного умножения. Это дополнительно усложняет структуру данных.
  • Добавление раундового ключа. К текущему состоянию данных добавляется раундовый ключ. Этот ключ проходит через процедуру расширения ключа, чтобы создать ключи для каждого раунда.

Эти шаги повторяются заданное количество раз в зависимости от длины ключа. После завершения всех раундов получается зашифрованный текст.

Одной из важных особенностей AES является его непроницаемость к различным атакам, таким как атаки времени выполнения и атаки по каналу. Это делает AES одним из наиболее надежных алгоритмов шифрования, который широко используется в современных приложениях и системах безопасности.

Шифр Цезаря

Шифр Цезаря (или шифр сдвига) — это один из самых простых видов шифрования, который был использован в древние времена для защиты информации.

Для его работы нужен исходный алфавит, на котором написан текст, и алфавит для шифротекста.

Если выполнить сдвиг, каждая буква алфавита шифротекста переместится влево. Это означает, что сейчас «а» будет шифроваться как «б», «б» как «в», «в» как «г» и так далее.

Рассмотрим пример, в котором наш открытый текст:

Это шифр Цезаря

Первая буква — Э. В русском алфавите после нее идет Ю. Значит при шифровании Э будет шифроваться как Ю. И так далее. Таким образом получим текст:

Юуп щйхс Чёибса

Мы можем продолжать выполнять сдвиги алфавита шифротекста влево, и мы можем сделать сдвиг на любое количество позиций от 1 до количества букв в алфавите.

Для дешифровки вы должны ввести ваш шифротекст, определить, какой сдвиг был использован, а затем выполнить обратное действие. Для дешифровки мы двигаемся в обратном направлении.

Например, перед Ю в русском алфавите идет буква Э, значит при расшифровке буква Ю будет расшифровываться как Э.

C++

Пример простой программы на C++, которая шифрует и расшифровывает текстовые файлы с использованием метода XOR.

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

// Функция для шифрования/расшифровки текста с использованием XOR
string xorEncryptDecrypt(const string& input, const string& key) {
    string result = input;
    for (size_t i = 0; i < input.length(); ++i) {
        result[i] = input[i] ^ key[i % key.length()];
    }
    return result;
}

int main() {
    string inputFileName = "input.txt";
    string outputFileName = "output.txt";
    string key = "mysecretkey"; // Замените ключ на свой секретный ключ

    // Открываем файл для чтения
    ifstream inputFile(inputFileName);
    if (!inputFile.is_open()) {
        cerr << "Не удалось открыть файл " << inputFileName << endl;
        return 1;
    }

    // Читаем содержимое файла
    string plaintext((istreambuf_iterator<char>(inputFile)), (istreambuf_iterator<char>()));
    inputFile.close();

    // Шифруем текст
    string encryptedText = xorEncryptDecrypt(plaintext, key);

    // Открываем файл для записи
    ofstream outputFile(outputFileName);
    if (!outputFile.is_open()) {
        cerr << "Не удалось создать файл " << outputFileName << endl;
        return 1;
    }

    // Записываем зашифрованный текст в файл
    outputFile << encryptedText;
    outputFile.close();

    cout << "Текст успешно зашифрован и записан в файл " << outputFileName << endl;

    // Расшифровываем текст (просто для демонстрации)
    string decryptedText = xorEncryptDecrypt(encryptedText, key);

    cout << "Расшифрованный текст: " << decryptedText << endl;

    return 0;
}

Обратите внимание, что это простой пример, и XOR-шифрование не является безопасным методом шифрования для реальных приложений.

C#

Пример простой программы на C#, которая шифрует и расшифровывает текстовые файлы с использованием алгоритма AES (Advanced Encryption Standard). Для выполнения этой программы, вам понадобится добавить ссылку на библиотеку System.Security.Cryptography.

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

class Program
{
    static void Main()
    {
        string inputFileName = "input.txt";
        string encryptedFileName = "encrypted.txt";
        string decryptedFileName = "decrypted.txt";
        string key = "MySecretKey12345"; // Замените ключ на свой секретный ключ
        string iv = "InitializationVector"; // Замените вектор инициализации на свой

        // Шифрование файла
        EncryptFile(inputFileName, encryptedFileName, key, iv);
        Console.WriteLine($"Файл {inputFileName} успешно зашифрован и сохранен в {encryptedFileName}");

        // Расшифрование файла
        DecryptFile(encryptedFileName, decryptedFileName, key, iv);
        Console.WriteLine($"Файл {encryptedFileName} успешно расшифрован и сохранен в {decryptedFileName}");
    }

    // Функция для шифрования файла с использованием AES
    static void EncryptFile(string inputFile, string outputFile, string key, string iv)
    {
        using (Aes aesAlg = Aes.Create())
        {
            aesAlg.Key = Encoding.UTF8.GetBytes(key);
            aesAlg.IV = Encoding.UTF8.GetBytes(iv);

            ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

            using (FileStream inputFileStream = new FileStream(inputFile, FileMode.Open))
            {
                using (FileStream outputFileStream = new FileStream(outputFile, FileMode.Create))
                {
                    using (CryptoStream cryptoStream = new CryptoStream(outputFileStream, encryptor, CryptoStreamMode.Write))
                    {
                        inputFileStream.CopyTo(cryptoStream);
                    }
                }
            }
        }
    }

    // Функция для расшифрования файла с использованием AES
    static void DecryptFile(string inputFile, string outputFile, string key, string iv)
    {
        using (Aes aesAlg = Aes.Create())
        {
            aesAlg.Key = Encoding.UTF8.GetBytes(key);
            aesAlg.IV = Encoding.UTF8.GetBytes(iv);

            ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);

            using (FileStream inputFileStream = new FileStream(inputFile, FileMode.Open))
            {
                using (FileStream outputFileStream = new FileStream(outputFile, FileMode.Create))
                {
                    using (CryptoStream cryptoStream = new CryptoStream(inputFileStream, decryptor, CryptoStreamMode.Read))
                    {
                        cryptoStream.CopyTo(outputFileStream);
                    }
                }
            }
        }
    }
}

Замените MySecretKey12345 и InitializationVector на свои ключ и вектор инициализации.

Python

Пример простой программы на Python, которая шифрует и расшифровывает текстовые файлы с использованием библиотеки cryptography. Прежде чем начать, убедитесь, что у вас установлена эта библиотека. Вы можете установить её с помощью pip:

pip install cryptography

Основной код программы:

from cryptography.fernet import Fernet

# Генерация ключа
def generate_key():
    return Fernet.generate_key()

# Запись ключа в файл
def save_key(key, key_file):
    with open(key_file, 'wb') as f:
        f.write(key)

# Загрузка ключа из файла
def load_key(key_file):
    with open(key_file, 'rb') as f:
        return f.read()

# Шифрование текста
def encrypt_text(text, key):
    cipher_suite = Fernet(key)
    encrypted_text = cipher_suite.encrypt(text.encode())
    return encrypted_text

# Расшифровка текста
def decrypt_text(encrypted_text, key):
    cipher_suite = Fernet(key)
    decrypted_text = cipher_suite.decrypt(encrypted_text).decode()
    return decrypted_text

# Основная функция
def main():
    key_file = 'secret.key'
    input_file = 'input.txt'
    encrypted_file = 'encrypted.txt'
    decrypted_file = 'decrypted.txt'

    # Генерация и сохранение ключа
    key = generate_key()
    save_key(key, key_file)
    print(f"Сгенерирован и сохранен ключ в файл {key_file}")

    # Чтение текста из файла
    with open(input_file, 'r') as f:
        text = f.read()

    # Шифрование текста и запись в файл
    encrypted_text = encrypt_text(text, key)
    with open(encrypted_file, 'wb') as f:
        f.write(encrypted_text)
    print(f"Текст успешно зашифрован и записан в файл {encrypted_file}")

    # Расшифровка текста и запись в файл
    decrypted_text = decrypt_text(encrypted_text, key)
    with open(decrypted_file, 'w') as f:
        f.write(decrypted_text)
    print(f"Расшифрованный текст успешно записан в файл {decrypted_file}")

if __name__ == "__main__":
    main()

Обратите внимание, что это простой пример для демонстрации основных шагов шифрования и расшифровки текстовых файлов. В реальных приложениях обязательно следует уделять больше внимания безопасности ключей и выбору алгоритма шифрования в зависимости от вашего контекста использования.

Java

Пример простой программы на Java, которая шифрует и расшифровывает текстовые файлы с использованием алгоритма AES (Advanced Encryption Standard).

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.security.spec.AlgorithmParameterSpec;

public class FileEncryptionExample {

    public static void main(String[] args) {
        String inputFileName = "input.txt";
        String encryptedFileName = "encrypted.txt";
        String decryptedFileName = "decrypted.txt";
        String key = "MySecretKey12345"; // Замените ключ на свой секретный ключ
        String iv = "InitializationVector"; // Замените вектор инициализации на свой

        try {
            // Шифрование файла
            encryptFile(inputFileName, encryptedFileName, key, iv);
            System.out.println("Файл " + inputFileName + " успешно зашифрован и сохранен в " + encryptedFileName);

            // Расшифрование файла
            decryptFile(encryptedFileName, decryptedFileName, key, iv);
            System.out.println("Файл " + encryptedFileName + " успешно расшифрован и сохранен в " + decryptedFileName);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // Функция для шифрования файла
    public static void encryptFile(String inputFile, String outputFile, String key, String iv) throws Exception {
        Key secretKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES");
        AlgorithmParameterSpec ivSpec = new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8));
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec);

        try (FileInputStream inputStream = new FileInputStream(inputFile);
             FileOutputStream outputStream = new FileOutputStream(outputFile)) {
            byte[] buffer = new byte[4096];
            int bytesRead;
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                byte[] encryptedBytes = cipher.update(buffer, 0, bytesRead);
                if (encryptedBytes != null) {
                    outputStream.write(encryptedBytes);
                }
            }
            byte[] finalEncryptedBytes = cipher.doFinal();
            if (finalEncryptedBytes != null) {
                outputStream.write(finalEncryptedBytes);
            }
        }
    }

    // Функция для расшифровки файла
    public static void decryptFile(String inputFile, String outputFile, String key, String iv) throws Exception {
        Key secretKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES");
        AlgorithmParameterSpec ivSpec = new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8));
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec);

        try (FileInputStream inputStream = new FileInputStream(inputFile);
             FileOutputStream outputStream = new FileOutputStream(outputFile)) {
            byte[] buffer = new byte[4096];
            int bytesRead;
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                byte[] decryptedBytes = cipher.update(buffer, 0, bytesRead);
                if (decryptedBytes != null) {
                    outputStream.write(decryptedBytes);
                }
            }
            byte[] finalDecryptedBytes = cipher.doFinal();
            if (finalDecryptedBytes != null) {
                outputStream.write(finalDecryptedBytes);
            }
        }
    }
}

Убедитесь, что у вас есть JCE на вашей Java-платформе и что вы заменили MySecretKey12345 и InitializationVector на свои ключ и вектор инициализации.

Pascal

Пример простой программы на Pascal (с использованием синтаксиса Free Pascal), которая шифрует и расшифровывает текстовые файлы с использованием шифра Цезаря:

program FileEncryptionExample;

uses
  SysUtils;

// Функция для шифрования текста с использованием алгоритма шифра Цезаря
function EncryptText(text: string; shift: Integer): string;
var
  i: Integer;
begin
  for i := 1 to Length(text) do
  begin
    if (text[i] >= 'A') and (text[i] <= 'Z') then
      text[i] := Chr(((Ord(text[i]) - Ord('A') + shift) mod 26) + Ord('A'))
    else if (text[i] >= 'a') and (text[i] <= 'z') then
      text[i] := Chr(((Ord(text[i]) - Ord('a') + shift) mod 26) + Ord('a'));
  end;
  Result := text;
end;

// Функция для расшифровки текста с использованием алгоритма шифра Цезаря
function DecryptText(text: string; shift: Integer): string;
begin
  Result := EncryptText(text, 26 - shift); // Дешифрование - это шифрование с обратным сдвигом
end;

// Процедура для шифрования файла
procedure EncryptFile(inputFileName, outputFileName: string; shift: Integer);
var
  inputFile, outputFile: TextFile;
  inputText, encryptedText: string;
begin
  AssignFile(inputFile, inputFileName);
  AssignFile(outputFile, outputFileName);
  
  Reset(inputFile);
  Rewrite(outputFile);
  
  while not Eof(inputFile) do
  begin
    ReadLn(inputFile, inputText);
    encryptedText := EncryptText(inputText, shift);
    WriteLn(outputFile, encryptedText);
  end;
  
  CloseFile(inputFile);
  CloseFile(outputFile);
end;

// Процедура для расшифровки файла
procedure DecryptFile(inputFileName, outputFileName: string; shift: Integer);
var
  inputFile, outputFile: TextFile;
  inputText, decryptedText: string;
begin
  AssignFile(inputFile, inputFileName);
  AssignFile(outputFile, outputFileName);
  
  Reset(inputFile);
  Rewrite(outputFile);
  
  while not Eof(inputFile) do
  begin
    ReadLn(inputFile, inputText);
    decryptedText := DecryptText(inputText, shift);
    WriteLn(outputFile, decryptedText);
  end;
  
  CloseFile(inputFile);
  CloseFile(outputFile);
end;

var
  inputFileName, encryptedFileName, decryptedFileName: string;
  shift: Integer;
begin
  inputFileName := 'input.txt';
  encryptedFileName := 'encrypted.txt';
  decryptedFileName := 'decrypted.txt';
  shift := 3; // Замените сдвиг на свой
  
  // Шифрование файла
  EncryptFile(inputFileName, encryptedFileName, shift);
  WriteLn('Файл ', inputFileName, ' успешно зашифрован и сохранен в ', encryptedFileName);
  
  // Расшифрование файла
  DecryptFile(encryptedFileName, decryptedFileName, shift);
  WriteLn('Файл ', encryptedFileName, ' успешно расшифрован и сохранен в ', decryptedFileName);
end.

Вы можете заменить input.txt, encrypted.txt, decrypted.txt и shift на соответствующие значения ваших файлов и параметров шифрования.

JavaScript (Node.js)

JavaScript является языком программирования для веб-разработки, и он не имеет встроенных библиотек для работы с файлами, как это делается на сервере. Поэтому программу для шифрования и расшифровки текстовых файлов можно написать с использованием Node.js, который предоставляет средства для работы с файлами.

Установите библиотеку crypto-js с помощью npm (Node.js package manager):

npm install crypto-js

Создайте JavaScript файл, например, file-encryption.js, и используйте следующий код:

const fs = require('fs');
const CryptoJS = require('crypto-js');

// Функция для шифрования текста
function encryptText(text, key) {
    const encryptedText = CryptoJS.AES.encrypt(text, key).toString();
    return encryptedText;
}

// Функция для расшифровки текста
function decryptText(encryptedText, key) {
    const decryptedText = CryptoJS.AES.decrypt(encryptedText, key).toString(CryptoJS.enc.Utf8);
    return decryptedText;
}

// Чтение ключа из файла (в реальных приложениях следует обращать больше внимания к безопасности ключей)
const key = fs.readFileSync('key.txt', 'utf8').trim();

// Чтение исходного текста из файла
const inputText = fs.readFileSync('input.txt', 'utf8');

// Шифрование текста
const encryptedText = encryptText(inputText, key);
fs.writeFileSync('encrypted.txt', encryptedText);
console.log('Текст успешно зашифрован и записан в файл encrypted.txt');

// Расшифровка текста
const decryptedText = decryptText(encryptedText, key);
fs.writeFileSync('decrypted.txt', decryptedText);
console.log('Расшифрованный текст успешно записан в файл decrypted.txt');

Обратите внимание, что этот пример использует crypto-js для AES-шифрования и требует наличие файла key.txt с секретным ключом, а также файлов input.txt, encrypted.txt и decrypted.txt для ввода, вывода и расшифровки данных соответственно.

PHP

Пример простой программы на PHP, которая шифрует и расшифровывает текстовые файлы с использованием алгоритма AES (Advanced Encryption Standard).

<?php
// Функция для шифрования текста
function encryptText($text, $key, $iv) {
    $cipher = "aes-256-cbc";
    $encrypted = openssl_encrypt($text, $cipher, $key, 0, $iv);
    return $encrypted;
}

// Функция для расшифровки текста
function decryptText($encryptedText, $key, $iv) {
    $cipher = "aes-256-cbc";
    $decrypted = openssl_decrypt($encryptedText, $cipher, $key, 0, $iv);
    return $decrypted;
}

// Имя файлов
$inputFileName = "input.txt";
$encryptedFileName = "encrypted.txt";
$decryptedFileName = "decrypted.txt";
$key = "MySecretKey12345"; // Замените ключ на свой секретный ключ
$iv = "InitializationVector"; // Замените вектор инициализации на свой

// Шифрование файла
$inputText = file_get_contents($inputFileName);
$encryptedText = encryptText($inputText, $key, $iv);
file_put_contents($encryptedFileName, $encryptedText);
echo "Файл $inputFileName успешно зашифрован и сохранен в $encryptedFileName\n";

// Расшифрование файла
$encryptedText = file_get_contents($encryptedFileName);
$decryptedText = decryptText($encryptedText, $key, $iv);
file_put_contents($decryptedFileName, $decryptedText);
echo "Файл $encryptedFileName успешно расшифрован и сохранен в $decryptedFileName\n";
?>

Обратите внимание, что этот пример использует crypto-js для AES-шифрования и требует наличие файла key.txt с секретным ключом, а также файлов input.txt, encrypted.txt и decrypted.txt для ввода, вывода и расшифровки данных соответственно.

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...
Давайте поможем друг другу! Если вы нашли ошибку или хотите предложить лучшее решение, пожалуйста, напишите об этом в комментариях.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *