ECC曲线25519钥匙链

问题描述

我正在尝试使用iOS上的KeyChain创建Curve25519键。不幸的是,我知道CryptoKit的存在,但不适用于iOS12。有没有办法在CryptoKit之前创建Curve25519密钥,也许是在KeyChain中生成它时缺少的参数?下面的代码只会生成P-256密钥。

let attributes: [String: Any] = [
    String(kSecclass): kSecclassKey,String(kSecAttrKeyType): kSecAttrKeyTypeECSECPrimeRandom,String(kSecAttrKeySizeInBits): 256
]

var error: Unmanaged<CFError>?
let privateKey = SecKeyCreaterandomKey(attributes as CFDictionary,&error)
print(privateKey ?? error!.takeUnretainedValue())

解决方法

Apple的旧核心加密库CommonCrypto不支持像curve25519这样的现代曲线,坦率地说,这是一团糟,杂乱无章的密码,甚至在实际的曲线方程式上都不清楚使用。

此外,尽管CryptoKit支持curve25519进行密钥交换,但是它仍然受到限制,例如,您不能使用“ Secure Enclave”来生成curve25519密钥,只能使用{{1} },尽管所有金融机构似乎都喜欢它,但它很可能是借壳的(只看曲线系数)。

最终,P-256私钥只是一个大(curve25519)数字(尽管在使用前已“钳制”),所以如果您只需要生成密钥,则可以使用{ {1}}。

但是,如果我怀疑您想对2^256做一些SecRandomCopyBytes KEX或X25519签名,则只需使用EdDSA。它是25519的goto库,在libsodium中有一个really great接口,该接口由原始NaCl的作者Swift编写,我已经使用了它,并且这很棒。 它还支持iOS 12 +。

libsodium中为swift-sodium生成密钥很简单:

libsodium

然后您可以手动将其存储在KeyChain中。

如果需要进一步的帮助,请大声喊叫,使用curve25519是个不错的选择。