Tink kablosu biçimi

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ş bir AesGcmKey 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ından encrypted DEK olarak şifrelenir.
  • DEK, düz metni ilişkili verilerle şifrelemek için ciphertext olarak kullanılır. Dolayısıyla ciphertext, 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
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.