Llavero ECC Curve25519

Oct 22 2020

Estoy tratando de crear claves Curve25519 usando KeyChain en iOS. Soy consciente de la existencia de CryptoKit, desafortunadamente, que no está disponible para iOS 12. ¿Hay alguna manera de crear una clave Curve25519 antes de CryptoKit, tal vez un parámetro que me falta al generarlo en KeyChain? El siguiente código solo generará las claves 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())

Respuestas

4 Woodstock Oct 23 2020 at 15:09

La biblioteca de cifrado del núcleo antiguo de Apple CommonCryptono admite curvas modernas como curve25519y, francamente, es un desastre total, lleno de cifrados inseguros, ni siquiera están claras sobre las ecuaciones de curva reales que se utilizan.

Además, aunque la CryptoKitcompatibilidad curve25519con el intercambio de claves, sigue siendo limitada, por ejemplo, no se puede usar el "Enclave seguro" para generar curve25519claves, solo P-256, lo que probablemente esté oculto (solo mire los coeficientes de la curva), a pesar de que todas las instituciones financieras aparentemente adoran eso.

En última instancia, una curve25519clave privada es solo un número grande ( 2^256) (aunque está "sujeto" antes de su uso), por lo que si solo necesita generar claves, puede hacerlo con SecRandomCopyBytes.

Sin embargo, si sospecho que desea hacer un X25519KEX o una EdDSAfirma 25519, simplemente use libsodium. Es la biblioteca de goto NaCl, hay una interfaz realmente excelenteSwift escrita por el libsodiumautor original , llamada swift-sodium, la he usado y es genial. También es compatible con iOS 12+.

Generar claves libsodiumpara curve25519es tan simple como:

import Sodium

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

Luego puede almacenar manualmente en KeyChain.

Grita si necesitas más ayuda y una buena elección al usar 25519.