SwiftKeyExchange

Swift Diffie–Hellman 密钥交换 (DHKE) 库,使用 Apple CryptoKit Framework 构建。

旨在镜像 golang 的 calmdocs/keyexchange 库。 例如,我们在该库中使用与 golang 的 calmdocs/keyexchange 库相同的测试密钥、nonce 和结果。

关于安全性的说明

在创建此库时,我们尽可能地保守。 请参阅下面的安全讨论。 但是,请注意,您使用此库以及此存储库中的代码的风险自负,我们对其使用不承担任何责任。

示例

let curve = KeyExchangeCurve.curve25519
let hashFunction = SHA256.self
let kdf = KeyExchangeKDF.hkdf
let aead = KeyExchangeAEAD.aesgcm

let plaintext = "exampleplaintext".data(using: .utf8)!
let additionalData = Data("abc".utf8)

// alice store
let aliceStore = try KeyExchangeStore(
    curve: curve,
    using: hashFunction,
    kdf: kdf,
    aead: aead,
    externalPublicKey: "" // a new public key is created if this string is left empty
)

// bob store
let bobStore = try KeyExchangeStore(
    curve: curve,
    using: hashFunction,
    kdf: kdf,
    aead: aead,
    externalPublicKey: "", // a new public key is created if this string is left empty
)

// Add private keys to the stores.
try! aliceStore.setExternalPublicKey(bobStore.LocalPublicKey())
try! bobStore.setExternalPublicKey(aliceStore.LocalPublicKey())

// Alice encrypt.
var v = try! aliceStore.encrypt(
    plaintext: plaintext,
    additionalData: additionalData
)

// Bob decrypt.
let bobPlaintext = try bobStore.decrypt(
    kdfNonce: v.kdfNonce,
    ciphertext: v.ciphertext,
    aeadNonce: v.aeadNonce,
    additionalData: v.additionalData
)

// Bob encrypt.
v = try! bobStore.encrypt(
    plaintext: plaintext,
    additionalData: additionalData
)

// Alice decrypt.
let alicePlaintext = try aliceStore.decrypt(
    kdfNonce: v.kdfNonce,
    ciphertext: v.ciphertext,
    aeadNonce: v.aeadNonce,
    additionalData: v.additionalData
)

print(plaintext == alicePlaintext)
print(plaintext == bobPlaintext)

安全方法

如上所述,在创建此库时,我们尽可能地保守。 例如,我们只使用了 Apple 的 Cryptokit 库,而没有使用任何第三方加密库来创建此包。 我们将尝试遵循 SemVer,但如果存在安全问题和/或此库使用的底层加密技术随着时间的推移变得不安全,则可能不会遵循。

如有任何安全问题,请创建 github issue 通知我们。 请提出您希望如何安全地与我们沟通(通过电子邮件或其他沟通方式)。 请不要在 github 上发布安全问题。

为什么不直接使用 HPKE?

因为

我们可能会在某个时候将 HPKE 添加到此库及其 golang 对应库 (calmdocs/keyexchange) 中。