Skip to content

Instantly share code, notes, and snippets.

@resand
Forked from ochim/aes.swift
Created June 20, 2018 04:36
Show Gist options
  • Select an option

  • Save resand/7bf7af2cdda530aa09b126de26635c31 to your computer and use it in GitHub Desktop.

Select an option

Save resand/7bf7af2cdda530aa09b126de26635c31 to your computer and use it in GitHub Desktop.
[swift4]AES暗号化、復号化
// [CryptoSwift] https://github.com/krzyzanowskim/CryptoSwift
//
// Xcode 9.4
// Swift 4.1
import Foundation
import CryptoSwift
struct EncryptionUtil {
static let EASILY_INITIAL = "CipherEasilyUtil";
// ----- encryption -----
static func encrypt(key: String, iv: String, target:String) -> String? {
do {
let aes = try AES(key: key, iv: iv) // aes128
let ciphertext = try aes.encrypt(Array(target.utf8))
// [UInt8]をbase64Stringに変換して返す
let data = NSData(bytes: ciphertext, length: ciphertext.count)
let base64Data = data.base64EncodedData(options: NSData.Base64EncodingOptions.endLineWithLineFeed)
let newString = String(data: base64Data as Data, encoding: String.Encoding.utf8)
return newString
} catch {
return nil
}
}
static func easyEncryption(target: String, seed: String) -> String? {
let key = easyKey(seed: seed)
let iv = EASILY_INITIAL;
return encrypt(key: key, iv: iv, target: target)
}
// ----- decryption -----
static func decrypt(key: String, iv: String, base64:String) -> String? {
do {
let aes = try AES(key: key, iv: iv)
// 対象をbase64Decodeしてから、[UInt8]に変換する
// base64 -> Data
let aData = base64.data(using: String.Encoding.utf8)! as Data
// Decode base64
let dData = NSData(base64Encoded: aData, options: NSData.Base64DecodingOptions.ignoreUnknownCharacters)
guard let data = dData else {
return nil
}
// dataのバイト数と同じ大きさの配列を作る。
var aBuffer = Array<UInt8>(repeating: 0, count: data.length)
// aBufferにバイナリデータを格納。
data.getBytes(&aBuffer, length: data.length)
let decrypted = try aes.decrypt(aBuffer)
let string = String(data: Data(bytes: decrypted), encoding: .utf8)
return string
} catch {
return nil
}
}
static func easyDecryption(base64Target: String, seed: String) -> String? {
let key = easyKey(seed: seed)
let iv = EASILY_INITIAL;
return decrypt(key: key, iv: iv, base64: base64Target)
}
// ----- key -----
static func easyKey(seed: String) -> String {
var key = ""
if seed.hasPrefix("group:") {
key = generateKey(groupId: seed)
} else if seed.hasPrefix("account:") {
key = generateKey(accountId: seed)
} else {
key = EASILY_INITIAL
}
return key
}
static func generateKey(groupId: String) -> String {
let seed = groupId.replacingOccurrences(of: "group:", with: "").replacingOccurrences(of: "-", with: "")
return String(seed.prefix(16))
}
static func generateKey(accountId: String) -> String {
let seed = accountId.replacingOccurrences(of: "account:", with: "").replacingOccurrences(of: "-", with: "")
return String(seed.prefix(16))
}
// ----- others -----
static func getInitialVector() -> String {
let random = randomString(length: 16)
return random
}
static func randomString(length: Int) -> String {
let letters : NSString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
let len = UInt32(letters.length)
var randomString = ""
for _ in 0 ..< length {
let rand = arc4random_uniform(len)
var nextChar = letters.character(at: Int(rand))
randomString += NSString(characters: &nextChar, length: 1) as String
}
return randomString
}
}
func testEncryptionUtil() {
let id = "7b172037-fd4d-4afd-8ab1-03a41f0d4ea8"
let key = EncryptionUtil.generateKey(conversationId: id)
XCTAssertTrue(key == "7b172037fd4d4afd")
let iv = EncryptionUtil.getInitialVector()
XCTAssertTrue(iv.count == 16)
let text = "abcdeあいうえおアイウエオ東京都中央区1234567890@+-:"
let encrypted = EncryptionUtil.encrypt(key:key, iv:iv, target:text)
XCTAssertNotNil(encrypted)
let decrypted = EncryptionUtil.decrypt(key: key, iv: iv, base64: encrypted!)
XCTAssertTrue(decrypted! == text)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment