[swift] Swift CryptoSwift로 비대칭 암호화를 통한 안전한 데이터 전송하기

데이터의 안전한 전송은 모던 애플리케이션 개발에서 중요한 요소입니다. 비대칭 암호화는 이를 가능하게 해주는 강력한 도구 중 하나입니다. Swift에서는 CryptoSwift라는 라이브러리를 사용하여 비대칭 암호화를 구현할 수 있습니다. 이 튜토리얼에서는 Swift CryptoSwift를 사용하여 안전한 데이터 전송을 구현하는 방법에 대해 알아보겠습니다.

1. CryptoSwift 라이브러리 설치

CryptoSwift를 사용하기 위해 먼저 라이브러리를 설치해야 합니다. 이를 위해 Podfile에 다음과 같은 내용을 추가합니다.

pod 'CryptoSwift', '~> 1.4.0'

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

$ pod install

2. 비대칭 암호화 키 생성

비대칭 암호화를 위해서는 암호화 키를 생성해야 합니다. 이때는 공개키와 개인키가 한 쌍으로 생성됩니다. 공개키는 데이터를 암호화할 때 사용되며, 개인키는 암호화된 데이터를 해독할 때 사용됩니다.

CryptoSwift를 사용하여 키를 생성하는 방법은 다음과 같습니다.

import CryptoSwift

func generateKeyPair() -> (privateKey: Data, publicKey: Data)? {
    guard let privateKey = try? RSA.Key.generate(randomKeyBits: 2048).data() else {
        return nil
    }
    
    let publicKey = RSA.Key.publicKey(fromPrivate: privateKey)
    
    return (privateKey: privateKey, publicKey: publicKey)
}

위의 코드를 사용하면 2048 비트의 랜덤한 개인키를 생성하고, 이를 사용하여 공개키를 추출할 수 있습니다.

3. 데이터 암호화 및 복호화

이제 데이터를 암호화하고 복호화하는 방법을 알아보겠습니다. 데이터를 암호화할 때는 공개키를 사용하며, 복호화할 때는 개인키를 사용합니다.

import CryptoSwift

func encryptData(data: Data, publicKey: Data) -> Data? {
    guard let publicKey = try? RSA.Key(data: publicKey) else {
        return nil
    }
    
    guard let encrypted = try? RSA.encrypt(data, publicKey: publicKey) else {
        return nil
    }
    
    return encrypted
}

func decryptData(encryptedData: Data, privateKey: Data) -> Data? {
    guard let privateKey = try? RSA.Key(data: privateKey) else {
        return nil
    }
    
    guard let decrypted = try? RSA.decrypt(encryptedData, privateKey: privateKey) else {
        return nil
    }
    
    return decrypted
}

위의 코드를 사용하여 데이터를 암호화하고 복호화할 수 있습니다. 암호화된 데이터는 Data 형태로 반환됩니다.

4. 예제 코드

이제 비대칭 암호화를 사용하여 안전한 데이터 전송 예제를 살펴보겠습니다.

let originalData = "This is a secret message.".data(using: .utf8)!

// 키 생성
guard let keyPair = generateKeyPair() else {
    print("Failed to generate key pair.")
    return
}

// 데이터 암호화
guard let encryptedData = encryptData(data: originalData, publicKey: keyPair.publicKey) else {
    print("Failed to encrypt data.")
    return
}

// 데이터 복호화
guard let decryptedData = decryptData(encryptedData: encryptedData, privateKey: keyPair.privateKey) else {
    print("Failed to decrypt data.")
    return
}

// 결과 출력
let decryptedString = String(data: decryptedData, encoding: .utf8)
print("Decrypted message: \(decryptedString ?? "")")

위의 예제 코드에서는 “This is a secret message.”라는 문자열을 데이터로 사용하고, 해당 데이터를 암호화한 뒤 다시 복호화하여 원래의 메시지를 출력합니다.

결론

이렇게 Swift CryptoSwift를 사용하여 비대칭 암호화를 구현하여 데이터의 안전한 전송을 수행할 수 있습니다. 자세한 문서와 예제 코드는 CryptoSwift의 공식 GitHub 저장소를 참조하시기 바랍니다.