[swift] Swift CryptoSwift로 CBC 암호화 모드 사용하기

암호화는 개인 정보와 데이터의 안전을 보장하기 위해 필수적인 요소입니다. Swift에서 CryptoSwift 라이브러리를 사용하면 간단하게 암호화를 구현할 수 있습니다. 이번 블로그 포스트에서는 CBC(Cipher Block Chaining) 암호화 모드를 CryptoSwift를 사용하여 구현하는 방법에 대해 알아보겠습니다.

CryptoSwift 설치하기

먼저, CryptoSwift를 설치해야 합니다. Cocoapods를 사용하면 간편하게 라이브러리를 추가할 수 있습니다. 다음 명령어를 터미널에 입력하여 설치해주세요.

$ pod init

그리고 Podfile을 열어 다음과 같이 CryptoSwift를 추가해줍니다.

pod 'CryptoSwift'

마지막으로 다음 명령어를 실행하여 라이브러리를 설치합니다.

$ pod install

CBC 암호화 모드 사용하기

CryptoSwift를 사용하여 CBC 암호화 모드를 구현하는 방법은 다음과 같습니다.

import CryptoSwift

func encryptWithCBC(key: String, iv: String, message: String) -> String? {
    // key와 iv를 Data 객체로 변환
    guard let keyData = key.data(using: .utf8),
          let ivData = iv.data(using: .utf8) else {
        return nil
    }
    
    // 메시지를 Data 객체로 변환
    guard let messageData = message.data(using: .utf8) else {
        return nil
    }
    
    do {
        // AES-256 암호화에 CBC 모드로 설정
        let aes = try AES(key: keyData.bytes, blockMode: CBC(iv: ivData.bytes), padding: .pkcs7)
        
        // 암호화
        let encrypted = try aes.encrypt(messageData.bytes)
        
        // Base64로 인코딩
        let base64 = encrypted.toBase64()
        
        return base64
    } catch {
        return nil
    }
}

func decryptWithCBC(key: String, iv: String, encryptedMessage: String) -> String? {
    // key와 iv를 Data 객체로 변환
    guard let keyData = key.data(using: .utf8),
          let ivData = iv.data(using: .utf8) else {
        return nil
    }
    
    // Base64로 디코딩
    guard let encryptedData = Data(base64Encoded: encryptedMessage) else {
        return nil
    }
    
    do {
        // AES-256 암호화에 CBC 모드로 설정
        let aes = try AES(key: keyData.bytes, blockMode: CBC(iv: ivData.bytes), padding: .pkcs7)
        
        // 복호화
        let decrypted = try aes.decrypt(encryptedData.bytes)
        
        // UTF-8로 디코딩하여 문자열로 변환
        guard let decryptedMessage = String(data: Data(decrypted), encoding: .utf8) else {
            return nil
        }
        
        return decryptedMessage
    } catch {
        return nil
    }
}

위의 코드에서 encryptWithCBC 함수는 주어진 키(key), 초기화 벡터(iv), 그리고 메시지(message)를 받아서 CBC 암호화로 암호화한 후 Base64 인코딩된 문자열로 반환합니다. decryptWithCBC 함수는 주어진 키(key), 초기화 벡터(iv), 그리고 Base64 인코딩된 암호화된 메시지(encryptedMessage)를 받아서 복호화한 후 원본 문자열로 반환합니다.

사용 예제

let key = "abcdefghijklmnop" // 16바이트
let iv = "1234567890123456" // 16바이트
let message = "Hello, World!"
let encryptedMessage = encryptWithCBC(key: key, iv: iv, message: message)

if let encryptedMessage = encryptedMessage {
    print("암호화된 메시지: \(encryptedMessage)")
    
    if let decryptedMessage = decryptWithCBC(key: key, iv: iv, encryptedMessage: encryptedMessage) {
        print("복호화된 메시지: \(decryptedMessage)")
    } else {
        print("복호화 실패")
    }
} else {
    print("암호화 실패")
}

위의 예제에서는 주어진 키(key)와 초기화 벡터(iv)로 “Hello, World!” 메시지를 CBC 암호화한 후 복호화를 통해 원래의 메시지를 얻어내고 출력합니다.

결론

이렇게 CryptoSwift를 사용하여 Swift에서 CBC 암호화 모드를 구현할 수 있습니다. 데이터를 안전하게 암호화하고 복호화하는 것은 사용자의 개인 정보와 데이터의 보안을 위해 중요한 요소이므로 적절하게 사용하시기 바랍니다.

참고 자료