요즘 아이폰 개발을 해야되서 Swift 언어를 공부하고 이것저것 정보를 수집하고 있습니다.
CocoaPods라는 Maven 비슷한 오픈소스 관리 프로그램이 있는데 이걸 적용해보다가 암호화 관련 라이브러리인 CryptoSwift (https://github.com/krzyzanowskim/CryptoSwift)란 오픈소스를 찾아 이전에 정리했던 암호화에 이어 같은 결과를 나오게 코드를 작성해보았습니다.
아직 Swift자체에 대한 이해도 높지 않아... 코드가 이상할 수도 있습니다. ㅎㅎ 옵셔널.. 클로져.. 4년전에 조금 만졌던 Objective-C랑은 개념이 좀 다르네요... 메모리 카운팅 없어져서 좋기도 하구요..
Xcode7.3 버전임으로 Swift는 2.2버전입니다.
간단하게 Single View Application을 생성하여 진행하였습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | // // ViewController.swift // CocoaPods // // Created by Francis Lee on 2016. 4. 20.. // Copyright © 2016년 Aircook. All rights reserved. // import UIKit //https://github.com/krzyzanowskim/CryptoSwift import CryptoSwift class ViewController: UIViewController { //키 let KEY: String = "01234567890123456789012345678901" //128bit (16자리) var KEY_128: String { get { return KEY.substringToIndex(KEY.startIndex.advancedBy(128 / 8)) } } //256bit (32자리) var KEY_256: String { get { return KEY.substringToIndex(KEY.startIndex.advancedBy(256 / 8)) } } //AES 128 암호화 func encryptAES128(string: String) -> String { //1. 가장 간단한 형태, String의 extension 이용 ------------------------------------------------ //let result: String = try! string.encrypt(AES(key: KEY_128, iv: KEY_128)).toBase64()! //1. ------------------------------------------------------------------------------------ //2. NSData의 extension 이용 -------------------------------------------------------------- //String을 NSData로 변환 let plainData: NSData = string.dataUsingEncoding(NSUTF8StringEncoding)! //변환된 NSData를 AES로 암호화 let encryptedData: NSData = try! plainData.encrypt(AES(key: KEY_128, iv: KEY_128)) //암호하된 NSData를 base64 인코딩 let result: String = encryptedData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0)) //2. ------------------------------------------------------------------------------------ //3. blockMode, padding 제어, defaul값이 CBC/PKCS7 ---------------------------------------- //let encryptedBytes: [UInt8] = try! AES(key: KEY_128, iv: KEY_128, blockMode: .CBC).encrypt([UInt8](string.utf8), padding: PKCS7()) //let result: String = NSData(bytes: encryptedBytes, length:encryptedBytes.count).base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0)) //3. ------------------------------------------------------------------------------------ return result } //AES128 복호화 func decryptAES128(string: String) -> String { //암호회된 문자를 base64 디코딩 let encryptedData: NSData = NSData(base64EncodedString: string, options: NSDataBase64DecodingOptions(rawValue: 0))! //디코딩된 NSData를 AES 복호화 let plainData: NSData = try! encryptedData.decrypt(AES(key: KEY_128, iv: KEY_128)) //복호화된 NSData를 Strin으로 변환 let result: String = String(data: plainData, encoding: NSUTF8StringEncoding)! return result } //AES 256 암호화 func encryptAES256(string: String) -> String { let result: String = try! string.encrypt(AES(key: KEY_256, iv: KEY_128)).toBase64()! return result } //AES256 복호화 func decryptAES256(string: String) -> String { let result: String = try! string.decryptBase64ToString(AES(key: KEY_256, iv: KEY_128)) return result } //SHA256 해쉬 함수 암호화 func encryptSHA256(string: String) -> String { //16진수, Hex //let result: String = string.sha256() let plainData: NSData = string.dataUsingEncoding(NSUTF8StringEncoding)! let encryptedData: NSData = plainData.sha256()! //base64 인코딩 let result: String = encryptedData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0)) return result } override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. let str1: String = "암호화되지 않은 문자" print("plain : \(str1)") let str2: String = self.encryptAES128(str1) print("AES128 encrypted : \(str2)") let str3: String = self.decryptAES128(str2) print("AES128 decrypted : \(str3)") let str4: String = self.encryptAES256(str1) print("AES256 encrypted : \(str4)") let str5: String = self.decryptAES256(str4) print("AES256 decrypted : \(str5)") let str6: String = self.encryptSHA256(str1) print("SHA256 encrypted : \(str6)") } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } | cs |
실행결과
'others' 카테고리의 다른 글
Cloud SQL in GCP (0) | 2020.05.14 |
---|---|
AES, SHA 암호화 6, PHP (1) | 2018.04.26 |
AES, SHA 암호화 4, T-SQL (0) | 2015.08.26 |
AES, SHA 암호화 3, C# (6) | 2015.08.26 |
AES, SHA 암호화 2, PL/SQL (0) | 2015.08.26 |