とりあえずコピペで動けば良い方へ
※base64で扱いやすい形式にしています
Blowfishについて
ライセンスフリーなブロック暗号
Javaと相性が良い
動作環境
- Xcode 10.1
- Swift 4.2.1
- CryptoSwift 0.14.0
ライブラリの追加
CryptoSwiftを使用します
ソースコード(暗号化、復号)
CBC、PKCS5Paddingで暗号化します
func generateRandom(_ length:Int) -> String{
let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789"
return String((0...length-1).map{_ in letters.randomElement()!})
}
func encodeBase64(_ array:[UInt8]) -> String {
let data = Data(bytes: array, count: array.count)
let base64data = data.base64EncodedData(options: [])
return String(bytes: base64data, encoding: .utf8) ?? ""
}
func decodeBase64(_ data:String) -> [UInt8]{
guard let d = Data(base64Encoded: data) else {
return []
}
return Array(d)
}
func encrypt(_ key:String,_ iv:String,_ message:String) -> String{
let encrypted = try! Blowfish(key: key, iv: iv, padding: .pkcs5).encrypt(Array(message.utf8))
return encodeBase64(encrypted)
}
func decrypt(_ key:String,_ iv:String,_ encryptedMessage:String) -> String{
let decrypted = try! Blowfish(key: key, iv: iv, padding: .pkcs5).decrypt(decodeBase64(encryptedMessage))
return String(bytes: decrypted, encoding: .utf8) ?? ""
}
ソースコード(使用例)
let key = "tekitouPassword"
let iv = generateRandom(Blowfish.blockSize)
let str = "テスト用平文"
let encrypted = encrypt(key, iv, str)
print("暗号化された文字列:" + encrypted) //暗号化された文字列:x+tUnSNNgPPel5uWYO3yozrxd92dLSok
let decrypted = decrypt(key, iv, encrypted)
print("復号された文字列:" + decrypted) //復号された文字列:テスト用平文