투케이2K

633. (ios/swift5) [JOSESwift] encodeAes128GcmJwe : AES 128 JWE 암호화 수행 실시 - A128GCM 본문

IOS

633. (ios/swift5) [JOSESwift] encodeAes128GcmJwe : AES 128 JWE 암호화 수행 실시 - A128GCM

투케이2K 2025. 4. 5. 20:03

[개발 환경 설정]

개발 툴 : XCODE

개발 언어 : SWIFT5

 

[소스 코드]

// --------------------------------------------------------------------------------------
[개발 및 테스트 환경]
// --------------------------------------------------------------------------------------

- 언어 : Swift5

- 개발 툴 : Xcode

- 기술 구분 : JOSESwift / JWE / 웹 암호화 및 복호화

// --------------------------------------------------------------------------------------






// --------------------------------------------------------------------------------------
[소스 코드]
// --------------------------------------------------------------------------------------

// --------------------------------------------------------
// MARK: - [전역 변수 선언]
// --------------------------------------------------------
public static let ACTIVITY_NAME = "C_JWE_Encryption_Module"

private let AES128_GCM_KEY = "0123456789abcdef" // [16 바이트]



// --------------------------------------------------------
// MARK: - [AES GCM : JWE 인코딩 수행]
// --------------------------------------------------------
// TODO [Call Method]
// --------------------------------------------------------
/*
  DispatchQueue.main.async { // [비동기 요청]
      
      // [딕셔너리 선언]
      var dic : Dictionary<String, Any> = [String : Any]()
      dic["name"] = "Twok"
      dic["age"] = 30
      
      
      // [Dic To Json Stirng 변환]
      let jsonString = C_Util().dic_To_JsonObject_String(_dicData: dic)
      
      
      // [JWE 암호화 수행]
      let encode = C_JWE_Encryption_Module().encodeAes128GcmJwe(payload: jsonString)
  }
*/
// --------------------------------------------------------
func encodeAes128GcmJwe(payload: String) -> String {
    
    
    var returnData = "" // [Return 데이터]
    var M_LOG = "" // [Log 데이터]
    
    
    // -----------------------------------------------
    // TODO [1] : [key >> Byte 변환]
    // -----------------------------------------------
    let keyBytes = self.AES128_GCM_KEY.data(using: .utf8)!
    
    
    // -----------------------------------------------
    // TODO [2] : [JWE 헤더 설정 : A128GCM 사용]
    // -----------------------------------------------
    /**
      * {
      *   "cty": "application/json",
      *   "typ": "JWE",
      *   "enc": "A128GCM",
      *   "alg": "A128KW"
      * }
      */
    // -----------------------------------------------
    var header = JWEHeader(keyManagementAlgorithm: .A128KW, contentEncryptionAlgorithm: .A128GCM)
    header.typ = "JWE"
    header.cty = "application/json"

    
    // -----------------------------------------------
    // TODO [3] : [페이로드 지정]
    // -----------------------------------------------
    let message = payload.data(using: .utf8)!
    let payload_Object = Payload(message)
    
    
    // -----------------------------------------------
    // TODO [4] : [JWE 인코딩 수행 실시]
    // -----------------------------------------------
    let encrypter = Encrypter(keyManagementAlgorithm: .A128KW, contentEncryptionAlgorithm: .A128GCM, encryptionKey: keyBytes)!
    
    guard let jwe = try? JWE(header: header, payload: payload_Object, encrypter: encrypter)
    else {
        M_LOG = "Error :: JWE Encode Error"
        
        S_Log._E_(description: C_JWE_Encryption_Module.ACTIVITY_NAME + " :: encodeAes128GcmJwe :: JWE 인코딩 실패", data: [
            "M_LOG :: \(M_LOG)",
            "RETURN :: \(returnData)"
        ])
        
        return returnData
    }
    
    
    // -----------------------------------------------
    // TODO [5] : [리턴 정보 확인]
    // -----------------------------------------------
    returnData = jwe.compactSerializedString // [base64 데이터]
    M_LOG = "Success :: JWE Encode"
    
    
    S_Log._D_(description: C_JWE_Encryption_Module.ACTIVITY_NAME + " :: encodeAes128GcmJwe :: JWE 인코딩 수행", data: [
        "M_LOG :: \(M_LOG)",
        "RETURN :: \(returnData)"
    ])
    
    
    return returnData
    
}

// --------------------------------------------------------------------------------------





// --------------------------------------------------------------------------------------
[결과 출력]
// --------------------------------------------------------------------------------------

================================================================
LOG :: TYPE :: LOG :: 🟢
-------------------------------------------------
LOG :: CLASS PLACE :: C_JWE_Encryption_Module.swift :: encodeAes128GcmJwe(payload:) :: 151
-------------------------------------------------
LOG :: NOW TIME :: 2025-04-05 18:52:04
-------------------------------------------------
LOG :: DESCRIPTION :: C_JWE_Encryption_Module :: encodeAes128GcmJwe :: JWE 인코딩 수행
-------------------------------------------------
LOG :: M_LOG :: Success :: JWE Encode
-------------------------------------------------
LOG :: RETURN :: eyJhbGciOiJBMTI4S1ciLCJjdHkiOiJhcHBsaWNhdGlvblwvanNvbiIsImVuYyI6IkExMjhHQ00iLCJ0eXAiOiJKV0UifQ.sVN3ew9v18jPSWrMAuLMcCjwhXgtqJMy.OSI_gsoMVsOZejdU.Cd1ZwL5uUczqrm1BnHdhSIyup-QsbPA49YgGBFqwEJ2XNjM.y0FePKGFEKCVaYFUaFqxdg
================================================================

// --------------------------------------------------------------------------------------





// --------------------------------------------------------------------------------------
[참고 사이트]
// --------------------------------------------------------------------------------------

[라이브러리 설치 참고 사이트]

https://blog.naver.com/kkh0977/223823265351

https://github.com/airsidemobile/JOSESwift


[JWE 개념 설명]

https://blog.naver.com/kkh0977/223817878517?trackingCode=blog_bloghome_searchlist

// --------------------------------------------------------------------------------------
 
반응형