Bu meydan okuma ilk cevaplayan için 200 puanlık bir ödül taşır ve en az 3 gün boyunca yenilmez.Toprak talebinde user3080953 .
Son zamanlarda uçtan uca şifreleme ve şirketlerin ürünlerinden çıkarmaları için baskı konusunda çok fazla konuşma var. Ben bunun hakları ve yanlışları ile ilgilenmiyorum, ama merak ettim: kod ne kadar kısa bir şirket onu kullanmamak içine baskı olsun olabilir?
Buradaki zorluk, iki ağa bağlı sistem arasında bir Diffie Hellman anahtar değişimi uygulamak ve daha sonra kullanıcıların oluşturulan simetrik anahtarı kullanarak ileri geri iletişim kurmasına izin vermektir. Bu görevin amacı için başka bir korumaya gerek yoktur (örneğin, anahtarın çevrilmesine, kimliklerin doğrulanmasına, DoS'a karşı korunmaya vb. Gerek yoktur) ve açık bir internet olduğunu varsayabilirsiniz (dinlediğiniz herhangi bir bağlantı noktası herkes tarafından kullanılabilir). Yerleşiklerin kullanımına izin verilir ve teşvik edilir!
İki modelden birini seçebilirsiniz:
- Bir sunucu ve istemci: istemci sunucuya bağlanır, daha sonra sunucu veya istemci diğerine mesaj gönderebilir. İkisi arasındaki üçüncü tarafların mesajları okuyamaması gerekir. Örnek bir akış şöyle olabilir:
- A kullanıcısı sunucuyu başlatır
- B kullanıcısı istemciyi başlatır ve A kullanıcısının sunucusuna yönlendirir (örneğin IP / port üzerinden), program bir bağlantı açar
- A Kullanıcısının programı bağlantıyı kabul eder (isteğe bağlı olarak kullanıcıdan önce onayını ister)
- Kullanıcı B'nin programı bir DH sırrı oluşturmaya başlar ve gerekli verileri (ortak anahtar, asal, üreteç, uygulamanızın ihtiyaç duyduğu her şey) Kullanıcı A'ya gönderir
- A Kullanıcısının programı gönderilen verileri paylaşılan sırrın tamamlanmasını tamamlamak için kullanır ve gerekli verileri (ortak anahtar) B Kullanıcısına geri gönderir. Bu noktadan sonra A Kullanıcısı şifrelenecek ve Kullanıcıya gönderilecek mesajları (örneğin stdin aracılığıyla) gönderebilir B (örneğin stdout'a).
- Kullanıcı B'nin programı paylaşılan sırrın oluşturulmasını tamamlar. Bu noktadan sonra, Kullanıcı B Kullanıcı A'ya mesaj gönderebilir.
- Veya: İki istemcinin bağlı olduğu bir sunucu: her istemci, sunucuyla konuşarak iletisini diğer istemciye iletir. Sunucunun kendisi (ve aradaki üçüncü taraflar) iletileri okuyamaz. İlk bağlantı dışında, işlem ilk seçenekte açıklananla aynıdır.
Ayrıntılı kurallar:
- Tek bir program veya birden çok program (örn. Sunucu ve istemci) sağlayabilirsiniz. Puanınız, tüm programlardaki toplam kod boyutudur.
- Programınız teorik olarak bir ağ üzerinden iletişim kurabilmelidir (ancak test için localhost iyidir). Seçtiğiniz dil ağ oluşturmayı desteklemiyorsa, bunu yapan bir şeyle birleştirebilirsiniz (örneğin bir kabuk komut dosyası); bu durumda puanınız kullanılan tüm dillerdeki toplam kod boyutudur.
- Diffie Hellman anahtar üretimi sabit kodlanmış "p" ve "g" değerlerini kullanabilir.
- Oluşturulan paylaşılan anahtar en az 1024 bit olmalıdır.
- Anahtar paylaşıldıktan sonra, simetrik anahtar şifrelemesi seçimi size bağlıdır, ancak şu anda buna karşı pratik bir saldırı olduğu bilinen bir yöntem seçmemelisiniz (örneğin, sezaryen değişimi, anahtar bilgisi olmadan geri döndürmek için önemsizdir) ). İzin verilen algoritma örnekleri:
- AES (herhangi bir anahtar boyutu)
- RC4 (teorik olarak kırıldı, ancak bahsettiğim pratik saldırılar yok, bu yüzden burada izin verilebilir)
- A ve B kullanıcıları birbirleriyle etkileşimli olarak mesaj gönderebilmelidir (iki yönlü iletişim) (örneğin stdin'den satır okuma, sürekli yönlendirme veya bir düğmeye basma gibi olaylar). Bunu kolaylaştırırsa, alternatif bir görüşme yapabilirsiniz (yani bir kullanıcı mesaj gönderdikten sonra, bir sonraki mesajını göndermeden önce bir yanıt beklemelidir)
- Dil builtins edilir (zaten desteklenen eğer kendi kriptografik veya ağ yöntemleri yazmaya gerek yok) izin verilir.
- Temel iletişim formatı size kalmış.
- Yukarıda verilen iletişim adımları bir örnektir, ancak bunları takip etmeniz gerekmez (gerekli bilgi paylaşıldığı ve hiçbir arabulucu paylaşılan anahtarı veya mesajları hesaplayamadığı sürece)
- Sunucunuza bağlanmak için gereken ayrıntılar önceden bilinmiyorsa (örneğin rasgele bir bağlantı noktasında dinliyorsa), bu ayrıntıların yazdırılması gerekir. Makinenin IP adresinin bilindiğini varsayabilirsiniz.
- Hata işleme (örn. Geçersiz adresler, kayıp bağlantılar vb.) Gerekli değildir.
- Zorluk kod golf, bu yüzden bayt içindeki en kısa kod kazanır.
p
veg
izin?