Bu sayfada, Tink'in anahtarlar ve temel çıkış için kullandığı tel biçimi açıklanmaktadır. Bu doküman, Tink'e ek diller eklemek isteyen kriptograflar ve kablo uyumlu bir mod isteyen diğer üst düzey kripto kitaplıklarının bakımını yapanlar için hazırlanmıştır. Genel kitlelere yönelik değildir.
Anahtar kümesi serileştirme
Tink, anahtar kümelerini serileştirmek için Google protobuf'u kullanır.
- İkili olarak serileştirilmiş anahtar grubu, tink.proto içinde tanımlanan serileştirilmiş bir Keyset proto'dur. Bir anahtarın KeyData değer özelliği, ilgili anahtar türünün serileştirilmiş bir proto'sudur.
- JSON olarak serileştirilmiş anahtar kümesi, JSON biçiminde serileştirilmiş bir anahtar kümesi proto'sudur. KeyData değerinin hâlâ ikili olarak serileştirilmiş bir proto olduğunu unutmayın.
- Şifrelenmiş anahtar kümesi, tink.proto içinde tanımlanan, serileştirilmiş bir EncryptedKeyset proto'dur. Şifrelenmiş bir ikili olarak serileştirilmiş anahtar kümesi ve isteğe bağlı olarak şifrelenmemiş bazı KeysetInfo meta verileri içerir.
Tink Çıkış Öneki
Çoğu Tink temel öğesi, aşağıdakilerden oluşan 5 baytlık bir çıkış önekini destekler:
- 1 baytlık 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 da destekleyebilir.
Prehash temel öğesi, 0xff sürüm baytını kullanır. External Mu ML-DSA prehash values (Harici Mu ML-DSA ön karma değerleri) bölümüne bakın.
Bu öneklerin kimliğinin doğrulanmadığını ve güvenlik amacıyla kullanılamayacağını unutmayın. Tink, şifre çözme veya doğrulama işlemlerini hızlandırmak ya da önceden karma oluşturma senaryosunda imzalama anahtarını seçmek için bunları ipucu olarak kullanır.
AEAD
Genel olarak Tink, AEAD şifreli metinlerini şu şekilde biçimlendirir:
prefix || IV || ciphertext || tag
ilgili RFC'de aksi belirtilmediği sürece. prefix, boş veya 5 baytlık bir Tink çıkış önekidir.
AES-CTR-HMAC
AES-CTR-HMAC için Tink, MAC'yi ilişkili verilerle (AD) aşağıdaki şekilde hesaplar:
AD || IV || ciphertext || bitlen(AD)
Burada bitlen(AD), 64 bitlik büyük endian işaretsiz tam sayı olarak gösterilen AD'nin bit cinsinden uzunluğudur. Bu HMAC şeması, Mcgrew'un AES-CBC-HMAC taslağına uygundur.
Deterministik AEAD
Tink, AES-SIV için RFC 5297'yi uygular ve sentetik başlatma vektörünü (SIV) şifreli metnin başına yerleştirir. İlkel, 5 baytlık bir Tink çıkış ön eki ekleyebilir.
RFC 5297, ilişkili verilerin listesini desteklerken Tink yalnızca tam olarak bir ilişkili veriyi destekler. Bu veri, RFC 5297'deki tek öğeli bir listeye karşılık gelir. Boş ilişkili veriler, boş bir liste değil, boş bir öğe içeren bir listedir.
Akış AEAD'si
AES-CTR HMAC ve AES-GCM-HKDF'ye bakın.
Zarf şifrelemesi
Zarf şifreleme, Tink'in AEAD temel öğelerini kullanarak verileri veri şifreleme anahtarıyla DEK şifreler. Şifreleme şu şekilde çalışır:
- Belirli bir anahtar şablonu (veya anahtar parametreleri) kullanılarak yeni bir
DEKoluşturulur. DEK, bayt dizesine serileştirilir. Anahtar türü proto'nun protokol arabelleği serileştirme biçimi. Örneğin, bu, AES GCM anahtar türünün DEK'si için aes_gcm.proto içinde tanımlanan birAesGcmKeyprotokol arabelleği mesajıdır. Protokol arabelleğini nasıl serileştireceğinizi öğrenmek 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 DEKolarak şifrelenir. DEK, ilişkili verilerle birlikte düz metniciphertextolarak şifrelemek için kullanılır. Bu nedenleciphertext,DEKile ilişkili AEAD temel öğesiyle aynı biçime sahiptir.
Zarf şifrelemenin çıkış biçimi aşağıdaki gibidir:
encrypted DEK length || encrypted DEK || ciphertext
encrypted DEK length, encrypted DEK uzunluğunu 32 bitlik büyük endian tamsayı olarak depolayan 4 bayttır.
MAC
Tink, ilgili RFC'leri takip eder. Temel öğeler, etikete 5 baytlık bir Tink çıkış ön eki ekleyebilir.
PRF seti
Tink, ilgili RFC'leri takip eder. PRF için anahtar türünün, aynı algoritmanın MAC anahtar türünden farklı olduğunu ve çıkış uzunluğunu içermediğini unutmayın. PRF Set anahtarları hiçbir zaman Tink çıkış öneki eklemez. Bu, çıkışın aslında bir PRF olmasını sağlar.
Karma şifreleme
Tink hibrit şifreleme için genel kablo biçimi şöyledir:
prefix || encapsulated_key || encrypted_data
prefix boş veya 5 baytlık bir Tink çıkış önekidir. Her anahtar türü, encapsulated_key'dan kaç baytın ayrıştırılacağı ve bu baytların nasıl ayrıştırılacağıyla ilgili bilgileri içerir.
HPKE (Hibrit Ortak Anahtar Şifreleme)
Tink, RFC 9180'de tanımlanan HPKE standardını izler. Bir HPKE şifreleme 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 seri hale getirilmiş ortak anahtarı
- RFC 9180, Bölüm 4.1'de
encolarak tanımlanır. - Kullanılan HPKE KEM'e göre belirlenen biçim
encrypted_data- Şifreli metin ve etiket (ör.
ciphertext || tag(IV olmadan) - RFC 9180, Bölüm 4'te
ctolarak tanımlanır. - Kullanılan HPKE AEAD'ye göre belirlenen biçim
- Şifreli 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
Anahtar türüne bağlı olarak Tink, RFC 8422/ANSI.X9-62.2005 kodlama standartlarına uygun şekilde sıkıştırılmış ve sıkıştırılmamış eliptik eğri noktaları kullanır. Sıkıştırılmamış noktalar için 0x04 baytını, sabit boyutlu tam sayılar olarak x ve y koordinatı izler. 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 (x koordinatı sabit boyutlu tam sayı olarak).
DEM
encrypted_data için Tink, AEAD ile aynı biçimi kullanır. Buna IV belirtmek dahildir.
Anahtar türetme
Öncelikle paylaşılan noktanın x koordinatı x_ss hesaplanır. AEAD için 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, ilgili RFC'leri takip eder. 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 olur.
IEEE P1363 imzasının biçimi r || s şeklindedir. Burada r ve s, sıfırlarla doldurulmuş ve eğrinin sırası ile aynı bayt boyutuna sahiptir. Örneğin, NIST P-256 eğrisi için r ve s değerleri 32 bayt olacak şekilde sıfırlarla doldurulur.
DER imzası ASN.1 kullanılarak kodlanır:
ECDSA-Sig-Value :: = SEQUENCE { r INTEGER, s INTEGER }
Özellikle kodlama şöyledir:
0x30 || totalLength || 0x02 || r's length || r || 0x02 || s's length || s
Tink, yalnızca DER kodlamalı ECDSA imzalarını kabul ederek imza doğrulamayla ilgili en iyi uygulamaları takip eder (alternatif BER kodlamalı imzalar geçersizdir).
Bu sayede, genellikle kripto para sistemlerini etkileyen imza esnekliği saldırıları önlenir.
Harici Mu ML-DSA ön karma değerleri
Prehash öğesi, bir iletiyi prehash değerine dönüştürür. Bu değer daha sonra SignPrehash öğesi tarafından imzalanır. RFC 9881'de açıklandığı gibi External Mu (Harici Mu) modundaki ML-DSA için ön karma değeri, aşağıdaki düzene sahip 69 bayttır:
0xff || key_id (4 bytes, big-endian) || mu (64 bytes)
mu,SHAKE256(tr || 0x00 || 0x00 || message, 64)olarak hesaplanan ML-DSA mesajı temsilcisidir. Buradatr, ortak anahtarın 64 baytlık karma değeridir, ilk0x00, saf ML-DSA için FIPS 204 alan ayırıcıdır ve ikinci0x00, bağlam dizesinin (boş) uzunluğudur.trortak anahtardan türetildiği içinmu, bu anahtara kriptografik olarak bağlıdır. Ancak bağlamanın kontrol edilmesi için orijinal ileti gerekir.- 5 baytlık önek,
muparametresinin bir parçası olmayan Tink çerçevesidir. Karma öncesi değeri belirli bir anahtarla ilişkilendirir. Böylece SignPrehash, hangi anahtarla imza atacağını bilir ve anahtarı olmayan bir karma öncesi değeri reddedebilir. Önek, düz meta veridir ve hiçbir şeyi kriptografik olarak bağlamaz. Herkes öneki yeniden yazabilir.
İmzalama, tam olarak 69 bayt olmayan, 0xff ile başlamayan veya anahtar kimliği, anahtar setindeki etkin bir anahtarla eşleşmeyen girişleri reddeder.