ECDHESSwift 0.0.4

ECDHESSwift 0.0.4

mfantcyYao-Siang Su 维护。



 
依赖
JOSESwift~> 1.8
CryptoSwift~> 1.0.0
 

  • 作者
  • MFantcy

ECDHESSwift

CI Status codecov Version License Platform

功能

  • JWE:利用椭圆曲线Diffie-Hellman Ephemeral Static(ECDH-ES)任意数据加密和解密的密钥协商。

椭圆曲线

  • P-256
  • P-384
  • P-521

密钥管理算法

  • ECDH-ES:使用 Concat KDF 的椭圆曲线 Diffie-Hellman Ephemeral Static 密钥协商。
  • ECDH-ES+A128KW:使用 Concat KDF 和 CEK,并使用 "A128KW" 包装的 ECDH-ES。
  • ECDH-ES+A192KW:使用 Concat KDF 和 CEK,并使用 "A192KW" 包装的 ECDH-ES。
  • ECDH-ES+A256KW:使用 Concat KDF 和 CEK,并使用 "A256KW" 包装的 ECDH-ES。

加密算法

  • A128CBC-HS256:AES_128_CBC_HMAC_SHA_256 认证加密算法。
  • A192CBC-HS384:使用192位密钥的AES_192_CBC_HMAC_SHA_384认证加密算法。
  • A256CBC-HS512:使用256位密钥的AES_256_CBC_HMAC_SHA_512认证加密算法。
  • A128GCM:使用128位密钥的AES GCM加密算法。
  • A192GCM:使用192位密钥的AES GCM加密算法。
  • A256GCM:使用256位密钥的AES GCM加密算法。

压缩算法

  • DEF:使用DEFLATE [RFC1951]算法进行压缩。

JWE序列化

  • 紧凑序列化

要求

  • iOS >= 10.0
  • JOSESwift 1.8

安装

ECDHESSwift 可通过CocoaPods访问。要安装它,只需将以下行添加到您的Podfile中

pod 'ECDHESSwift'

用法

加密

let pubJwk = """
  {
    "crv": "P-256",
    "kty": "EC",
    "x": "CQJxA68WhgU3hztigbedfLtJitDhScq3XSnXgO0FV5o",
    "y": "WFg6s36izURa733WqeoJ8zXMd7ho5OSwdWnMsEPgTEI"
  }
"""

let plaintext = """
每覽昔人興感之由,若合一契,未嘗不臨文嗟悼,不能喻之於懷,固知一死生為虛誕,彭殤為妄作。後之視今,亦猶今之視昔,悲夫!故列時人,錄其所述,雖世殊事異,所以興懷,其致一也。後之覽者,亦將有感於斯文。
""".data(using: .utf8)!

let encryptionJwe = try EcdhEsJwe(plaintext: plaintext, pubKeyJwkJson: pubJwk, headerDic: ["alg": "ECDH-ES+A256KW", "enc": "A256GCM"])

let jweCompactString = encryptionJwe.compactSerializedString

解密

let privJwk = """
  {
    "crv": "P-256",
    "d": "920OCD0fW97YXbQNN-JaOtaDgbuNyVxXgKwjfXPPqv4",
    "kty": "EC",
    "x": "CQJxA68WhgU3hztigbedfLtJitDhScq3XSnXgO0FV5o",
    "y": "WFg6s36izURa733WqeoJ8zXMd7ho5OSwdWnMsEPgTEI"
  }
"""

let jweCompactString = "eyJhbGciOiJFQ0RILUVTK0EyNTZLVyIsImVuYyI6IkEyNTZHQ00iLCJlcGsiOnsieSI6IkgwX1JwdTBqaHpjcVdiaFRiNjg0OVcyZV9xQkxIVFNXSnVYQVYyRjRmeGsiLCJraWQiOiIxQUJBM0UxOS00RTlFLTRFNTAtOTAxOC01NDY5OTExMEY2NTciLCJrdHkiOiJFQyIsImNydiI6IlAtMjU2IiwieCI6IkIxUGxLWW10ekdUemFUT2FPd1F1aEVKOXFFNDIyVVpEaHlWNHZkSGpZdlkifX0.eD9Mxp9SBS6QMRh-rP-shwmM0fCj34ZHDUBjdADgndl_J4qIk60OWA.P_pq05ZWReabvX1a.a9YuXgj1EI-DOgWq8da8H8c1P7Qn4LMiJt81My3uC9SmV9NHY6vKtqFVlB1TLHdJ7niT68Gd_T5ow_K_BUOm57armWx9UAaTBLV8gWETRhtmF7vCEPZEVIrK07aTHRvhkF57BBlgeMbpIfuXAL8Ks_S5Y_0WkzjBfpMCx0y7I4UPUYc6aaJLxkDlz0L54HiPpJD7jx1ExPZ_b6QHVbLHnQrywOPBZXbRIax-g8GuTW1MYhazIoKyStSmImHJxMBiA5OkfxuGaiLiz8_UpUyDqEbFDYJl_gDm-ePZbNhcM46XFL0SQidNOmcrmzXMjOMNDTpG3zVCg05EkM7Ztm-bIuOSRAWwYDLc92cDlSCzfH_77p3UWhMiRZicrrLULUXnkKi-gOeg.TOEKC6oNaaND_Etb5qxt5A"

let decryptionJwe = try EcdhEsJwe(compactSerializedString: jweCompactString)

let plaintext = try! decryptionJwe.decrypt(privKeyJwkJson: privJwk)