ECC Curve25519 KeyChain

Oct 22 2020

iOSのKeyChainを使用してCurve25519キーを作成しようとしています。残念ながら、iOS 12では使用できないCryptoKitの存在を認識しています。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())

回答

4 Woodstock Oct 23 2020 at 15:09

Appleの古いコア暗号化ライブラリは、のCommonCryptoような最新の曲線をサポートしておらずcurve25519、率直に言って、安全でない暗号が散らばっている完全な混乱であり、使用されている実際の曲線方程式についてさえ明確ではありません。

さらに、鍵交換のCryptoKitサポートcurve25519はありますが、それでも制限があります。たとえば、「Secure Enclave」を使用してcurve25519鍵を生成することはできませんP-256。これは、すべての金融機関が愛しているように見えますが、バックドアされている可能性があります(曲線係数を見てください)。それ。

最終的に、curve25519秘密鍵は(2^256使用前に「クランプ」されますが)大きな()数であるため、鍵を生成する必要がある場合は、を使用してこれを行うことができますSecRandomCopyBytes。

ただし、X25519KEXまたはEdDSA署名をやりたいと思う場合は、を25519使用してくださいlibsodium。これはgotoライブラリですNaCl。元の作者によって書かれた、と呼ばれる非常に優れたインターフェイスがあります。私はそれを使用しましたが、すばらしいです。iOS12以降もサポートしています。Swiftlibsodiumswift-sodium

libsodiumforのキーの生成curve25519は、次のように簡単です。

import Sodium

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

その後、KeyChainに手動で保存できます。

さらにヘルプが必要な場合は叫び、を使用して適切な選択をしてください25519。