微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ios SecKeyCopyKeyExchangeResult sharedInfo参数

如何解决ios SecKeyCopyKeyExchangeResult sharedInfo参数

我正在尝试使用SecKeycopyKeyExchangeResult函数从我的本地私钥和收到的服务器公钥中获取共享密钥。 共享密钥已成功生成,我能够使用AES加密解密传入的消息 不久前,服务器开发人员决定将KDF添加到密钥生成流程中。 我开始研究如何在iOS上做到这一点,并发现有一个特殊的参数static let sharedInfo: SecKeyKeyExchangeParameter 说文档很差,什么也没说... 只有我发现的是标题中的描述

@constant kSecKeyKeyExchangeParameterSharedInfo包含CFDataRef 与其他共享信息 用于KDF(密钥派生功能)。

如果有人为此工作,请帮忙。服务器使用此参数在Scala上生成KDF

private def concatWithKdf(secretKey: SecretKey) = {
    val bytes = new Array[Byte](SECRET_KEY_LENGTH)
    val digest = new SHA256Digest();
    val kdf1BytesGenerator = new KDF1BytesGenerator(digest)
    kdf1BytesGenerator.init(new KDFParameters(secretKey.getEncoded,null))
    kdf1BytesGenerator.generateBytes(bytes,bytes.length)
    new SecretKeySpec(bytes,secretKey.getAlgorithm)
}

iOS端的代码

var keyExchangeError: Unmanaged<CFError>?
let dict = [SecKeyKeyExchangeParameter.requestedSize.rawValue : 32,SecKeyKeyExchangeParameter.sharedInfo.rawValue : ???]
    let secret = SecKeycopyKeyExchangeResult(privateOwn,SecKeyAlgorithm.ecdhKeyExchangeStandard,publicTheir,dict as CFDictionary,&keyExchangeError)

解决方法

您完全正确,我的朋友,Security Framework周围的文档非常糟糕。

实际上,CryptoKit是Apple尝试以libsodium样式对这里的事物进行现代化改造,从而为经过精心选择的图元提供了简单的界面,例如安全曲线上的椭圆曲线Diffie-Hellman。

因此,我很同情,建议您在iOS / macOS上需要加密时,通常只使用libsodium

无论如何,希望能回答您的问题,我在SecKit库中找到了一个与您似乎在Scala中使用的内容相匹配的提及,在Diffie-Hellman流程之后,您正在服务器上通过SHA256运行关键材料因此,iOS需要匹配此HBKDF。

 @constant kSecKeyAlgorithmECDHKeyExchangeCofactorX963SHA256
    Compute shared secret using ECDH cofactor algorithm,suitable only for kSecAttrKeyTypeECSECPrimeRandom keys
    and apply ANSI X9.63 KDF with SHA256 as hashing function.  Requires kSecKeyKeyExchangeParameterRequestedSize and allows
    kSecKeyKeyExchangeParameterSharedInfo parameters to be used.

所以我认为您只需要更改此内容即可:

var keyExchangeError: Unmanaged<CFError>?
let dict = [SecKeyKeyExchangeParameter.requestedSize.rawValue : 32,SecKeyKeyExchangeParameter.sharedInfo.rawValue : ???]
    let secret = SecKeyCopyKeyExchangeResult(privateOwn,SecKeyAlgorithm.ecdhKeyExchangeStandard,publicTheir,dict as CFDictionary,&keyExchangeError)

对此:

var keyExchangeError: Unmanaged<CFError>?
let dict = [SecKeyKeyExchangeParameter.requestedSize.rawValue : 32,SecKeyAlgorithm.ecdhKeyExchangeStandardX963SHA256,&keyExchangeError)

我尚未在Linux机器atm上进行上述测试,但希望它能有所帮助,它应该将基于SHA256的KDF添加到ECDH进程中。但是,是的,API真是一团糟。我只是不能使用它。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。