4

我试图使用 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, 0, 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)
4

1 回答 1

0

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

事实上,CryptoKit是 Apple 尝试以一种libsodium为精心挑选的原语提供简单接口的风格对这里的事物进行现代化的尝试,例如安全曲线上的椭圆曲线 Diffie-Hellman。

所以我很同情,并建议通常只libsodium在你需要 iOS/macOS 上的加密时使用。

无论如何,希望能回答您的问题,我在 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,
        SecKeyKeyExchangeParameter.sharedInfo.rawValue : ???]
    let secret = SecKeyCopyKeyExchangeResult(privateOwn,
            SecKeyAlgorithm.ecdhKeyExchangeStandardX963SHA256,
            publicTheir,
            dict as CFDictionary,
            &keyExchangeError)

由于我在 Linux 机器 atm 上,我没有测试过上述内容,但希望它有所帮助,它应该将基于 SHA256 的 KDF 添加到 ECDH 进程中。但是,是的,API 真是一团糟。我只是无法使用它。

于 2020-09-08T07:44:19.853 回答