ECC gêmeo diversificar

Nov 10 2020

Durante minha implementação do CommonCrypto no iOS, percebi que há uma função chamada CCECCryptorTwinDiversifyKeycuja descrição é:

Diversifica uma determinada chave EC derivando dois escalares $u,v$ da entropia dada.

Mas a descrição me deixou adivinhando o que a função faz ou quando é usada. Procurando por "EC diversify" e "EC twin diversify" na Internet também não obtive resultados. Portanto, minha pergunta é: O que é diversificação de gêmeos quando falamos sobre chaves EC e quando são usadas?

Respostas

2 kelalaka Nov 10 2020 at 20:01

The Twin Diversify

Só consegui encontrar uma fonte; o código-fonte aberto do Apples 'CommonCrypto. Tudo de CommonECCryptor.h

@function   CCECCryptorTwinDiversifyKey

@abstract   Diversifies a given EC key by deriving two scalars u,v from the
            given entropy.

@discussion entropyLen must be a multiple of two, greater or equal to two
            times the bitsize of the order of the chosen curve plus eight
            bytes, e.g. 2 * (32 + 8) = 80 bytes for NIST P-256.

            Use CCECCryptorTwinDiversifyEntropySize() to determine the
            minimum entropy length that needs to be generated and passed.

            entropy must be chosen from a uniform distribution, e.g.
            random bytes, the output of a DRBG, or the output of a KDF.

            u,v are computed by splitting the entropy into two parts of
            equal size. For each part t (interpreted as a big-endian number),
            a scalar s on the chosen curve will be computed via
            s = (t mod (q-1)) + 1, where q is the order of curve's
            generator G.

            For a public key, this will compute u.P + v.G,
            with G being the generator of the chosen curve.

            For a private key, this will compute d' = (d * u + v) and
            P = d' * G; G being the generator of the chosen curve.

Casos de uso

A diversificação é necessária quando queremos algum nível de anonimato, que é como nas CryptoCurrencies, se você usar a mesma chave pública você estará conectado o tempo todo. Se você pode diversificar sua chave pública com sua chave privada / pública, então você pode usar a nova identidade diversificada e não pode ser facilmente vinculado à sua identidade original.

No esquema acima, a nova chave pública que é diversificada com $u$ e $v$ será $$[u]P + [v]G$$ e a chave privada diversificada será

$$d' = (d \cdot u + v)$$ e verificar a diversificada chave pública

$$P' = [d']G = [d \cdot u + v]G = [d \cdot u]G + [v]G = [u]P + [v]G $$

Em suma, você tem uma nova identidade, mas por trás da cortina, ainda é você.

Quantas pessoas podem diversificar com segurança?

Para responder, precisamos de algumas suposições, deixe que os usuários possam gerar $u,v$ uniforme aleatoriamente - isso é crucial -, há $2^{30}$ usuário do sistema - pouco mais de um bilhão -, e cada usuário diversificou $2^{20}$ vezes em sua vida - isso é pouco mais de um milhão -.

Agora vamos usar o cálculo clássico de aniversário para ver a probabilidade de uma colisão para uma curva que pode ter cerca de $2^{256}$ chaves públicas.

Usaremos o fato de que a probabilidade de colisão entre uniformes selecionados aleatoriamente $k$ elementos no conjunto de $n$ elementos podem ser aproximados por

$$(2^{k})^2/2^{n}/2=2^{2k-n-1}$$

Nosso $k = 2^{50}$ e $n = 2^{256}$, então;

$$(2^{50})^2/2^{256}/2 = 2^{100 - 256 - 1} = 1/2^{157}.$$

Quando a probabilidade de colisão é próxima $1/2^{100}$simplesmente dizemos que isso não vai acontecer. Portanto, uma colisão não vai acontecer para curvas de 256 bits como P-256 ou Curve25519.

Qual é a vantagem disso em vez de apenas criar uma nova identidade?

A principal diferença é que você pode facilmente provar que essa identidade está conectada à identidade inicial fornecendo o $u$ e $v$. Conectar uma identidade aleatória com sua identidade inicial é igual ao problema Dlog.


Nota: Não consegui encontrar o artigo acadêmico por trás dessa ideia. Eu ficaria feliz se alguém contar.