Na tej stronie opisano format przewodu Tink dla kluczy i podstawowych danych wyjściowych. jest przeznaczona dla kryptografii, którzy chcą dodać więcej języków Tink i opiekunowie innych wysokopoziomowych bibliotek kryptograficznych, którzy szukają przewodów trybu zgodności. Nie jest przeznaczona dla wszystkich odbiorców.
Serializacja zestawu kluczy
Tink używa protokołu Google do zserializacji swoich zbiorów kluczy.
- Plik binarny zserializowany to proto zserializowanego zbioru kluczy zdefiniowane w tink.proto. Właściwość wartości klucza jest zserializowany odpowiedniego typu klucza.
- Zserializowany zbiór kluczy JSON to zserializowany zestaw kluczy w formacie JSON. Pamiętaj, że wartość KeyData to nadal binarny zserializowany protokół.
- Zaszyfrowany zbiór kluczy to zserializowany protokół EncryptedKeyst zdefiniowany w tink.proto. Zawiera zaszyfrowany zserializowany zestaw kluczy binarnych i opcjonalnie niektóre niezaszyfrowane metadane KeysetInfo.
Prefiks danych wyjściowych Tink
Większość podstawowych elementów Tink obsługuje 5-bajtowy prefiks danych wyjściowych składający się z:
- Wersja 1-bajtowa:
0x01
- 4-bajtowa wskazówka do klucza: to jest identyfikator używanego klucza.
Niektóre starsze klucze mogą też obsługiwać bajt wersji 0x00
.
Pamiętaj, że ten prefiks nie jest uwierzytelniony i nie można na nim polegać ze względów bezpieczeństwa w celach informacyjnych. Tink wykorzystuje go jako wskazówkę, która pozwala przyspieszyć odszyfrowywanie lub weryfikację.
AEAD
Ogólnie Tink formatuje szyfry AEAD w ten sposób:
prefix || IV || ciphertext || tag
o ile nie określono inaczej w odpowiednim dokumencie RFC. Pole prefix
jest puste
lub 5-bajtowy prefiks danych wyjściowych Tink.
AES-CTR-HMAC
W przypadku AES-CTR-HMAC Tink oblicza MAC z powiązanymi danymi (AD) w ten sposób:
AD || IV || ciphertext || bitlen(AD)
gdzie bitlen(AD)
to długość reklamy w bitach przedstawiona jako 64-bitowy big-endian.
liczba całkowita bez znaku. Ten schemat HMAC jest zgodny z wersją roboczą AES-CBC-HMAC od
Mcgrew.
Deterministyczny AEAD
Tink stosuje standard RFC 5297 dla AES-SIV, umieszczając kod syntetyczny wektora inicjującego (SIV) na początku tekstu zaszyfrowanego. Obiekt podstawowy może dodać 5-bajtowy prefiks danych wyjściowych Tink.
Choć RFC 5297 obsługuje listę powiązanych danych, Tink obsługuje tylko ściśle 1 powiązane dane, które odpowiada liście z jednym elementem zgodnie ze standardem RFC 5297. Puste powiązane dane to lista zawierająca 1 pusty element z listy.
Strumieniowe przesyłanie AEAD
Patrz: AES-CTR HMAC i AES-GCM-HKDF
Szyfrowanie danych koperty
Szyfrowanie w kopercie szyfruje dane kluczem szyfrowania danych DEK
przy użyciu
Podstawowe funkcje AEAD Tink. Szyfrowanie działa w ten sposób:
- Na podstawie danego szablonu klucza (lub kluczowych parametrów) zostanie wygenerowany nowy
DEK
. - Pole
DEK
jest zserializowane w ciągu bajtów. Format serializacji serializacja bufora protokołu o typie klucza proto. Jest to na przykład zserializowany komunikat bufora protokołuAesGcmKey
zdefiniowany w aes_gcm.proto dla klucza DEK typu AES GCM. Sposób serializowania znajdziesz w sekcji o serializacji bufora protokołu. bufor protokołu. - Zserializowany plik
DEK
jest szyfrowany przez dostawcę zewnętrznego (na przykład GCP), wencrypted DEK
. - Interfejs
DEK
służy do szyfrowania zwykłego tekstu z powiązanymi danymi wciphertext
Zatemciphertext
ma dokładnie ten sam format co obiekt podstawowy AEAD odpowiadającyDEK
.
Format wyjściowy szyfrowania danych koperty jest następujący:
encrypted DEK length || encrypted DEK || ciphertext
encrypted DEK length
ma 4 bajty i przechowuje długość encrypted DEK
jako 32-bitowa liczba całkowita bigendian.
MAC
Tink jest zgodny z odpowiednimi RFC. Elementy podstawowe mogą dodawać 5-bajtowe dane wyjściowe Tink do tagu.
Zbiór PRF
Tink jest zgodny z odpowiednimi RFC. Należy pamiętać, że dla zestawu PRF typ klucza różni się z typu klucza MAC tego samego algorytmu, nie uwzględniając długości wyjściowej. Klucze zestawu PRF nigdy nie dodają prefiksu danych wyjściowych Tink. Dzięki temu dane wyjściowe będą PRF.
Szyfrowanie hybrydowe
Ogólny format przewodu w szyfrowaniu hybrydowym Tink jest następujący:
prefix || encapsulated_key || encrypted_data
Pole prefix
jest puste lub zawiera 5-bajtowy prefiks danych wyjściowych Tink. Każdy typ klucza zawiera
(liczba bajtów do przeanalizowania i sposobu ich analizy)
encapsulated_key
HPKE (hybrydowe szyfrowanie klucza publicznego)
Tink jest zgodny ze standardem HPKE zdefiniowanym w RFC 9180. Zestaw szyfrów HPKE zawiera 3 poniższe podstawowe elementy.
- Mechanizm hermetyzacji klucza (KEM)
- Funkcja derywacji klucza (KDF)
- Uwierzytelnione szyfrowanie z powiązanymi danymi (AEAD)
Standard HPKE nie definiuje ogólnego formatu przewodu w sekcji RFC 9180, w sekcji
10. Implementacja HPKE w Tink wykorzystuje ten
encapsulated_key
i encrypted_data
.
encapsulated_key
- Zserializowany klucz publiczny nadawcy
- Zdefiniowano jako
enc
w RFC 9180, sekcja 4.1 - Format określony przez konkretny użyty kod HPKE KEM
encrypted_data
- szyfrowany tekst i tag (np.
ciphertext || tag
bez IV) - Zdefiniowano jako
ct
w RFC 9180, sekcja 4 - Format określany na podstawie konkretnego używanego rozwiązania HPKE AEAD
- szyfrowany tekst i tag (np.
X25519 KEM z siedzibą w Diffie-Hellmanem
W przypadku jednostek DHKEM X25519 wartość enc
to 32-bajtowa wartość publiczna nadawcy
.
ECIES-AEAD-HKDF
W przypadku implementacji Tink ECIES-AEAD-HKDF dane wyjściowe to encapsulated_key
mechanizmu hermetyzacji kluczy (KEM), a encrypted_data
to wynik
mechanizmu hermetyzacji danych (DEM).
KEM
W zależności od typu klucza Tink używa skompresowanej i nieskompresowanej krzywej eliptycznej
zgodnie ze standardami kodowania RFC 8422/ANSI.X9-62.2005
. Dla:
nieskompresowanych punktów, po bajcie 0x04
występuje x
i y
jako liczby całkowite o stałym rozmiarze. W przypadku skompresowanych współrzędnych bajt 0x02
lub 0x03
i współrzędna x
jako liczbę całkowitą o stałym rozmiarze. W przypadku usługi X25519
,
używana jest definicja RFC 7748 (współrzędna x
jako liczba całkowita o stałym rozmiarze).
DEM
W przypadku encrypted_data
Tink używa tego samego formatu co AEAD. Obejmuje to m.in.
określając IV.
Derywacja klucza
Najpierw obliczana jest współrzędna X x_ss
wspólnego punktu. Klucz dla funkcji
AEAD zostanie ustawione na:
HKDF(ikm = encapsulated_key || x_ss, salt = salt_of_key, info = context_info, length = dem_key_size)
gdzie encapsulated_key
to pełne dane wyjściowe KEM w bajtach.
Podpisy cyfrowe
Tink jest zgodny z odpowiednimi RFC. Elementy podstawowe mogą dodawać 5-bajtowe dane wyjściowe Tink do wygenerowanego tagu.
ECDSA
W zależności od pola EcdsaSignatureEncoding w kluczu
format podpisu ECDSA to IEEE P1363
lub ASN.1 DER
.
Format podpisu IEEE P1363
to r || s
, gdzie r
i s
to
z dopełnieniem zero i mieć ten sam rozmiar w bajtach co kolejność krzywej. Dla:
na przykład w przypadku krzywej NIST P-256
wartości r
i s
są uzupełnione o 0 do 32 bajtów.
Podpis DER jest kodowany za pomocą algorytmu ASN.1
:
ECDSA-Sig-Value :: = SEQUENCE { r INTEGER, s INTEGER }
Jest to przede wszystkim kodowanie:
0x30 || totalLength || 0x02 || r's length || r || 0x02 || s's length || s
Tink stosuje sprawdzone metody weryfikacji podpisu, akceptując tylko Podpisy ECDSA z kodowaniem DER (alternatywne podpisy zakodowane przy użyciu BER są nieprawidłowe).
Pomaga to zapobiegać atakom charakterystycznym dla plastyczności, które często obejmują w systemach kryptowalut.