Bu sayfada, anahtarlar ve temel çıkış için Tink'in kablo biçimi açıklanmaktadır. Belgeler, Tink'e başka diller eklemek isteyen kriptograflara ve kablo ile uyumlu mod isteyen diğer üst düzey kripto kitaplıklarının geliştiricilerine yöneliktir. Genel kitlelere yönelik değildir.
Anahtar kümesi serileştirme
Tink, anahtar setlerini serileştirmek için Google protobuf'u kullanıyor.
- İkili serileştirilmiş anahtar kümesi, tink.proto dosyasında tanımlanan serileştirilmiş bir Anahtar Kümesi protosudur. Bir anahtarın KeyData değer özelliği, karşılık gelen anahtar türünün serileştirilmiş bir protokolüdür.
- JSON seri anahtar kümesi, JSON biçiminde serileştirilmiş bir Anahtar Kümesi protosudur. KeyData değerinin hâlâ ikili bir serileştirilmiş proto olduğunu unutmayın.
- Şifrelenmiş anahtar kümesi, tink.proto'da tanımlanan, serileştirilmiş bir EncryptedKeyst protosudur. Şifrelenmiş bir ikili program seri anahtar kümesi ve isteğe bağlı olarak bazı şifrelenmemiş KeysetInfo meta verileri içerir.
Tink Çıkış Öneki
Çoğu Tink temel öğesi aşağıdakileri içeren 5 baytlık bir çıkış ön ekini destekler:
- 1 baytlık sürüm:
0x01
- 4 bayt anahtar ipucu: Bu, kullanılan anahtarın anahtar kimliğidir.
Bazı eski anahtarlar, 0x00
sürüm baytını da destekleyebilir.
Bu ön ekin kimlik doğrulamasının yapılmadığını ve güvenlik nedeniyle ön eke güvenilemeyeceğini unutmayın. Tink, şifre çözme veya doğrulamayı hızlandırmak için ipucu olarak kullanır.
AEAD
Genel olarak, Tink, AEAD şifrelenmiş metinlerini şu şekilde biçimlendirir:
prefix || IV || ciphertext || tag
(ilgili RFC'de aksi belirtilmedikçe). prefix
, boş veya 5 baytlık Tink çıkış ön eki.
AES-TO-HMAC
AES-TO-HMAC için Tink, MAC'yi ilişkili verilerle (AD) aşağıdaki gibi hesaplar:
AD || IV || ciphertext || bitlen(AD)
Burada bitlen(AD)
, AD'nin 64 bit büyük uçlu imzasız tam sayı olarak temsil edilen bit cinsinden uzunluğudur. Bu HMAC şeması, Mcgrew'un AES-CBC-HMAC taslağını izler.
Deterministik AEAD
Tink, AES-SIV için RFC 5297'yi uygulayarak sentetik başlatma vektörünü (SIV) şifrelenmiş metnin başına koyar. Temel öğe, 5 baytlık bir Tink çıkış öneki ekleyebilir.
RFC 5297, ilişkili verilerin bir listesini desteklerken Tink yalnızca tam olarak bir ilişkilendirilmiş verileri destekler. Bu, RFC 5297'deki tek öğeli bir listeye karşılık gelir. Boş ilişkilendirilmiş veriler, boş liste değil, tek bir boş öğe içeren bir listedir.
AEAD akışı
AES-TO HMAC ve AES-GCM-HKDF bölümlerine bakın.
Zarf şifrelemesi
Zarf şifrelemesi, verileriTink'in AEAD temel öğelerini kullanarak DEK
veri şifreleme anahtarıyla şifreler. Şifreleme aşağıdaki şekilde çalışır:
- Belirli bir anahtar şablonu (veya anahtar parametreleri) kullanılarak yeni bir
DEK
oluşturulur. DEK
, bayt dizesi olarak serileştirilir. Serileştirme biçimi, anahtar türü protokolünün protokol arabelleği serileştirmesidir. Örneğin bu, AES GCM anahtar türünün DEK'si için aes_gcm.proto içinde tanımlanan, serileştirilmiş birAesGcmKey
protokol arabelleği mesajıdır. Protokol arabelleğinin nasıl serileştirileceğini öğrenmek için protokol arabelleği serileştirme bölümüne bakın.- Serileştirilmiş
DEK
, harici bir sağlayıcı tarafından (örneğin, GCP)encrypted DEK
biçiminde şifrelenir. DEK
, şifrelenmemiş metni ilişkili verilerleciphertext
içinde şifrelemek için kullanılır. Dolayısıylaciphertext
,DEK
'a karşılık gelen AEAD temel öğesi ile tam olarak aynı biçime sahiptir.
Zarf şifrelemesinin çıkış biçimi aşağıdaki gibidir:
encrypted DEK length || encrypted DEK || ciphertext
encrypted DEK length
, 4 bayttır ve encrypted DEK
uzunluğunu 32 bitlik büyük uçlu bir tam sayı olarak saklar.
Mac
Tink, karşılık gelen RFC'leri izler. Temel öğeler, etikete 5 baytlık bir Tink çıkış öneki ekleyebilir.
PRF ayarlandı
Tink, karşılık gelen RFC'leri izler. PRF Set için anahtar türünün, çıkış uzunluğunu dahil etmeyerek aynı algoritmanın MAC anahtarı türünden farklı olduğunu unutmayın. PRF Ayar anahtarları hiçbir zaman Tink çıkış öneki eklemez. Bu, çıktının aslında bir PRF olmasını sağlar.
Karma şifreleme
Tink karma şifreleme için genel kablo biçimi şu şekildedir:
prefix || encapsulated_key || encrypted_data
prefix
, boş veya 5 baytlık Tink çıkış öneki. Her anahtar türü, kaç baytın ayrıştırılacağı ve bu baytların encapsulated_key
öğesinden nasıl ayrıştırılacağı ile ilgili bilgileri içerir.
HPKE (Karma Ortak Anahtar Şifreleme)
Tink, RFC 9180'de tanımlanan HPKE standardını uygular. Bir HPKE şifre paketi aşağıdaki üç temel öğeyi içerir.
- Anahtar kapsülleme mekanizması (KEM)
- Anahtar türetme işlevi (KDF)
- İlişkili verilerle kimliği doğrulanmış şifreleme (AEAD)
HPKE standardı, RFC 9180, Bölüm 10'da genel bir kablo biçimi tanımlamaz. Tink'in HPKE uygulaması aşağıdaki encapsulated_key
ve encrypted_data
değerlerini kullanır.
encapsulated_key
- Gönderenin serileştirilmiş ortak anahtarı
- RFC 9180, Bölüm 4.1'de
enc
olarak tanımlanır. - Biçim, kullanılan belirli HPKE KEM tarafından belirlenir
encrypted_data
- Şifreli metin ve etiket (ör. IV olmadan
ciphertext || tag
) - RFC 9180, Bölüm 4'te
ct
olarak tanımlanır. - Biçim, kullanılan belirli HPKE AEAD tarafından belirlenir
- Şifreli metin ve etiket (ör. IV olmadan
X25519 Diffie-Hellman tabanlı KEM
X25519 DHKEM'ler için enc
değeri, gönderenin 32 baytlık Diffie-Hellman genel anahtarıdır.
ECIES-AEAD-HKDF
Tink'in ECIES-AEAD-HKDF uygulaması için encapsulated_key
, Anahtar Kapsülleme Mekanizması'nın (KEM) çıktısı, encrypted_data
ise Veri Kapsülleme Sistemi'nin (DEM) çıkışıdır.
KEM
Tink, anahtar türüne bağlı olarak RFC 8422/ANSI.X9-62.2005
kodlama standartlarına uygun olarak sıkıştırılmış ve sıkıştırılmamış elips biçimli eğri noktaları kullanır. Sıkıştırılmamış noktalar için 0x04
baytının ardından x
ve y
koordinatı sabit boyutlu tam sayılar olarak gelir. Sıkıştırılmış koordinatlar için 0x02
veya 0x03
baytı ve sabit boyutlu tam sayı olarak x
koordinatı kullanılır. X25519
için RFC 7748 tanımı kullanılır (sabit boyutlu tam sayı olarak x
koordinatı).
VKÖ
Tink, encrypted_data
için AEAD ile aynı biçimi kullanır. IV belirtmek de buna dahildir.
Anahtar türevi
Öncelikle paylaşılan noktanın x koordinatı x_ss
hesaplanır. Daha sonra AEAD anahtarı şu şekilde ayarlanır:
HKDF(ikm = encapsulated_key || x_ss, salt = salt_of_key, info = context_info, length = dem_key_size)
Burada encapsulated_key
, bayt olarak tam KEM çıkışıdır.
Dijital imzalar
Tink, karşılık gelen RFC'leri izler. Temel öğeler, oluşturulan etikete 5 baytlık bir Tink çıkış öneki ekleyebilir.
ECDSA
Anahtardaki EcdsaSignatureEncoding alanına bağlı olarak ECDSA imzasının biçimi IEEE P1363
veya ASN.1 DER
şeklindedir.
IEEE P1363
imzasının biçimi r || s
şeklindedir. Burada r
ve s
sıfır dolguludur ve bayt olarak eğrinin sıralamasıyla aynı boyuta sahiptir. Örneğin, NIST P-256
eğrisi için r
ve s
, 32 bayta sıfır ile doldurulur.
DER imzası ASN.1
kullanılarak kodlanır:
ECDSA-Sig-Value :: = SEQUENCE { r INTEGER, s INTEGER }
Özellikle, kodlama şu şekildedir:
0x30 || totalLength || 0x02 || r's length || r || 0x02 || s's length || s
Tink, yalnızca DER kodlamalı ECDSA imzalarını (alternatif BER kodlamalı imzalar geçersizdir) kabul ederek imza doğrulaması için en iyi uygulamaları izler.
Bu, genellikle kripto para birimi sistemlerini etkileyen imza pazarlanabilirlik saldırılarını önlemeye yardımcı olur.