ECC Curve25519 KeyChain

Oct 22 2020

Estou tentando criar chaves Curve25519 usando o KeyChain no iOS. Estou ciente da existência do CryptoKit, infelizmente, que não está disponível para iOS 12. Existe uma maneira de criar uma chave Curve25519 pré-CryptoKit, talvez um parâmetro que estou faltando ao gerá-lo no KeyChain? O código abaixo irá gerar apenas as chaves 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())

Respostas

4 Woodstock Oct 23 2020 at 15:09

O antigo núcleo de criptografia da Apple CommonCryptonão suporta curvas modernas como curve25519e, francamente, é uma bagunça total, repleto de cifras inseguras, eles não são nem mesmo claros sobre as equações de curva reais que estão sendo usadas.

Além disso, embora CryptoKitsuporte curve25519para troca de chaves, ainda é limitado, por exemplo, você não pode usar o "Enclave Seguro" para gerar curve25519chaves, apenas P-256, o que provavelmente é backdoor (basta olhar para os coeficientes de curva), apesar de todas as instituições financeiras aparentemente amarem isto.

Em última análise, uma curve25519chave privada é apenas um 2^256número grande ( ) (embora seja "preso" antes do uso), portanto, se você só precisa gerar chaves, pode fazer isso com SecRandomCopyBytes.

Porém, se como eu suspeito que você deseja fazer algum X25519KEX ou EdDSAassinatura 25519, então é só usar libsodium. É a biblioteca goto NaCl, há uma interface realmente ótimaSwift escrita pelo libsodiumautor original , chamada swift-sodium, eu a usei e é ótima. Ele também suporta iOS 12+.

Gerar chaves em libsodiumfor curve25519é tão simples quanto:

import Sodium

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

Você pode então armazenar manualmente no KeyChain.

Grite se precisar de mais ajuda e escolha boa usando 25519.