我正在阅读此 Apple 文档并尝试应用它:
https://developer.apple.com/documentation/cryptokit/sharedsecret
它说:
共享密钥本身不适合作为对称加密密钥(SymmetricKey)。但是,您可以通过调用共享密钥的 hkdfDerivedSymmetricKey(using:salt:sharedInfo:outputByteCount:) 或 x963DerivedSymmetricKey(using:sharedInfo:outputByteCount:) 方法来使用它来生成密钥。在另一方执行相同操作后,你们双方共享一个对称密钥,该对称密钥适用于创建消息身份验证代码(如 HMAC),或用于使用 ChaChaPoly 或 AES 等密码打开和关闭密封盒子。
当我点击
x963DerivedSymmetricKey(using:sharedInfo:outputByteCount:)
的链接时:
它说:
sharedInfo:用于密钥派生的共享信息。
outputByteCount:生成的对称密钥的长度(以字节为单位)。
我对这两个参数感到困惑。
sharedInfo
和 outputByteCount
到底应该传递什么?
我能找到的唯一例子在这里:
https://gist.github.com/mehmeteminkartal/e2d1ee56526dc032b7257aef80c40d16
但我认为这个例子可能不正确,因为它通过
bobPublicKey.rawRepresentation
为 sharedInfo
为 alice_key
和 bobs_key
。也不确定为什么它通过 16
为 outputByteCount
。
有人可以解释一下这些吗?
x963DerivedSymmetricKey
使用 ANSI X9.63 指定的标准执行密钥派生 (KDF)。
sharedInfo
是在密钥生成过程中添加的额外数据,以使生成的密钥唯一且特定于特定用途或会话。它可以包括正在使用的协议、会话标识符或目的字符串等详细信息。这确保了即使使用相同的共享密钥,派生密钥也是不同的并且针对特定上下文进行定制。
outputByteCount
参数确定派生密钥将具有的字节数。根据实现的不同,该参数可能受到限制(即基于所使用的底层哈希函数);我不确定它对 Swift 来说意味着什么。建议在此处设置一个反映您稍后要使用的对称密钥的数字:
// 32 bytes or 256 bits, safe for AES-256
let symmetricKey = try sharedSecret.x963DerivedSymmetricKey(
using: SHA256.self,
sharedInfo: Data(),
outputByteCount: 32
)
// Or you can use the SymmetricKeySize
let symmetricKey = try sharedSecret.x963DerivedSymmetricKey(
using: SHA256.self,
sharedInfo: Data(),
outputByteCount: SymmetricKeySize.bits256.bitCount / 8
)