ECC Curve25519 密钥链

3

我试图使用iOS上的KeyChain创建Curve25519密钥。我知道CryptoKit的存在,但不幸的是,它不适用于iOS 12。在没有CryptoKit的情况下,是否有一种方法可以创建Curve25519密钥,也许是在生成时缺少的参数?下面的代码仅生成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())
1个回答

4

苹果的旧核心加密库 CommonCrypto 不支持现代曲线,如 curve25519,而且混乱不堪,充斥着不安全的密码,甚至对实际使用的曲线方程也不清楚。

此外,虽然 CryptoKit 支持 curve25519 进行密钥交换,但它仍然受到限制,例如您不能使用“安全区域”生成 curve25519 密钥,只能使用 P-256,这很可能被后门攻击(只需查看曲线系数),尽管所有金融机构似乎都很喜欢它。

最终,curve25519 私钥只是一个大的(2^256)数字(在使用之前进行了“夹紧”),因此,如果您只需要生成密钥,则可以使用 SecRandomCopyBytes

虽然我怀疑您想要进行一些X25519KEX或EdDSA签名,使用25519,那么只需使用libsodium。这是用于NaCl的库,有一个真正棒极了的接口在Swift中编写,由原始的libsodium作者称为swift-sodium,我已经使用它,非常好。 它还支持iOS 12 +。

libsodium中生成curve25519中的密钥很简单:

import Sodium

let sodium = Sodium()
let curve25519KeyPair = sodium.box.keyPair()
let privateKey = curve25519KeyPair!.secretKey
let publicKey = curve25519KeyPair!.publicKey

你可以手动将其存储在 KeyChain 中。
如果需要进一步帮助,请大声喊出来。使用 25519 是个好选择。

1
感谢您的回答。很遗憾在iOS 12之前,苹果没有提供原生支持。我同意CommonCrypto库的混乱。好吧,我想这让我别无选择,只能使用一些外部项目,比如libsodium! - Bram
非常欢迎您,@Bram。如果您有其他问题,请随时联系我。 - Woodstock
有什么建议可以在这里添加一些官方的内容吗? - kelalaka
"只需看一下曲线系数即可" - lionello
41058363725152142129326129780047268409114441015993725554835256314039467401291 对比 7 - Woodstock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接