본문 바로가기

others

AES, SHA 암호화 5, Swift

요즘 아이폰 개발을 해야되서 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