Krzywa ECC 25519 KeyChain

Oct 22 2020

Próbuję utworzyć klucze Curve25519 za pomocą KeyChain na iOS. Wiem o istnieniu CryptoKita, który niestety nie jest dostępny dla iOS 12. Czy istnieje sposób na utworzenie klucza Curve25519 przed CryptoKitem, może brakuje mi parametru podczas generowania go w KeyChain? Poniższy kod wygeneruje tylko klucze 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())

Odpowiedzi

4 Woodstock Oct 23 2020 at 15:09

Stara biblioteka kryptograficzna Apple CommonCryptonie obsługuje nowoczesnych krzywych, jak curve25519i szczerze mówiąc jest to totalny bałagan, zaśmiecony niezabezpieczonymi szyframi, nie są one nawet jasne, co do rzeczywistych równań krzywych.

Dodatkowo, chociaż CryptoKitobsługuje curve25519wymianę kluczy, jest nadal ograniczona, na przykład nie można użyć „Bezpiecznej enklawy” do generowania curve25519kluczy, tylko P-256, co jest prawdopodobnie backdoorowane (wystarczy spojrzeć na współczynniki krzywej), mimo że wszystkie instytucje finansowe wydają się to.

Ostatecznie curve25519klucz prywatny to po prostu duża ( 2^256) liczba (chociaż jest „zaciśnięta” przed użyciem), więc jeśli potrzebujesz tylko wygenerować klucze, możesz to zrobić za pomocą SecRandomCopyBytes.

Chociaż, jeśli podejrzewam, że chcesz zrobić X25519KEX lub EdDSApodpis ponownie 25519, po prostu użyj libsodium. To biblioteka goto dla NaCl, jest naprawdę świetny interfejs Swiftnapisany przez oryginalnego libsodiumautora, o nazwie swift-sodium, użyłem go i jest świetny. Obsługuje również iOS 12+.

Generowanie kluczy w libsodiumfor curve25519jest tak proste, jak:

import Sodium

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

Następnie możesz ręcznie zapisać w KeyChain.

Krzycz, jeśli potrzebujesz dalszej pomocy i dobrego wyboru przy użyciu 25519.