Tink kablosu biçimi

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ş bir AesGcmKey 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 verilerle ciphertext içinde şifrelemek için kullanılır. Dolayısıyla ciphertext, 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
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.