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 添加到此库及其 golang 对应库 (calmdocs/keyexchange) 中。