ECDSA anahtarı körleştirme

Proposal 151
Açık
Author orignal
Created 2019-05-21
Last Updated 2019-05-29

Motivasyon

Bazı insanlar EdDSA veya RedDSA’yı sevmiyor. Onlara bazı alternatifler sunmalıyız ve ECDSA imzalarını körleştirmelerine izin vermeliyiz.

Genel Bakış

Bu öneri, ECDSA imza türleri 1, 2, 3 için anahtar körleştirmesini açıklar.

Öneri

RedDSA ile aynı şekilde çalışır, ancak her şey Big Endian şeklindedir. Sadece aynı imza türlerine izin verilir, örneğin 1->1, 2->2, 3->3.

Tanımlar

B Eğrinin temel noktası

L Eliptik eğrinin grup düzeni. Eğrinin özelliği.

DERIVE_PUBLIC(a) B’yi bir eliptik eğri üzerinden çarparak bir özel anahtarı halka çevirin

alpha Hedefi bilenlerce bilinen 32 baytlık rastgele sayı.

GENERATE_ALPHA(destination, date, secret) Hedefi ve sırrı bilenler için geçerli tarih için alpha üretin.

a Hedefi imzalamak için kullanılan körleşmemiş 32 baytlık imzalama özel anahtarı

A Hedefteki körleşmemiş 32 baytlık imzalama halka anahtarı, = DERIVE_PUBLIC(a), ilgili eğride olduğu gibi

a' Şifreli kiralama setini imzalamak için kullanılan körleşmiş 32 baytlık imzalama özel anahtarı Bu geçerli bir ECDSA özel anahtarıdır.

A' Hedefteki körleşmiş 32 baytlık ECDSA imzalama halka anahtarı, DERIVE_PUBLIC(a’) ile veya A ve alpha’dan üretilebilir. Bu eğride geçerli bir ECDSA halka anahtarıdır.

H(p, d) Hedef kelime öbeği p ve veri d’yi alan ve 32 bayt uzunluğunda bir çıktı üreten SHA-256 hash fonksiyonu.

SHA-256 aşağıdaki gibi kullanılır::

    H(p, d) := SHA-256(p || d)

HKDF(salt, ikm, info, n) İyi bir entropiye sahip olması gereken bazı giriş anahtar materyallerini ikm (yerine tekdüze rastgele bir dize olmak zorunda değildir), 32 bayt uzunluğunda bir tuz ve bağlama özgü bir ‘info’ değerini alan ve anahtar materyali olarak kullanım için uygun n baytlık bir çıktı üreten kriptografik anahtar türetme fonksiyonu.

[RFC-5869](https://tools.ietf.org/html/rfc5869)'da belirtilen şekilde, [RFC-2104](https://tools.ietf.org/html/rfc2104)'te belirtilen HMAC hash fonksiyonu SHA-256 kullanarak hesaplarsanız. Bu, SALT_LEN'in maksimum 32 bayt olduğu anlamına gelir.

Körleştirme Hesaplamaları

Her gün (UTC) yeni bir gizli alpha ve körleşmiş anahtarlar üretilmelidir. Gizli alpha ve körleşmiş anahtarlar aşağıdaki gibi hesaplanır.

GENREATE_ALPHA(destination, date, secret), tüm taraflar için:

// GENERATE_ALPHA(destination, date, secret)

  // secret isteğe bağlıdır, aksi takdirde sıfır uzunluğunda
  A = hedefin imzalama halka anahtarı
  stA = A'nın imza tipi, 2 baytlık big endian (0x0001, 0x0002 veya 0x0003)
  stA' = körleşmiş halka anahtar A'nın imza tipi, 2 baytlık big endian, her zaman stA ile aynı
  keydata = A || stA || stA'
  datestring = geçerli tarihten UTC 8 baytlık ASCII YYYYMMDD
  secret = UTF-8 kodlanmış dize
  seed = HKDF(H("I2PGenerateAlpha", keydata), datestring || secret, "i2pblinding1", 64)
  // seed'i 64 baytlık big-endian değer olarak ele alın
  alpha = seed mod L

BLIND_PRIVKEY(), kira setini yayımlayan sahip için:

// BLIND_PRIVKEY()

  alpha = GENERATE_ALPHA(destination, date, secret)
  a = hedefin imzalama özel anahtarı
  // Skalare aritmetik kullanılarak toplama
  körleşmiş imzalama özel anahtarı = a' = BLIND_PRIVKEY(a, alpha) = (a + alpha) mod L
  körleşmiş imzalama halka anahtarı = A' = DERIVE_PUBLIC(a')

BLIND_PUBKEY(), kira setini alan istemciler için:

// BLIND_PUBKEY()

  alpha = GENERATE_ALPHA(destination, date, secret)
  A = hedefin imzalama halka anahtarı
  // Grup elemanları (eğri üzerindeki noktalar) kullanılarak toplama
  körleşmiş halka anahtarı = A' = BLIND_PUBKEY(A, alpha) = A + DERIVE_PUBLIC(alpha)

Her iki A’ hesaplama yöntemi de gerektiği gibi aynı sonucu verir.

b33 adresi

ECDSA’nın halka anahtarı (X,Y) çifti olduğu için, örneğin P256 için 32 değil 64 bayttır. Ya b33 adresi daha uzun olacak ya da halka anahtar bitcoin cüzdanlarındaki gibi sıkıştırılmış formatta saklanabilir.

Referanslar