• Gönderilme: 2018-08-20
  • Yazar: villain
  • Gönderilme development

`Kaynak makale`_ orignal tarafından habr.com üzerinde

I2P taşıyıcı iletişim kuralları ilk olarak yaklaşık 15 yıl önce geliştirildi. O zamanlar asıl amaç, kişinin iletişim kuralını kullandığı gerçeğini gizlemek değil, aktarılan verileri gizlemekti. "Derin paket denetimi" (DPI) ve iletişim kuralı engellemeye karşı korumayı kimse ciddi olarak düşünmedi. Zaman değişiyor ve özgün taşıyıcı iletişim kuralları hala güçlü güvenlik sağlıyor olsa da, yeni bir taşıyıcı iletişim kuralı geliştirme isteği vardı. NTCP2, var olan engelleme tehditlerine direnecek şekilde tasarlandı. Özellikle, paket uzunluğunun "Derin paket denetimi" (DPI) incelemesi üzerinde çalışıldı. Ayrıca, yeni iletişim kuralı en modern şifreleme gelişmelerini kullanıyor. NTCP2, karma işlevi olarak SHA256 ve eliptik eğri Diffie-Hellman anahtar alış verişi olarak x25519 ile "Gürültü iletişim kuralı çatısını" temel alıyor.

NTCP2 iletişim kuralının tam özellikleri 'burada bulunabilir'_.

Yeni şifreleme

System Message: WARNING/2 (Blog, line 34)

Title underline too short.

Yeni şifreleme
----------

NTCP2 için bir I2P uygulamasına gelecekte kullanılacak şifreleme algoritmalarının eklenmesi gerekir:

  • x25519
  • HMAC-SHA256
  • Chacha20
  • Poly1305
  • AEAD
  • SipHash

Özgün NTCP iletişim kuralı ile karşılaştırıldığında NTCP2, Diffie-Hellman işlevi için ElGamal yerine x25519, AES-256-CBC/Adler32 yerine AEAD/Chaha20/Poly1305 ve paketin uzunluk bilgilerini gizlemek için de SipHash kullanıyor. NTCP2 için kullanılan anahtar türetme işlevi daha karmaşıktır ve birçok HMAC SHA256 çağrısı kullanmaktadır.

i2pd (C++) uygulama notu: SipHash dışında yukarıda bahsedilen tüm algoritmalar OpenSSL 1.1.0 sürümünde uygulanmaktadır. SipHash, gelecek OpenSSL 1.1.1 sürümüne eklenecektir. Var olan sistemlerin çoğunda kullanılan OpenSSL 1.0.2 sürümü ile uyumluluk sağlamak için, çekirdek i2pd geliştiricisi 'Jeff Becker'_ eksik şifreleme algoritmalarının bağımsız uygulamalarına katkıda bulunmuştur.

"Yöneltici bilgileri" (RouterInfo) değişiklikleri

