Пример работы с шифрованием файлов

Для работы с шифрованием файлов создайте приложение «HHFWFilesEncrypted», в котором используются методы фреймворка:

Имя метода Краткое описание
initWithCredentials (_: host: environment: project: device:) Метод выполняет инициализацию фреймворка.
auth (_: password:) Метод выполняет аутентификацию пользователя по логину и паролю.
getFile (_: fromServerPath: mountName: password: handler:) Метод скачивает файл с сервера мобильной платформы.
putFile (_: toServerPath: mountName: password: handler:) Метод загружает файл на сервер мобильной платформы.
decryptFileToString(_: withPassword:) Метод расшифровывает файл в строку.
decryptFile(_: toFile: withPassword:) Метод расшифровывает файл в новый файл.
decryptFileToData(_: withPassword:) Метод расшифровывает файл в байтовый буфер.

Приложение «HHFWFilesEncrypted» состоит из одного экрана, текстового поля «UITextField», текстового представления «UITextView» и кнопок «UIButton»:

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

Для выполнения примера:

  1. Введите название файла file.txt и ключ шифрования в текстовые поля и нажмите кнопку «Get file».

В результате будет получен указанный файл с сервера мобильной платформы, зашифрованный с указанным ключом:

Файл file.txt будет записан в папку Documents в директории мобильного приложения:

Содержимое файла зашифровано:

  1. Создайте в папке Documents копию файла file.txt и переименуйте его в file1.txt:

  1. Введите название файла file1.txt и ключ шифрования в текстовые поля и нажмите кнопку «Put file».

В результате будет отправлен указанный файл на сервер мобильной платформы:

  1. Введите название файла file.txt и ключ шифрования в текстовые поля и нажмите кнопку «Decrypt to string».

В текстовом представлении отобразится результат расшифровки файла в виде строки:

  1. Введите название файла file1.txt и ключ шифрования в текстовые поля и нажмите кнопку «Decrypt to file»:

В папке Documents в директории мобильного приложения появится файл decriptedFile.txt:

Содержимое файла decriptedFile.txt соответствует расшифрованному содержимому файла file1.txt:

  1. Введите название файла file1.txt и ключ шифрования в текстовые поля и нажмите кнопку «Decrypt to data».

В текстовом представлении отобразится результат расшифровки файла в виде содержания байтового буфера:

Код приложения:

import UIKit
 
class ViewController: UIViewController {
 
    // Объявим переменные для элементов пользовательского интерфейса
    @IBOutlet weak var fileNameTextField: UITextField!
    @IBOutlet weak var passwordTextField: UITextField!
    @IBOutlet weak var resultTextView: UITextView!    
    @IBOutlet weak var getFileButton: UIButton!
    @IBOutlet weak var putFileButton: UIButton!
    @IBOutlet weak var decryptToStringButton: UIButton!
    @IBOutlet weak var decryptToFileButton: UIButton!
    @IBOutlet weak var decryptToDataButton: UIButton!
 
    // Переопределим методы жизненного цикла отображения
    override func viewDidLoad() {
        super.viewDidLoad()        
        self.deactivateButtons()        
        self.initializeFramework()
        self.auth {
            self.activateButtons()
            self.resultTextView.text = "Authentication success"
        }
    }
 
    // Определим методы для обработки событий, инициированных пользователем из пользовательского интерфейса
    @IBAction func viewTapped(_ sender: UITapGestureRecognizer) {
        self.fileNameTextField.resignFirstResponder()
    }    
    @IBAction func getFilePressed(_ sender: UIButton) {
        self.getFile { (jsonResult) in
            self.resultTextView.text = String(format: "%@", jsonResult)
        }
    }    
    @IBAction func putFilePressed(_ sender: UIButton) {
        self.putFile { (jsonResult) in
            self.resultTextView.text = String(format: "%@", jsonResult)
        }
    }    
    @IBAction func decryptToStringPressed(_ sender: UIButton) {
        self.decryptFileToString { (string) in
            self.resultTextView.text = String(format: "%@", string)
        }
    }    
    @IBAction func decryptToFilePressed(_ sender: UIButton) {
        self.decryptFileToFile {
            self.resultTextView.text = String(format: "%@", "Decripted to file")
        }
    }
    @IBAction func decryptToDataPressed(_ sender: UIButton) {
        self.decryptFileToData { data in
            self.resultTextView.text = String(format: "%@", data as NSData)
        }
    }
    
