// // EDENON.swift // JJUNGTABLE // // Created by Sean Kim on 6/13/24. // import Foundation import Combine /* 암호화 (5단계로 구성) 예시) 값: 12345678 키: 20240612 0단계 암호화 시킬 번호와 키의 자리수가 둘이 같은지 확인 1단계 암호화 시킬 값과 키를 자리수 대로 덧셈을 해준다. - 만일 1자리 수인 경우에는 앞에 0을 붙여서 표시한다. 예시) 1 2 3 4 5 6 7 8 2 0 2 4 0 6 1 2 결과: 03 02 05 08 05 12 08 10 2단계 1단계의 결과(길이: n)에서 1번째와 n번째를 묶고 2번째와 n-1번째 3번째와 n-2번째를 중앙이 될 때까지 그룹을 만들어 준다. 예시) 03 02 05 08 05 12 08 10 결과: 0310 0208 0512 0805 3단계 2단계의 결과에서 나타난 그룹들을 순서에 맞게 특정한 동작을 수행한다. 첫번째 그룹은 1번째 항목의 숫자를 떼서 남아있는 숫자의 뒤에 붙이고, 두번째 그룹은 1~2번째 항목의 숫자를 떼서 남아있는 숫자의 뒤에 붙이고, 세번째 그룹은 1~3번째 항목을 떼서 남아있는 숫자의 뒤에 붙인다. 네번째 그룹은 1~4번째 항목을 떼서 남아있는 숫자의 뒤에 붙인다. 예시) 0310 0208 0512 0805 첫번째: 0310 -> 0 을 뗀다 -> 남아있는 수: 310 -> 뒤에 붙인다 = 3100 두번째: 0208 -> 02 를 뗀다 -> 남아있는 수: 08 -> 뒤에 붙인다 = 0802 세번쨰: 0512 -> 051 을 뗀다 -> 남아있는 수: 2 -> 뒤에 붙인다 = 2051 네번째: 0805 -> 0805 를 뗀다 -> 남아있는 수: -> 뒤에 붙인다 = 0805 결과: 3100 0802 2051 0805 4단계 3단계의 결과에서 각 그룹의 숫자들을 위치를 맞춰 다시 그룹화를 진행한다. 예시) 3100 0802 2051 0805 [새 그룹] 첫번째: 3 0 2 0 두번째: 1 8 0 8 세번째: 0 0 5 0 네번째: 0 2 1 5 결과: 3020 1808 0050 0215 5단계 4단계의 결과에서 진행을 하는데 이해를 위해서 변수(isToggle: default = false)를 하나 만들어서 설명하겠다. 4단계의 결과에서 숫자를 영문자로 변환하는 작업을 진행한다. 1 = A, 2 = B, 3 = C, 4 = D, 5 = E, 6 = F, 7 = G, 8 = H, 9 = I 에 맞춰서 바꿔주는데 isToggle의 값이 false면 대문자로 true이면 소문자로 변환을 해준다. 하지만 0을 만나게 되면 isToggle의 Bool값을 바꿔주며 0으로 이루어진 그룹이 존재 할경우 1부터 9에 치환되는 알파벳이 아닌 다른 알파벳 (J~Z)를 대문자로 표시해준다. 만약 0이 연속되는 숫자가 나오게 될경우 2자리 이상일 경우에는 0의 갯수를 표시해준다. 4자리인 경우에는 앞의 예외를 처리 한다. 예시) 3020 1808 0050 0215 숫자 - 출력값 - isToggle 첫번째 3 - C - F 0 - - T 2 - b - T 0 - - F 첫번째 그룹이 0000 이 아니므로 다음 작업 진행 만약 0000일 경우에 (J~Z)중 랜덤하게 아무 값을 넣는다 두번쨰 1 - A - F 8 - H - F 0 - - T 8 - h - T 두번째 그룹이 0000 이 아니므로 다음 작업 진행 만약 0000일 경우에 (J~Z)중 랜덤하게 아무 값을 넣는다 세번째 0 - - F 0 - 2 - T - 이때 0이 2번 반복 되었으므로 2를 표시 5 - e - T 0 - - F 세번째 그룹이 0000 이 아니므로 다음 작업 진행 만약 0000일 경우에 (J~Z)중 랜덤하게 아무 값을 넣는다 네번째 0 - 2 - T - 세번째 그룹의 마지막에서도 0이 나와서 이번까지 0이 2번 반복되었기에 2를 표시 2 - b - T 1 - a - T 5 - e - T 네번째 그룹이 0000 이 아니므로 다음 작업 진행 만약 0000일 경우에 (J~Z)중 랜덤하게 아무 값을 넣는다 결과: Cb AHh 2e 2bae 이렇게 진행한다. 값: 12345678 키: 20240612 결과: Cb AHh 2e 2bae */ struct ENDC_ERROR:Error { var caseType: CASE var message: String enum CASE: Error{ case EN_DIGIT case DC_WRONG } } func edon_E(value: String, key: String) -> Future { return Future { promise in var result = "" // 0단계: 자리수 확인 if value.count != key.count { promise(.failure(ENDC_ERROR(caseType: .EN_DIGIT, message: "digit ERROR"))) } /// 1단계: 자리별 덧셈 + 그룹화 + 셔플 /// <순서> /// 1. 암호화 할 값과 키를 자리 별로 덧셈을 진행 /// 2. 1의 결과가 1자리일 경우에는 앞에 0을 붙여서 2자리로 만들어줌 /// 3. 0 ~ index 까지의 배열을 [index+1... end] 뒤에 붙여준다. /// 4. 3의 결과로 만들어진 그룹에서 각 자리 위치에 있는 숫자들로 새로운 그룹을 만들어준다. /// 5. 4의 결과를 가지고 하나의 String 값으로 만들어 반환한다. let sum = { () -> String in var tempArray = ["","","",""] let add = zip(value, key).map{ guard let first = Int(String($0)), let second = Int(String($1)) else { return ""} return String(format: "%02d", first + second) } zip(add[...3],add[4...].reversed()) .map{"\($0)\($1)"}.enumerated() .map { (index, value) in let sumValue = value.map{$0} return "\(String(sumValue[(index+1)...]))\(String(sumValue[...(index)]))" } .joined(separator: "") .enumerated().map { (index, value) in tempArray[index % 4] += "\(value)" } // print(tempArray) // print(tempArray.joined(separator: "")) return tempArray.joined(separator: "") }() // print(sum) // print(String(Character(UnicodeScalar(73)))) //"I".unicodeScalars.first?.value /// 2단계 /// [영문자 아스키 코드 : 65~73] /// <순서> /// 1. var isToggle = false var zCnt = 0 let ascii = { (value: Int) -> String in if let scalar = UnicodeScalar(value) { return "\(scalar)" } return "" } for value in sum { if value == "0" { isToggle.toggle() zCnt += 1 if zCnt == 4 { result += isToggle ? ascii(Int.random(in: 74...90)).lowercased() : ascii(Int.random(in: 74...90)) zCnt = 0 } } else { if zCnt > 1 { result += "\(zCnt)" } zCnt = 0 result += isToggle ? ascii(Int("\(value)")!+64).lowercased() : ascii(Int("\(value)")!+64) } } promise(.success(result)) } } func edon_D(value: String, key: String) -> Future { return Future { promise in var result = "" var temp = "" var isToggle = false let ascii = { (value: String) -> Int in if let scalar = value.unicodeScalars.first, let sInt = Int("\(scalar.value)") { return sInt } return 0 } // 대 = 65~73, 소 = 97~105 value.map { if let codeNum = Int("\($0)") { for _ in 0.. 64 && code < 74 { if isToggle { temp += "0\(code-64)" isToggle.toggle() } else { temp += "\(code-64)" } } else if code > 96 && code < 106 { if !isToggle { temp += "0\(code-96)" isToggle.toggle() } else { temp += "\(code-96)" } } else { temp += "0000" } } } if temp.count % 4 > 0 { for _ in 0 ..< 4-(temp.count%4) { temp += "0" } } var tempArray = ["","","",""] temp.enumerated().map {(index,value) in tempArray[index%4] += "\(value)" } var saveArray = [String].init(repeating: "", count: 8) var saveTArray = [[String]]() tempArray.enumerated().map {(index,value) in let sepValue = value.map{$0} saveTArray.append("\(String(sepValue[(3-index)...]))\(String(sepValue[...(3-index-1)]))".map{"\($0)"}) saveArray[index] = saveTArray[index][0...1].joined(separator: "") saveArray[(7-index)] = saveTArray[index][2...3].joined(separator: "") } for (v,k) in zip(saveArray,key) { if let value = Int(v), let key = Int("\(k)") { if value-key > 0 { result += "\(value-key)" } else { result += "\((value-key) * -1)" } } } promise(.success(result)) } }