[swift] Swift에서의 암호화 해독 방법

Swift는 암호화와 해독을 위한 다양한 기능과 라이브러리를 제공합니다. 이 기능들을 활용하여 데이터의 보안성을 향상시킬 수 있습니다. 이번 블로그 포스트에서는 Swift에서 어떻게 암호화와 해독을 수행할 수 있는지 알아보도록 하겠습니다.

1. 대칭키 암호화

대칭키 암호화는 암호화와 해독에 동일한 키를 사용하는 방식입니다. Swift에서 대칭키 암호화를 수행하는 가장 일반적인 방법은 CommonCrypto 라이브러리를 사용하는 것입니다. 아래의 예제는 CommonCrypto를 사용하여 대칭키 암호화를 수행하는 코드입니다.

import CommonCrypto

func encrypt(data: Data, key: Data) throws -> Data {
    let bufferSize: Int = data.count + kCCBlockSizeAES128
    var buffer = Array<UInt8>(repeating: 0, count: bufferSize)
    var bytesEncrypted = 0
    
    let cryptStatus = key.withUnsafeBytes { keyBytes in
        data.withUnsafeBytes { dataBytes in
            CCCrypt(CCOperation(kCCEncrypt),
                    CCAlgorithm(kCCAlgorithmAES),
                    CCOptions(kCCOptionPKCS7Padding),
                    keyBytes.baseAddress, key.count,
                    nil,
                    dataBytes.baseAddress, data.count,
                    &buffer, bufferSize,
                    &bytesEncrypted)
        }
    }
    
    guard cryptStatus == kCCSuccess else {
        throw CryptoError.encryptionFailed
    }
    
    return Data(bytes: buffer, count: bytesEncrypted)
}

func decrypt(data: Data, key: Data) throws -> Data {
    let bufferSize: Int = data.count + kCCBlockSizeAES128
    var buffer = Array<UInt8>(repeating: 0, count: bufferSize)
    var bytesDecrypted = 0
    
    let cryptStatus = key.withUnsafeBytes { keyBytes in
        data.withUnsafeBytes { dataBytes in
            CCCrypt(CCOperation(kCCDecrypt),
                    CCAlgorithm(kCCAlgorithmAES),
                    CCOptions(kCCOptionPKCS7Padding),
                    keyBytes.baseAddress, key.count,
                    nil,
                    dataBytes.baseAddress, data.count,
                    &buffer, bufferSize,
                    &bytesDecrypted)
        }
    }
    
    guard cryptStatus == kCCSuccess else {
        throw CryptoError.decryptionFailed
    }
    
    return Data(bytes: buffer, count: bytesDecrypted)
}

위의 코드는 AES 암호화 알고리즘을 사용하여 데이터를 암호화하고 해독하는 함수를 구현한 것입니다. 데이터와 키를 인수로 받아서 CCCrypt 함수를 사용하여 암호화 및 해독을 수행합니다.

2. 비대칭키 암호화

비대칭키 암호화는 공개키와 개인키를 사용하여 암호화와 해독을 수행하는 방식입니다. Swift에서는 Security 프레임워크를 통해 비대칭키 암호화를 지원합니다. 아래의 예제는 Security 프레임워크를 사용하여 비대칭키 암호화를 수행하는 코드입니다.

import Security

func encryptWithPublicKey(data: Data, publicKey: SecKey) throws -> Data {
    var error: Unmanaged<CFError>?
    guard let encryptedData = SecKeyCreateEncryptedData(publicKey,
                                                        .rsaEncryptionOAEPSHA1,
                                                        data as CFData,
                                                        &error) as Data? else {
        throw CryptoError.encryptionFailed
    }
    
    return encryptedData
}

func decryptWithPrivateKey(data: Data, privateKey: SecKey) throws -> Data {
    var error: Unmanaged<CFError>?
    guard let decryptedData = SecKeyCreateDecryptedData(privateKey,
                                                        .rsaEncryptionOAEPSHA1,
                                                        data as CFData,
                                                        &error) as Data? else {
        throw CryptoError.decryptionFailed
    }
    
    return decryptedData
}

위의 코드는 RSA 암호화 알고리즘을 사용하여 데이터를 암호화하고 해독하는 함수를 구현한 것입니다. SecKeyCreateEncryptedDataSecKeyCreateDecryptedData 함수를 사용하여 암호화 및 해독을 수행합니다.

결론

Swift에서는 대칭키 암호화와 비대칭키 암호화를 수행하기 위해 CommonCrypto와 Security 프레임워크를 사용할 수 있습니다. 이러한 기능을 활용하여 데이터의 보안성을 강화할 수 있습니다. 이 글을 통해 Swift에서의 암호화 및 해독 방법에 대해 알아보았습니다.

참고 자료: