ECC Curve25519 KeyChain

Oct 22 2020

Sto cercando di creare chiavi Curve25519 usando KeyChain su iOS. Sono a conoscenza dell'esistenza di CryptoKit, purtroppo non è disponibile per iOS 12. C'è un modo per creare una chiave Curve25519 pre CryptoKit, forse un parametro che mi manca durante la generazione nel KeyChain? Il codice seguente genererà solo le chiavi 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())

Risposte

4 Woodstock Oct 23 2020 at 15:09

La vecchia libreria crittografica di Apple CommonCryptonon supporta curve moderne come curve25519e francamente è un disastro totale, disseminato di cifre non sicure, non sono nemmeno chiare sulle effettive equazioni delle curve utilizzate.

Inoltre, sebbene CryptoKitsupporti curve25519per lo scambio di chiavi, è ancora limitato, ad esempio, non è possibile utilizzare "Secure Enclave" solo per generare curve25519chiavi P-256, il che è probabilmente backdoor (basta guardare i coefficienti della curva), nonostante tutte le istituzioni finanziarie apparentemente amorevoli esso.

In definitiva una curve25519chiave privata è solo un 2^256numero grande ( ) (sebbene sia "bloccato" prima dell'uso), quindi se hai solo bisogno di generare chiavi, puoi farlo con SecRandomCopyBytes.

Tuttavia, se, come sospetto, vuoi fare un po 'di X25519KEX o EdDSAfirma 25519, allora usa libsodium. E 'la libreria goto per NaCl, c'è una davvero grande interfaccia Swiftscritto l'originale libsodiumdell'autore, chiamato swift-sodium, l'ho usato ed è grande. Supporta anche iOS 12+.

La generazione di chiavi libsodiumper curve25519è semplice come:

import Sodium

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

È quindi possibile memorizzare manualmente in KeyChain.

Grida se hai bisogno di ulteriore aiuto e buona scelta usando 25519.