ios SecKeyCopyKeyExchangeResult sharedInfo 参数

标签 ios cryptography ecdh kdf

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

@constant kSecKeyKeyExchangeParameterSharedInfo Contains CFDataRef with additional shared info for KDF (key derivation function).


如果有人处理过这个问题,请帮忙。服务器使用此参数在 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)

最佳答案

你说得对,我的 friend ,关于 Security Framework 的文档糟糕透了。
确实 CryptoKit是 Apple 尝试在 libsodium 中对这里的事物进行现代化改造吗?样式为精心挑选的基元提供简单的接口(interface),例如安全曲线上的椭圆曲线 Diffie-Hellman。
所以我很同情,建议一般只用libsodium当你在 iOS/macOS 上需要加密时。
无论如何,希望能回答您的问题,我在 SecKit 库中发现了一个与您似乎在 Scala 中使用的内容相匹配的内容,在 Diffie-Hellman 进程之后,您正在通过 SHA256 运行关键 Material 在服务器端,所以 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 真是一团糟。我只是无法使用它。

关于ios SecKeyCopyKeyExchangeResult sharedInfo 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63789068/

相关文章:

ios - 如何在子文件夹中运行 FaSTLane 操作

ios - 如何在 NSInvocationOpreation 中传递对象

ios - iOS 中的谷歌页面排名

c# - 如何从 C# 中的 pvk 文件中读取私钥?

android - bouncycaSTLe 中的 NoSuchMethodError

cryptography - Solidity:插入符号 ^ 运算符有什么作用?

Java/Android - ECDH 加密 - 从字符串创建 ECPublicKey

ios - #define 的问题 - "="标记之前的预期表达式

java - 使用现有的外部公钥从 ECDH 导出共享 secret

vb.net - NIST p256 点解压 : Finding Y-Coordinate For Base Point