[swift] Swift CryptoSwift로 RSA 키 쌍 저장하기

RSA 알고리즘은 공개키 암호 시스템으로 알려져 있습니다. 이 알고리즘은 공개키와 개인키 쌍을 사용하여 데이터를 암호화하고 복호화하는데 사용됩니다. RSA 키 쌍은 일반적으로 파일로 저장되어 재사용할 수 있습니다. 이번 블로그 포스트에서는 Swift CryptoSwift 라이브러리를 사용하여 RSA 키 쌍을 생성하고 파일로 저장하는 방법을 알아보겠습니다.

CryptoSwift 설치

먼저, CryptoSwift를 설치해야 합니다. Cocoapods를 사용하신다면 Podfile에 다음과 같이 추가하세요:

pod 'CryptoSwift'

그리고 pod install 명령어를 실행하여 CryptoSwift를 프로젝트에 추가하세요.

RSA 키 쌍 생성

RSA 키 쌍을 생성하기 위해서는 공개키와 개인키를 생성해야 합니다. CryptoSwift를 사용하여 RSA 키 쌍을 생성하는 방법은 다음과 같습니다:

import CryptoSwift

func generateRSAKeyPair() throws {
    let rsa = try RSA.generate(bits: 2048)
    let publicKey = rsa.publicKey.pemString
    let privateKey = rsa.privateKey.pemString

    try publicKey.write(to: URL(fileURLWithPath: "public_key.pem"), atomically: true, encoding: .utf8)
    try privateKey.write(to: URL(fileURLWithPath: "private_key.pem"), atomically: true, encoding: .utf8)
}

위 코드에서 generateRSAKeyPair 함수를 호출하면 2048비트의 RSA 공개키와 개인키를 생성합니다. 생성된 키는 PEM 형식으로 저장된 후 public_key.pemprivate_key.pem 파일로 저장됩니다.

키 쌍 사용

RSA 키 쌍을 생성하고 파일로 저장한 후에는 다른 곳에서 사용할 수 있습니다. 다음은 RSA 공개키와 개인키를 사용하여 데이터를 암호화하고 복호화하는 예시 코드입니다:

import CryptoSwift

func encryptData(data: Data, publicKeyPath: String) throws -> Data {
    let publicKeyString = try String(contentsOfFile: publicKeyPath)
    let publicKey = try PEMFormatter().format(pemBlock: publicKeyString)
    let rsa = try RSA(publicPEM: publicKey)
    
    let encrypted = try rsa.encrypt(data: data)
    return encrypted
}

func decryptData(encryptedData: Data, privateKeyPath: String) throws -> Data {
    let privateKeyString = try String(contentsOfFile: privateKeyPath)
    let privateKey = try PEMFormatter().format(pemBlock: privateKeyString)
    let rsa = try RSA(privatePEM: privateKey)
    
    let decrypted = try rsa.decrypt(data: encryptedData)
    return decrypted
}

위 코드에서 encryptData 함수는 RSA 공개키를 사용하여 데이터를 암호화하고, decryptData 함수는 RSA 개인키를 사용하여 암호화된 데이터를 복호화합니다.

결론

Swift CryptoSwift를 사용하여 RSA 키 쌍을 생성하고 파일로 저장하는 방법을 알아보았습니다. RSA 암호화는 많은 애플리케이션에서 사용되는 중요한 보안 기법이므로, 암호화 알고리즘을 이해하고 활용하는 것은 개발자에게 유용한 기술입니다.