NTCP2 üzerinde, var olan iki anahtara (şifreleme ve imza) ek olarak üçüncü bir (x25519) anahtara gerekir. Bu yeni durağan anahtar, "Yöneltici bilgileri" (RouterInfo) adreslerinden herhangi birine "s" parametresi olarak eklenmelidir. Hem NTCP2 başlatıcısı (Alice) hem de yanıtlayıcı (Bob) için gereklidir. Birden fazla adres NTCP2 destekliyorsa, örneğin IPv4 ve IPv6, "s" değerinin hepsi için aynı olması gerekir. Alice`in adresinde, "server" ve "port" ayarlanmadan yalnızca "s" parametresine bulunabilir. Ayrıca, şu anda her zaman "2" olarak ayarlanmış bir "v" parametresi gereklidir.

NTCP2 adresi ayrı bir NTCP2 adresi olarak veya ek parametrelerle eski tarz bir NTCP adresi olarak bildirilebilir. Bu durumda hem NTCP hem de NTCP2 bağlantıları kabul edilir. Java I2P uygulaması ikinci yaklaşımı, i2pd (C++ uygulaması) ise birinci yaklaşımı kullanır.

Bir düğüm NTCP2 bağlantılarını kabul ederse, bu düğüm yeni bağlantılar kurduğunda "Yöneltici bilgileri" (RouterInfo) verilerini genel şifreleme anahtarı için bir "Başlatma vektörü" (IV) olarak kullanılan "i" parametresiyle yayınlamalıdır.

Bağlantı kurmak

Bir bağlantı kurmak için her iki tarafın da kısa ömürlü bir x25519 anahtar çifti oluşturması gerekir. Bu anahtarlara ve "durağan" anahtarlara dayanarak, veri aktarımı için bir dizi anahtar elde ederler. Her iki taraf da diğer tarafın bu durağan anahtar için özel bir anahtara sahip olduğunu ve bu durağan anahtarın "Yöneltici bilgileri" (RouterInfo) verileriyle aynı olduğunu doğrulamalıdır.

Bağlantı kurmak için üç ileti gönderilir:

Alice                           Bob

SessionRequest ------------------->
<------------------- SessionCreated
SessionConfirmed ----------------->

Her ileti için «giriş anahtarı malzemesi» adı verilen ortak bir x25519 anahtarı hesaplanır ve ardından bir MixKey işleviyle ileti şifreleme anahtarı oluşturulur. İletiler alınıp verilirken bir ck değeri (zincirleme anahtarı) tutulur. Bu değer, veri aktarımı için anahtarlar oluşturulurken son giriş olarak kullanılır.

I2P C++ uygulamasındaki MixKey işlevi şuna benzer:

void NTCP2Establisher::MixKey (const uint8_t * inputKeyMaterial, uint8_t * derived)
{
        // temp_key = HMAC-SHA256(ck, input_key_material)
        uint8_t tempKey[32]; unsigned int len;
        HMAC(EVP_sha256(), m_CK, 32, inputKeyMaterial, 32, tempKey, &len);
        // ck = HMAC-SHA256(temp_key, byte(0x01))
        static uint8_t one[1] =  { 1 };
        HMAC(EVP_sha256(), tempKey, 32, one, 1, m_CK, &len);
        // derived = HMAC-SHA256(temp_key, ck || byte(0x02))
        m_CK[32] = 2;
        HMAC(EVP_sha256(), tempKey, 32, m_CK, 33, derived, &len);
}

SessionRequest iletisi, genel bir x25519 Alice anahtarından (32 bayt), AEAD/Chacha20/Poly1305 (16 bayt) ile şifrelenmiş bir veri bloğundan, bir karma (16 bayt) ve sonunda bazı rastgele verilerden (dolgu) oluşur ). Doldurma uzunluğu, şifrelenmiş veri bloğunda tanımlanır. Şifrelemiş blok ayrıca SessionConfirmed iletisinin ikinci bölümünün uzunluğunu da içerir. Bir veri bloğu, Alice`in geçici anahtarından ve Bob`un durağan anahtarından türetilen bir anahtarla şifrelenir ve imzalanır. MixKey işlevi için başlangıç ck değeri SHA256 olarak ayarlanır (Noise_XKaesobfse+hs2+hs3_25519_ChaChaPoly_SHA256).

Herkese açık 32 bayt x25519 anahtarı "Derin paket denetimi" (DPI) tarafından algılanabildiğinden, bunu engellemek için anahtar olarak Bob`un adresinin karması ve "Başlatma vektörü" (IV) olarak "Yöneltici bilgileri" (RouterInfo) "i" parametresi kullanılarak AES-256 CBC algoritması ile şifrelenir.

SessionCreated iletisi, anahtarın her iki tarafın geçici anahtarlarına göre hesaplanması dışında SessionRequest ile aynı yapıya sahiptir. SessionRequest iletisinden herkese açık anahtarın şifrelenmesi/şifresinin çözülmesinden sonra oluşturulan başlatma vektörü, geçici herkese açık anahtarı şifrelemek/şifresini çözmek için başlatma vektörü olarak kullanılır.

SessionConfirmed iletisi 2 parçadan oluşur: Herkese açık durağan anahtar ve Alice`in "Yöneltici bilgileri" (RouterInfo). Önceki iletilerden farkı, kısa ömürlü herkese açık anahtarın SessionCreated ile aynı anahtar kullanılarak AEAD/Chaha20/Poly1305 ile şifrelenmesidir. İletinin ilk parçasının 32 yerine 48 bayt olmasına yol açar. İkinci parça da AEAD/Chaha20/Poly1305 ile şifrelenir. Ancak Bob'un geçici anahtarından ve Alice`in durağan anahtarından hesaplanan yeni bir anahtar kullanılır. "Yöneltici bilgileri" (RouterInfo) bölümü rastgele veri doldurma ile de eklenebilir. Ancak "Yöneltici bilgileri" (RouterInfo) genellikle farklı uzunluklarda olduğundan gerekli değildir.

Veri aktarımı anahtarlarının oluşturulması

System Message: WARNING/2 (Blog, line 154)

Title underline too short.

Veri aktarımı anahtarlarının oluşturulması
--------------------------------

Tüm karma ve anahtar doğrulamaları başarılı olduysa, her iki tarafta da son MixKey işleminden sonra ortak bir ck değeri bulunmalıdır. Bu değer, bir bağlantının her iki tarafı için iki anahtar kümesi <k, sipk, sipiv> oluşturmak için kullanılır. "k" bir AEAD/Chaha20/Poly1305 anahtarıdır, "sipk" bir SipHash anahtarıdır, "sipiv" her kullanımdan sonra değişen SipHash IV için bir başlangıç değeridir.

I2P C++ uygulamasındaki anahtar üretmek için kullanılan kod şuna benzer:

