🐾

CryptoKitで文字列の暗号化と復号化を行う

2023/03/16に公開

暗号化

class CryptoUtil {
    // 暗号化
    static func encrypt(string: String, key: SymmetricKey) throws -> Data {
        let data = string.data(using: .utf8)!
        let sealedBox = try AES.GCM.seal(data, using: key)
        return sealedBox.combined!
    }
}

復号化

class CryptoUtil {    
    // 復号化
    static func decrypt(ciphertext: Data, key: SymmetricKey) throws -> String {
        let sealedBox = try AES.GCM.SealedBox(combined: ciphertext)
        let data = try AES.GCM.open(sealedBox, using: key)
        return String(data: data, encoding: .utf8)!
    }
}

使い方

let plainText = "Hello, World!"

// キーの生成
let key = SymmetricKey(size: .bits256)

// 暗号化
let cipherText = try CryptoUtil.encrypt(string: plainText, key: key)
print("暗号文", cipherText.base64EncodedString())

// 復号化
let decrypt = try CryptoUtil.decrypt(ciphertext: cipherText, key: _key)
print("復号文", decrypt)

キーの文字列化

extension SymmetricKey {
    
    // String型からキーにする
    init?(base64EncodedString string: String) {
        guard let data = Data(base64Encoded: string) else {
            return nil
        }
        self.init(data: data)
    }

    // キーをString型にする
    func serialize() -> String {
        return self.withUnsafeBytes { body in
            Data(body).base64EncodedString()
        }
    }
}

こちらの引用です。

SymmetricKeyとStringの相互変換

let key = SymmetricKey(size: .bits256)

// キーの文字列化
let stringValue = key.serialize()

// 文字列からキーの生成
let _ = SymmetricKey(base64EncodedString: stringValue)!

キーはローカルに保存しておかないと、復号できなくなるのでString型にできるようにしました。

GitHubで編集を提案
カラビナテクノロジー デベロッパーブログ

Discussion