[swift] Swift에서의 비대칭키 암호화 방법

비대칭키 암호화는 암호화된 데이터를 복호화하기 위해 공개키와 개인키라는 두 가지 키를 사용하는 암호화 방식입니다. iOS 애플리케이션을 개발하는 동안 비대칭키 암호화를 구현하는 방법에 대해 알아보겠습니다.

1. 공개키와 개인키 생성하기

비대칭키 암호화를 시작하려면 먼저 공개키와 개인키를 생성해야 합니다. Swift에서는 Security 프레임워크를 사용하여 키 쌍을 생성할 수 있습니다. 다음은 공개키와 개인키를 생성하는 코드입니다.

import Security

func generateKeyPair() throws {
    let privateKeyParams: [String: Any] = [
        kSecAttrKeyType as String: kSecAttrKeyTypeRSA,
        kSecAttrKeySizeInBits as String: 2048
    ]
    
    let publicKeyParams: [String: Any] = [
        kSecAttrKeyType as String: kSecAttrKeyTypeRSA,
        kSecAttrKeySizeInBits as String: 2048,
        kSecAttrIsPermanent as String: true
    ]
    
    var publicKey, privateKey: SecKey?
    
    // 공개키와 개인키 생성
    let status = SecKeyGeneratePair(privateKeyParams as CFDictionary, &publicKey, &privateKey)
    
    if status != errSecSuccess {
        throw KeyPairError.keyGenerationFailed
    }
}

위의 예제에서는 2048비트 RSA 키를 생성하고, 생성한 키는 publicKeyprivateKey 변수에 저장됩니다.

2. 데이터 암호화하기

공개키와 개인키를 생성한 후, 암호화하고자 하는 데이터를 공개키로 암호화할 수 있습니다. 다음은 데이터를 암호화하는 코드입니다.

import Security

func encrypt(data: Data, publicKey: SecKey) throws -> Data {
    let blockSize = SecKeyGetBlockSize(publicKey)
    
    var encryptedData = Data(count: blockSize)
    
    let status = SecKeyEncrypt(publicKey, .PKCS1, data.bytes, data.count, encryptedData.mutableBytes.assumingMemoryBound(to: UInt8.self), &blockSize)
    
    if status != errSecSuccess {
        throw EncryptionError.encryptionFailed
    }
    
    encryptedData.count = blockSize
    
    return encryptedData
}

위의 예제에서는 SecKeyEncrypt 함수를 사용하여 데이터를 암호화합니다. 암호화된 데이터는 encryptedData 변수에 저장됩니다.

3. 데이터 복호화하기

암호화된 데이터를 복호화하기 위해서는 개인키를 사용해야 합니다. 다음은 데이터를 복호화하는 코드입니다.

import Security

func decrypt(encryptedData: Data, privateKey: SecKey) throws -> Data {
    let blockSize = SecKeyGetBlockSize(privateKey)
    
    var decryptedData = Data(count: blockSize)
    
    let status = SecKeyDecrypt(privateKey, .PKCS1, encryptedData.bytes, blockSize, decryptedData.mutableBytes.assumingMemoryBound(to: UInt8.self), &blockSize)
    
    if status != errSecSuccess {
        throw EncryptionError.decryptionFailed
    }
    
    decryptedData.count = blockSize
    
    return decryptedData
}

위의 예제에서는 SecKeyDecrypt 함수를 사용하여 암호화된 데이터를 복호화합니다. 복호화된 데이터는 decryptedData 변수에 저장됩니다.

결론

Swift에서 비대칭키 암호화를 구현하는 방법에 대해 알아보았습니다. 공개키와 개인키를 생성하고 데이터를 암호화하고 복호화하는 과정을 간단한 코드로 예시하였습니다. Swift 애플리케이션에서 암호화된 데이터를 안전하게 전송하거나 저장해야 하는 경우, 비대칭키 암호화는 유용한 도구가 될 수 있습니다.

참고자료