void NTCP2Session::KeyDerivationFunctionDataPhase ()
{
        uint8_t tempKey[32]; unsigned int len;
        // temp_key = HMAC-SHA256(ck, zerolen)
        HMAC(EVP_sha256(), m_Establisher->GetCK (), 32, nullptr, 0, tempKey, &len);
        static uint8_t one[1] =  { 1 };
        // k_ab = HMAC-SHA256(temp_key, byte(0x01)).
        HMAC(EVP_sha256(), tempKey, 32, one, 1, m_Kab, &len);
        m_Kab[32] = 2;
        // k_ba = HMAC-SHA256(temp_key, k_ab || byte(0x02))
        HMAC(EVP_sha256(), tempKey, 32, m_Kab, 33, m_Kba, &len);
        static uint8_t ask[4] = { 'a', 's', 'k', 1 }, master[32];
        // ask_master = HMAC-SHA256(temp_key, "ask" || byte(0x01))
        HMAC(EVP_sha256(), tempKey, 32, ask, 4, master, &len);
        uint8_t h[39];
        memcpy (h, m_Establisher->GetH (), 32);
        memcpy (h + 32, "siphash", 7);
        // temp_key = HMAC-SHA256(ask_master, h || "siphash")
        HMAC(EVP_sha256(), master, 32, h, 39, tempKey, &len);
        // sip_master = HMAC-SHA256(temp_key, byte(0x01))
        HMAC(EVP_sha256(), tempKey, 32, one, 1, master, &len);
        // temp_key = HMAC-SHA256(sip_master, zerolen)
        HMAC(EVP_sha256(), master, 32, nullptr, 0, tempKey, &len);
       // sipkeys_ab = HMAC-SHA256(temp_key, byte(0x01)).
        HMAC(EVP_sha256(), tempKey, 32, one, 1, m_Sipkeysab, &len);
        m_Sipkeysab[32] = 2;
         // sipkeys_ba = HMAC-SHA256(temp_key, sipkeys_ab || byte(0x02))
        HMAC(EVP_sha256(), tempKey, 32, m_Sipkeysab, 33, m_Sipkeysba, &len);
}

i2pd (C++) uygulama notu: "sipkeys" dizisinin ilk 16 baytı bir SipHash anahtarıdır, son 8 bayt başlatma vektörüdür. SipHash iki adet 8 baytlık anahtar gerektirir, ancak i2pd bunları tek bir 16 baytlık anahtar olarak işler.

Veri aktarımı

Veri çerçeveler halinde aktarılır. Her çerçevede 3 parça bulunur:

  • SipHash ile karıştırılmış 2 bayt çerçeve uzunluğu
  • Chacha20 ile şifrelenmiş veriler
  • 16 bayt Poly1305 karma değeri

Bir çerçevede aktarılan en fazla veri 65519 bayttır.

İleti uzunluğu, var olan SipHash başlatma vektörünün iki ilk baytı ile XOR işlevi uygulanarak gizlenir.

Şifrelenmiş veri parçasında, veri blokları bulunur. Her bloğun başına, blok türünü ve blok uzunluğunu tanımlayan 3 baytlık üst bilgi eklenir. Genel olarak, I2NP türü bloklar aktarılır, bunlar değiştirilmiş bir üst bilgiye sahip I2NP iletileridir. Bir NTCP2 çerçevesi, birden fazla I2NP bloğunu aktarabilir.

Diğer önemli veri bloğu türü ise rastgele bir veri bloğudur. Her NTCP2 çerçevesine rastgele bir veri bloğu eklenmesi önerilir. Yalnızca bir rastgele veri bloğu eklenebilir ve bu son blok olmalıdır.

Bunlar, var olan NTCP2 uygulamasında kullanılan diğer veri bloklarıdır:

  • "Yöneltici bilgileri" (RouterInfo) — Genellikle bağlantı kurulduktan sonra Bob`un "Yöneltici bilgileri" olur. Ancak otomatik doldurmaları hızlandırmak amacıyla rastgele bir düğümün "Yöneltici bilgileri" olabilir (bu durumu belirten bir işaret alanı vardır).
  • Sonlandırma — Bir bilgisayar bir bağlantıyı açıkça sonlandırdığında ve bunun için bir neden belirttiğinde kullanılır.
  • DateTime — Saniye cinsinden geçerli saat.

Özet

Yeni I2P taşıyıcı iletişim kuralı NTCP2, "Derin paket denetimi" (DPI) engellemesine karşı etkili direnç sağlar. Ayrıca kullanılan daha hızlı, modern şlifreleme nedeniyle işlemci yükünün azalmasına neden olur. I2P uygulamasını akıllı telefonlar ve ev yönelticileri gibi düşük kaynaklara sahip aygıtlar üzerinde çalıştırma olasılığını artırır. Her iki büyük I2P uygulaması da NTCP2 için tam desteğe sahiptir ve NTCP2 iletişim kuralını 0.9.36 (Java) ve 2.20 (i2pd, C++) sürümlerinden başlayarak kullanıma hazır hale getirir.

There are errors in this translation. Please comment on this ticket with the URL of this page.

System Message: ERROR/3 (Blog, line 11); backlink

Unknown target name: "kaynak makale".