Swift 3中SecKeyCreateEncryptedData与SecKeyEncrypt的差异及调用失败排查
ECIES加密:SecKeyCreateEncryptedData vs SecKeyEncrypt的差异及-50错误原因
我来帮你理清这两个API的核心差异,以及你遇到-50错误的根本原因:
一、两个API的本质差异
API世代与设计目标不同
SecKeyCreateEncryptedData是iOS 10/macOS 10.12之后推出的现代加密API,专门为混合加密场景(比如ECIES)设计,它封装了从密钥派生、对称加密到结果打包的完整流程。SecKeyEncrypt是传统的旧版API,只负责单纯的非对称加密(比如RSA的PKCS#1 v1.5、OAEP格式),完全没有考虑ECIES这类需要结合对称加密的混合算法逻辑。
支持的算法类型天差地别
SecKeyCreateEncryptedData支持ECIES这类混合加密算法(像你用的eciesEncryptionStandardX963SHA1AESGCM),这类算法需要同时处理非对称密钥交换和对称数据加密,API内部已经帮你做了所有细节。SecKeyEncrypt仅支持纯非对称加密算法,比如SecKeyAlgorithm.rsaEncryptionPKCS1、SecKeyAlgorithm.rsaEncryptionOAEPSHA1这类,ECIES算法不在它的支持列表里。
参数要求完全不兼容
ECIES加密需要额外的参数(比如密钥派生的哈希算法、对称加密的模式参数),这些参数是SecKeyCreateEncryptedData通过算法标识直接内置处理的,但SecKeyEncrypt的参数设计里根本没有预留这些信息的传递路径,强行传入ECIES算法标识必然会导致参数不匹配。
二、-50错误的根本原因
错误码-50对应的是errSecParam(参数无效)。当你给SecKeyEncrypt传入eciesEncryptionStandardX963SHA1AESGCM这个算法时,API会检测到这个算法不在它支持的范围内,直接判定参数无效,所以返回-50错误。
总结
如果你要使用ECIES算法进行加密,必须使用SecKeyCreateEncryptedData(解密对应SecKeyCreateDecryptedData),旧的SecKeyEncrypt/SecKeyDecrypt从设计上就不支持这类混合加密算法,没有办法通过调整参数让它正常工作。
内容的提问来源于stack exchange,提问作者vineeth
相关产品推荐
相关产品推荐

