-
-
Save resand/7bf7af2cdda530aa09b126de26635c31 to your computer and use it in GitHub Desktop.
[swift4]AES暗号化、復号化
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // [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