    // Определим метод для инициализации фреймворка
    private func initializeFramework() {
        let apiVersion: String = "v1"
        let host: String = "http://testmasterfmp.fsight.cloud/"
        let environment: String = "viktoriia_test"
        let project: String = "project"
        let device: String = (UIDevice.current.identifierForVendor?.uuidString)!        
        HHFWController.sharedInstance().initWithCredentials(
            apiVersion,
            host: host,
            environment: environment,
            project: project,
            device: device
        )
    }
    
    // Определим метод для аутентификации
    private func auth(completion: @escaping ()->()) {
        let username: String = "test"
        let password: String = "test123"        
        HHFWController.sharedInstance().auth(username, password: password){ (jsonResult) in
            if let jsonDict = jsonResult as? NSDictionary,
                let status = jsonDict["status"] as? String, status == "ok" {
                print("Auth success")
                completion()
            } else {
                print("Auth error")
            }
        }
    }
 
    // Определим метод для получения файла
    private func getFile(completion: @escaping (NSDictionary)->()) {
        guard let fileName: String = self.fileNameTextField.text else { return }
        guard let password: String = self.passwordTextField.text else { return }
        let mountName: String = "nfs4"                
        HHFWController.sharedInstance().getFile(fileName, fromServerPath: fileName, mountName: mountName, password: password) { (jsonResult) in
            if let jsonDict = jsonResult as? NSDictionary,
                let status = jsonDict["status"] as? String, status == "ok" {
                print("Get file success")
                completion(jsonDict)
            } else {
                print("Get file error")
            }
        }
    }
    
    // Определим метод для отправления файла
    private func putFile(completion: @escaping (NSDictionary)->()) {
        guard let fileName: String = self.fileNameTextField.text else { return }
        guard let password: String = self.passwordTextField.text else { return }
        let mountName: String = "nfs4"        
        HHFWController.sharedInstance().putFile(fileName, toServerPath: fileName, mountName: mountName, password: password) { (jsonResult) in
            if let jsonDict = jsonResult as? NSDictionary,
                let status = jsonDict["status"] as? String, status == "ok" {
                print("Put file success")
                completion(jsonDict)
            } else {
                print("Put file error")
            }
        }
    }
    
    // Определим метод для расшифровки файла в строку
    private func decryptFileToString(completion: @escaping (String)->()) {
        guard let fileName: String = self.fileNameTextField.text else { return }
        guard let password: String = self.passwordTextField.text else { return }        
        let string = HHFWController.sharedInstance().decryptFileToString(fileName, withPassword: password) ?? ""
        completion(string)
    }    
    
    // Определим метод для расшифровка файла в новый файл
    private func decryptFileToFile(completion: @escaping ()->()) {
        guard let fileName: String = self.fileNameTextField.text else { return }
        guard let password: String = self.passwordTextField.text else { return }
        let destinationFile: String = "decriptedFile.txt"        
        HHFWController.sharedInstance().decryptFile(fileName, toFile: destinationFile, withPassword: password)
        completion()
    }
    
    // Определим метод для расшифровка файла в байтовый буфер
    private func decryptFileToData(completion: @escaping (Data)->()) {
        guard let fileName: String = self.fileNameTextField.text else { return }
        guard let password: String = self.passwordTextField.text else { return }        
        let data = HHFWController.sharedInstance().decryptFileToData(fileName, withPassword: password)
        completion(data)
    }
 
    // Определим методы для изменения элементов отображения пользовательского интерфейса
    private func deactivateButtons() {
        self.getFileButton.isEnabled = false
        self.putFileButton.isEnabled = false
        self.decryptToStringButton.isEnabled = false
        self.decryptToFileButton.isEnabled = false
        self.decryptToDataButton.isEnabled = false
    }    
    private func activateButtons() {
        self.getFileButton.isEnabled = true
        self.putFileButton.isEnabled = true
        self.decryptToStringButton.isEnabled = true
        self.decryptToFileButton.isEnabled = true
        self.decryptToDataButton.isEnabled = true
    }
}

См. также:

Примеры использования iOS-фреймворка