[swift] CryptoSwift를 사용한 파일 암호화 및 복호화 방법

이번 기술 블로그에서는 Swift에서 파일을 암호화하고 복호화하는 방법을 알아보겠습니다. 이를 위해 CryptoSwift라는 오픈 소스 암호화 라이브러리를 사용할 것입니다.

1. CryptoSwift 라이브러리 설치하기

CryptoSwift를 사용하기 위해서는 먼저 해당 라이브러리를 프로젝트에 설치해야 합니다. Cocoapods를 사용하는 경우, Podfile에 다음과 같이 추가합니다.

pod 'CryptoSwift'

그리고 터미널에서 pod install을 실행하여 라이브러리를 설치합니다.

2. 파일 암호화하기

다음은 CryptoSwift를 사용하여 파일을 암호화하는 방법입니다.

import CryptoSwift

func encryptFile(filePath: String, key: String) throws {
    guard let inputData = NSData(contentsOfFile: filePath) as Data? else {
        throw NSError(domain: "InvalidFile", code: 0, userInfo: nil)
    }
    
    let password: [UInt8] = Array(key.utf8)
    let encryptedData = try AES(key: password, blockMode: .ECB).encrypt(inputData.bytes)
    
    let encryptedURL = URL(fileURLWithPath: filePath).appendingPathExtension("encrypted")
    FileManager.default.createFile(atPath: encryptedURL.path, contents: Data(_: encryptedData))

    print("File encrypted successfully.")
}

위의 코드는 주어진 파일 경로(filePath)에 있는 파일을 읽어와 데이터를 가져옵니다. 사용자가 입력한 키(key)를 바탕으로 AES 알고리즘을 사용하여 데이터를 암호화하고, 새로운 파일(encryptedURL)에 암호화된 데이터를 저장합니다.

3. 파일 복호화하기

이제 암호화된 파일을 복호화하는 방법을 알아보겠습니다.

import CryptoSwift

func decryptFile(encryptedFilePath: String, key: String) throws {
    guard let encryptedData = NSData(contentsOfFile: encryptedFilePath) as Data? else {
        throw NSError(domain: "InvalidFile", code: 0, userInfo: nil)
    }
    
    let password: [UInt8] = Array(key.utf8)
    let decryptedData = try AES(key: password, blockMode: .ECB).decrypt(encryptedData.bytes)
    
    let decryptedURL = URL(fileURLWithPath: encryptedFilePath).deletingPathExtension()
    FileManager.default.createFile(atPath: decryptedURL.path, contents: Data(_: decryptedData))
    
    print("File decrypted successfully.")
}

위의 코드는 암호화된 파일 경로(encryptedFilePath)에 있는 파일을 읽어와 데이터를 가져옵니다. 동일한 키(key)를 사용하여 데이터를 복호화하고, 새로운 파일(decryptedURL)에 복호화된 데이터를 저장합니다.

4. 파일 암호화 및 복호화 호출하기

암호화 및 복호화 기능을 호출하기 위해 다음과 같이 메인 메서드에서 호출할 수 있습니다.

let inputFilePath = "path/to/input/file.txt"
let key = "mySecretKey"

do {
    try encryptFile(filePath: inputFilePath, key: key)
} catch {
    print("Failed to encrypt file:", error.localizedDescription)
}

let encryptedFilePath = "path/to/input/file.txt.encrypted"

do {
    try decryptFile(encryptedFilePath: encryptedFilePath, key: key)
} catch {
    print("Failed to decrypt file:", error.localizedDescription)
}

위의 코드는 입력 파일 경로(inputFilePath)와 암호화 키(key)를 정의한 후 encryptFile 함수를 호출하여 파일을 암호화합니다. 이어서 암호화된 파일(encryptedFilePath)을 인자로하여 decryptFile 함수를 호출하여 파일을 복호화합니다.

CryptoSwift를 사용하여 파일을 암호화하고 복호화하는 방법을 알아보았습니다. 이를 통해 파일을 안전하게 보호할 수 있습니다.

참고 자료: