Как выполнить шифрование файлов с помощью Flutter и Dart

Не знаю, правильно ли задавать здесь свой вопрос. Мне просто нужно сделать технико-экономическое обоснование для приложения, которое я пытаюсь создать. Я выбрал Flutter, потому что позволяю быстро создавать мобильные приложения.

Мое приложение будет хранить голосовые сообщения в виде аудиофайлов. Это может быть mp3 или аудиоформат.

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

Мне нужно знать, можно ли зашифровать файлы с помощью Dart в моем приложении Flutter. Если есть возможность, хотелось бы получить полезные ресурсы.

Я пытался найти эту тему, но могу найти только статьи о шифровании строковых или текстовых файлов.

2 ответа

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

import 'dart:io';
import 'package:aes_crypt/aes_crypt.dart';

class EncryptData {
  static String encrypt_file(String path) {
    AesCrypt crypt = AesCrypt();
    crypt.setOverwriteMode(AesCryptOwMode.on);
    crypt.setPassword('my cool password');
    String encFilepath;
    try {
      encFilepath = crypt.encryptFileSync(path);
      print('The encryption has been completed successfully.');
      print('Encrypted file: $encFilepath');
    } catch (e) {
      if (e.type == AesCryptExceptionType.destFileExists) {
        print('The encryption has been completed unsuccessfully.');
        print(e.message);
      }
      else{
        return 'ERROR';
      }
    }
    return encFilepath;
  }

  static String decrypt_file(String path) {
    AesCrypt crypt = AesCrypt();
    crypt.setOverwriteMode(AesCryptOwMode.on);
    crypt.setPassword('my cool password');
    String decFilepath;
    try {
      decFilepath = crypt.decryptFileSync(path);
      print('The decryption has been completed successfully.');
      print('Decrypted file 1: $decFilepath');
      print('File content: ' + File(decFilepath).path);
    } catch (e) {
      if (e.type == AesCryptExceptionType.destFileExists) {
        print('The decryption has been completed unsuccessfully.');
        print(e.message);
      }
      else{
        return 'ERROR';
      }
    }
    return decFilepath;
  }
}


Теперь вы можете использовать это как

encrypted_file_path = EncryptData.encrypt_file('your/file/path');

Я создал класс для простоты использования при шифровании/дешифровании.

      import 'dart:developer';
import 'dart:io';

import 'package:encrypt/encrypt.dart' as encrypt_handle;

class CryptoHelper {
  //instead of plain text convert key,iv to base64 and use .fromBase64 for better security

  Future<void> encrypt(
      {required String inputPath,
      required String outputPath,
      required String key,
      required String iv}) async {
    final encryptionKey = encrypt_handle.Key.fromUtf8(key);
    final encryptionIv = encrypt_handle.IV.fromUtf8(iv);
    final encrypter = encrypt_handle.Encrypter(
        encrypt_handle.AES(encryptionKey, mode: encrypt_handle.AESMode.cbc));

    File inputFile = File(inputPath);
    File outputFile = File(outputPath);

    bool outputFileExists = await outputFile.exists();
    bool inputFileExists = await inputFile.exists();

    if (!outputFileExists) {
      await outputFile.create();
    }

    if (!inputFileExists) {
      throw Exception("Input file not found.");
    }

    log('Start loading file');
    final fileContents = await inputFile.readAsBytes();

    log('Start encrypting file');

    final encryptedData = encrypter.encryptBytes(fileContents, iv: encryptionIv);

    log('File Successfully Encrypted!');

    await outputFile.writeAsBytes(encryptedData.bytes);
  }

  Future<void> decrypt(
      {required String inputPath,
      required String outputPath,
      required String key,
      required String iv}) async {
    final encryptionKey = encrypt_handle.Key.fromUtf8(key);
    final encryptionIv = encrypt_handle.IV.fromUtf8(iv);
    final encrypter = encrypt_handle.Encrypter(
        encrypt_handle.AES(encryptionKey, mode: encrypt_handle.AESMode.cbc));

    File inputFile = File(inputPath);
    File outputFile = File(outputPath);

    bool outputFileExists = await outputFile.exists();
    bool inputFileExists = await inputFile.exists();

    if (!outputFileExists) {
      await outputFile.create();
    }

    if (!inputFileExists) {
      throw Exception("Input file not found.");
    }

    log('Start loading file');
    final fileContents = await inputFile.readAsBytes();
    // final decoded = base64.encode(_fileContents);

    log('Start decrypting file');

    final decrypted = encrypter.decryptBytes(encrypt_handle.Encrypted(fileContents), iv: encryptionIv);

    log('File Successfully Decrypted!');

    await outputFile.writeAsBytes(decrypted);
  }
}

Я создал этот репозиторий для полной демонстрации исходного кода. Протестировано только на Mac, но должно работать и на других платформах с минимальными усилиями.

Другие вопросы по тегам