技術ブログ

プログラミング、IT関連の記事中心

暗号化と複合化の方法【Swift】

■はじめに

パスワード情報など、セキュリティを強固にしたいデータを扱う際に暗号化/複合化を利用することがあります。

ここでは、「CryptoSwift」のライブラリを使用させて頂き、暗号化/複合化を行う方法を記載します。

■手順

CocoaPodsを使用して、「CryptoSwift」をインストールします。

CryptoSwift

以下のソースコードを記載します。

※これは、暗号化/複合化の共通処理です。

※「encryptionKey」と「encryptionIv」の定数の値は任意で書き換えてください。

import Foundation
import CryptoSwift

/// 暗号化/複合化の共通処理
class EncryptionCommon {
    
    /// 暗号化のキー(16文字)
    private static let encryptionKey = "samplesamplesamp"
    /// データをシフト演算するキー(16文字の数字)
    private static let encryptionIv = "1111122222333339"
    
    /// 暗号化
    /// - Parameter target: 暗号化したい文字列
    class func encode(_ target: String) -> String {

        do {
            // 暗号化処理
            // AES インスタンス化
            let aes = try AES(key: encryptionKey, iv: encryptionIv)
            let encrypt = try aes.encrypt(Array(target.utf8))

            // Data 型変換
            let data = Data(encrypt)
            // base64 変換
            let base64Data: Data = data.base64EncodedData() as Data

            // base64文字列をUTF-8に変換して返す
            return String(data: base64Data, encoding: String.Encoding.utf8) ?? ""

        } catch {
            // エラー処理
            return ""
        }
    }

    /// 複合化
    /// - Parameter base64: 暗号化されている文字列
    class func decode(_ base64: String) -> String {

        do {
            // AES インスタンス化
            let aes = try AES(key: encryptionKey, iv: encryptionIv)

            // base64 から Data型へ
            guard let byteData = base64.data(using: String.Encoding.utf8) else { return "" }
            // base64 デーコード
            guard let data = Data(base64Encoded: byteData) else { return "" }

            // UInt8 配列の作成
            let aBuffer = Array<UInt8>(data)
            // AES 複合
            let decrypted = try aes.decrypt(aBuffer)

            // UTF-8に変換して返す
            return String(data: Data(decrypted), encoding: .utf8) ?? ""
        } catch {
            // エラー処理
            return ""
        }
    }
}

暗号化する際は以下のように共通処理を呼び出します。

※引数に暗号化したい文字列を渡してください。

let encode = EncryptionCommon.encode("暗号化したい文字列")

上記で暗号化された文字列を複合化したい場合は以下のように共通処理を呼び出します。

※引数に複合化したい文字列を渡してください。

let decode = EncryptionCommon.decode(encode)