[swift] Swift에서의 메시지 암호화 방법

Swift는 애플의 iOS 및 macOS 애플리케이션 개발을 위한 프로그래밍 언어로 많이 사용됩니다. 메시지 암호화는 중요한 정보를 보호하고 데이터의 보안성을 유지하기 위해 사용되는 중요한 요소입니다. Swift에서는 다양한 방법으로 메시지를 암호화할 수 있습니다.

1. 대칭키 암호화 (Symmetric Encryption)

대칭키 암호화는 데이터를 암호화하고 복호화하는 데 동일한 키를 사용하는 암호화 방법입니다. Swift에서는 CryptoKit 프레임워크를 사용하여 대칭키 암호화를 구현할 수 있습니다. 예를 들어, AES (Advanced Encryption Standard) 알고리즘을 사용하여 메시지를 암호화할 수 있습니다.

import CryptoKit

func encryptMessage(message: String, key: SymmetricKey) -> Data? {
    guard let messageData = message.data(using: .utf8) else {
        return nil
    }
    
    do {
        let sealedBox = try AES.GCM.seal(messageData, using: key)
        return sealedBox.combined
    } catch {
        print("Error encrypting message: \(error)")
        return nil
    }
}

func decryptMessage(encryptedData: Data, key: SymmetricKey) -> String? {
    do {
        let sealedBox = try AES.GCM.SealedBox(combined: encryptedData)
        let decryptedData = try AES.GCM.open(sealedBox, using: key)
        return String(data: decryptedData, encoding: .utf8)
    } catch {
        print("Error decrypting message: \(error)")
        return nil
    }
}

// 사용 예시
let message = "암호화된 메시지"
let key = SymmetricKey(size: .bits128)
if let encryptedData = encryptMessage(message: message, key: key) {
    if let decryptedMessage = decryptMessage(encryptedData: encryptedData, key: key) {
        print("복호화된 메시지: \(decryptedMessage)")
    }
}

2. 비대칭키 암호화 (Asymmetric Encryption)

비대칭키 암호화는 서로 다른 키를 사용하여 데이터를 암호화하고 복호화하는 방법입니다. Swift에서는 Security 프레임워크를 사용하여 비대칭키 암호화를 구현할 수 있습니다. 예를 들어, RSA (Rivest-Shamir-Adleman) 알고리즘을 사용하여 메시지를 암호화할 수 있습니다.

import Security

func encryptMessage(message: String, publicKey: SecKey) -> Data? {
    guard let messageData = message.data(using: .utf8) else {
        return nil
    }
    
    var error: Unmanaged<CFError>?
    guard let encryptedData = SecKeyCreateEncryptedData(publicKey, .rsaEncryptionOAEPSHA512, messageData as CFData, &error) as Data? else {
        print("Error encrypting message: \(error?.takeRetainedValue().localizedDescription ?? "")")
        return nil
    }
    
    return encryptedData
}

func decryptMessage(encryptedData: Data, privateKey: SecKey) -> String? {
    var error: Unmanaged<CFError>?
    guard let decryptedData = SecKeyCreateDecryptedData(privateKey, .rsaEncryptionOAEPSHA512, encryptedData as CFData, &error) as Data? else {
        print("Error decrypting message: \(error?.takeRetainedValue().localizedDescription ?? "")")
        return nil
    }
    
    return String(data: decryptedData, encoding: .utf8)
}

// 사용 예시
let message = "암호화된 메시지"
let publicKey, privateKey: SecKey // 적절한 공개키 및 개인키 획득

if let encryptedData = encryptMessage(message: message, publicKey: publicKey) {
    if let decryptedMessage = decryptMessage(encryptedData: encryptedData, privateKey: privateKey) {
        print("복호화된 메시지: \(decryptedMessage)")
    }
}

3. 해시 함수 (Hash Functions)

해시 함수는 입력 데이터를 고정된 길이의 암호화된 값으로 변환하는 방법입니다. Swift에서는 CryptoKit 프레임워크를 사용하여 해시 함수를 구현할 수 있습니다. 예를 들어, SHA-256 (Secure Hash Algorithm 256-bit)을 사용하여 메시지를 해시할 수 있습니다.

import CryptoKit

func hashMessage(message: String) -> Data {
    let messageData = Data(message.utf8)
    let digest = SHA256.hash(data: messageData)
    return Data(digest)
}

// 사용 예시
let message = "암호화할 메시지"
let hashedData = hashMessage(message: message)
print("해시된 데이터: \(hashedData)")

메시지 암호화는 중요한 데이터를 보호하는 데 아주 중요한 역할을 합니다. Swift에서는 대칭키 암호화, 비대칭키 암호화, 해시 함수를 사용하여 메시지를 암호화할 수 있습니다. 개발자는 애플의 CryptoKit 및 Security 프레임워크를 활용하여 데이터의 보안성을 높이는 강력한 보호 기능을 구현할 수 있습니다.

참고 자료: