Bu sayfada, Tink'in anahtarlar ve ilkel çıkış için kullandığı kablo bağlantısı biçimi açıklanmaktadır. Bu dokümanlar, Tink'e ek diller eklemek isteyen kriptografları ve kabloyla uyumlu bir mod isteyen diğer üst düzey kripto kitaplıklarının koruyucularını hedeflemektedir. Genel kitleler için uygun değildir.
Anahtar kümesi serileştirme
Tink, anahtar kümelerini serileştirmek için Google protobuf'i kullanır.
- İkili olarak serileştirilmiş anahtar grubu, tink.proto dosyasında tanımlanan serileştirilmiş bir Keyset proto'sudur. Bir anahtarın KeyData değer özelliği, ilgili anahtar türünün serileştirilmiş bir protosudur.
- JSON olarak serileştirilmiş anahtar grubu, JSON biçiminde serileştirilmiş bir anahtar grubu prototipidir. KeyData değerinin hâlâ ikili serileştirilmiş bir proto olduğunu unutmayın.
- Şifrelenmiş anahtar grubu, tink.proto dosyasında tanımlanan serileştirilmiş bir EncryptedKeyset proto'sudur. Şifrelenmiş, serileştirilmiş bir ikili anahtar kümesi ve isteğe bağlı olarak şifrelenmemiş bazı KeysetInfo meta verileri içerir.
Tink Çıkış Önek
Çoğu Tink ilkel, aşağıdakilerden oluşan 5 baytlık bir çıkış ön ekini destekler:
- 1 bayt sürümü:
0x01
- 4 baytlık anahtar ipucu: Bu, kullanılan anahtarın anahtar kimliğidir.
Bazı eski anahtarlar, sürüm baytını 0x00
de destekleyebilir.
Bu ön ekin kimlik doğrulamasının yapılmadığını ve güvenlik amacıyla kullanılamayacağını unutmayın. Tink, şifre çözme veya doğrulama işlemini hızlandırmak için bu değeri ipucu olarak kullanır.
AEAD
Genel olarak Tink, AEAD şifre metinlerini şu şekilde biçimlendirir:
prefix || IV || ciphertext || tag
Aksi belirtilmedikçe, ilgili RFC'de aksi belirtilmedikçe. prefix
boş veya 5 baytlık bir Tink çıkış ön ekidir.
AES-CTR-HMAC
AES-CTR-HMAC için Tink, ilişkili verilerle (AD) MAC'yi aşağıdaki gibi hesaplar:
AD || IV || ciphertext || bitlen(AD)
Burada bitlen(AD)
, AD'nin 64 bit büyük endian olarak temsil edilen imzalanmamış tam sayı olarak bit cinsinden uzunluğudur. Bu HMAC şeması, Mcgrew'un AES-CBC-HMAC taslağını takip eder.
Deterministik AEAD
Tink, sentetik başlatma vektörünü (SIV) şifre metninin başına yerleştirerek AES-SIV için RFC 5297'yi uygular. Basit öğe, 5 baytlık bir Tink çıkış ön eki ekleyebilir.
RFC 5297, ilişkili verilerin listesini desteklese de Tink yalnızca tam olarak bir ilişkili veri destekler. Bu, RFC 5297'de bir öğe içeren bir listeye karşılık gelir. Boş ilişkili veriler, boş bir liste değil, bir boş öğe içeren bir listetir.
Akış AEAD
AES-CTR HMAC ve AES-GCM-HKDF'ye bakın.
Zarf şifrelemesi
Zarf şifrelemesi, Tink'in AEAD primitiflerini kullanarak verileri bir veri şifreleme anahtarı DEK
ile şifreler. Şifreleme şu şekilde çalışır:
- Belirli bir anahtar şablonu (veya anahtar parametreleri) kullanılarak yeni bir
DEK
oluşturulur. DEK
, bayt dizesi olarak serileştirilir. Anahtar türü proto protokol arabelleğinin serileştirme biçimi. Örneğin, bu, aes_gcm.proto dosyasında AES GCM anahtar türüne sahip DEK için tanımlanan serileştirilmiş birAesGcmKey
protokol arabelleği mesajıdır. Bir protokol arabelleğinin nasıl serileştirileceği hakkında bilgi edinmek için protokol arabelleği serileştirme bölümüne bakın.- Serileştirilmiş
DEK
, harici bir sağlayıcı (ör. GCP) tarafındanencrypted DEK
olarak şifrelenir. DEK
, düz metni ilişkili verilerle şifrelemek içinciphertext
olarak kullanılır. Dolayısıylaciphertext
,DEK
ile ilişkili AEAD ilkeliyle 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 endian tam sayı olarak depolar.
MAC
Tink, ilgili RFC'lere uyar. Basit öğeler, etikete 5 baytlık bir Tink çıkış ön eki ekleyebilir.
PRF grubu
Tink, ilgili RFC'lere uyar. PRF Set için anahtar türünün, çıkış uzunluğunu içermediğinden aynı algoritmanın MAC anahtar türünden farklı olduğunu unutmayın. PRF set anahtarları hiçbir zaman Tink çıkış ön eki eklemez. Bu, çıktının gerçekten bir PRF olmasını sağlar.
Karma şifreleme
Tink karma şifreleme için genel kablo biçimi aşağıdaki gibidir:
prefix || encapsulated_key || encrypted_data
prefix
boştur veya 5 baytlık bir Tink çıkış ön ekidir. Her anahtar türü, kaç baytın ayrıştırılacağı ve bu baytların encapsulated_key
'ten nasıl ayrıştırılacağıyla ilgili bilgileri içerir.
HPKE (Karma Ortak Anahtar Şifreleme)
Tink, RFC 9180'de tanımlanan HPKE standardını izler. HPKE şifre grubu aşağıdaki üç ilkel öğeyi içerir.
- Anahtar kapsülleme mekanizması (KEM)
- Anahtar türetme işlevi (KDF)
- İlişkili verilerle kimlik doğrulaması yapılmış şifreleme (AEAD)
HPKE standardı, RFC 9180, Bölüm 10'da genel bir kablo biçimi tanımlamaz. Tink'in HPKE uygulamasında aşağıdaki encapsulated_key
ve encrypted_data
değerleri kullanılır.
encapsulated_key
- Gönderenin seri numaralı ortak anahtarı
- RFC 9180, Bölüm 4.1'de
enc
olarak tanımlanmıştır. - Kullanılan HPKE KEM'ye göre belirlenen biçim
encrypted_data
- Şifrelenmiş metin ve etiket (ör.
ciphertext || tag
(IV olmadan) - RFC 9180, Bölüm 4'te
ct
olarak tanımlanmıştır. - Kullanılan belirli HPKE AEAD'ye göre belirlenen biçim
- Şifrelenmiş metin ve etiket (ör.
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ında encapsulated_key
, Anahtar Kapsülleme Mekanizması'nın (KEM) çıkışı, encrypted_data
ise Veri Kapsülleme Mekanizması'nın (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ış eliptik eğri noktaları kullanır. Sıkıştırılmamış noktalarda, 0x04
baytından sonra 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 bir tam sayı olarak x
koordinatı kullanılır. X25519
için RFC 7748 tanımı kullanılır (x
koordinatı sabit boyutlu tam sayı olarak).
DEM
Tink, encrypted_data
için AEAD ile aynı biçimi kullanır. Buna IV belirtme de dahildir.
Anahtar türetme
Öncelikle, paylaşılan noktanın x koordinatı x_ss
hesaplanır. AEAD anahtarı daha sonra ş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, ilgili RFC'lere uyar. Basit öğeler, oluşturulan etikete 5 baytlık bir Tink çıkış ön eki ekleyebilir.
ECDSA
Anahtardaki EcdsaSignatureEncoding alanına bağlı olarak ECDSA imzasının biçimi IEEE P1363
veya ASN.1 DER
olur.
IEEE P1363
imzasının biçimi r || s
'tür. Burada r
ve s
sıfırla doldurulur ve eğrinin sırasıyla aynı bayt boyutuna sahiptir. Örneğin, NIST P-256
eğrisi için r
ve s
, 32 bayta kadar sıfırla doldurulur.
DER imzası ASN.1
kullanılarak kodlanır:
ECDSA-Sig-Value :: = SEQUENCE { r INTEGER, s INTEGER }
Özellikle kodlama:
0x30 || totalLength || 0x02 || r's length || r || 0x02 || s's length || s
Tink, yalnızca DER kodlamalı ECDSA imzalarını kabul ederek (alternatif BER kodlamalı imzalar geçersizdir) imza doğrulamayla ilgili en iyi uygulamaları takip eder.
Bu, genellikle kripto para sistemlerini etkileyen imza değiştirilebilirliği saldırılarını önlemeye yardımcı olur.