【问题标题】:ECC Curve25519 KeyChainECC曲线25519钥匙串
【发布时间】:2020-10-22 07:11:08
【问题描述】:

我正在尝试使用 iOS 上的 KeyChain 创建 Curve25519 键。我知道 CryptoKit 的存在,不幸的是,它不适用于 iOS 12。有没有办法在 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())

【问题讨论】:

    标签: ios swift keychain elliptic-curve curve-25519


    【解决方案1】:

    Apple 的旧核心加密库 CommonCrypto 不支持像 curve25519 这样的现代曲线,坦率地说,这完全是一团糟,到处都是不安全的密码,甚至不清楚所使用的实际曲线方程。

    另外,虽然CryptoKit支持curve25519进行密钥交换,但还是有限制的,例如不能使用“Secure Enclave”生成curve25519密钥,只能使用P-256,这很可能是后门的(只是看看曲线系数),尽管所有金融机构似乎都喜欢它。

    最终,curve25519 私钥只是一个很大的 (2^256) 数字(虽然它在使用前被“夹紧”),所以如果你只需要生成密钥,你可以使用 SecRandomCopyBytes 来完成。

    不过,如果我怀疑你想在25519 上做一些X25519 KEX 或EdDSA 签名,那么只需使用libsodium。就是NaCl的goto库,Swift里面有一个really great接口是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 是不错的选择。

    【讨论】:

    • 感谢您的回答。遗憾的是,Apple 在 iOS 12 之前没有原生支持。我同意 CommonCrypto 库的混乱。好吧,我想这让我别无选择,只能使用一些外部项目,例如 libsodium!
    • 非常欢迎您@Bram,HMU,如果您有任何其他问题。
    • 有什么建议可以添加一些我可以在官方找到的here
    猜你喜欢
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    相关资源
    最近更新 更多