ECDHESSwift
功能
- 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)