# Needham–Schroeder protokolü
Needham–Schroeder protokolü her ikisi de Roger Needham ve Michael Schroeder tarafından önerilen güvenli olmayan bir ağ üzerinde kullanılması amaçlanan iki anahtar taşıma protokolünden biridir. Bunlar:
  - Needham-Schroeder Simetrik Anahtar Protokolü bir simetrik şifreleme algoritmasına dayalı protokoldür . Kerberos protokolünün temelini oluşturur. Bu protokol, genellikle daha fazla iletişimi korumak için bir ağ üzerindeki iki taraf arasında bir oturum anahtarı oluşturmayı amaçlamaktadır. 
  - Needham-Schroeder Açık Anahtar Protokolü açık anahtar şifrelemeye dayalı bir protokoldür. Bu protokol, bir ağ üzerinde iletişim kuran iki taraf arasında karşılıklı kimlik doğrulaması sağlamayı amaçlamaktadır, ancak önerilen biçiminde güvensizdir.


## Simetrik protokol.
Burada Alice (A) Bob (B) ile iletişimi başlatır. S, her iki tarafın da güvendiği bir sunucudur. İletişimde:
  - A ve B sırasıyla Alice ve Bob'un kimlikleri 
  - KAS, yalnızca A ve S tarafından bilinen bir simetrik anahtardır 
  - KBS, yalnızca B ve S tarafından bilinen bir simetrik anahtardır 
  - NA ve N B, nonce'ları(tek kullanımlık sayı) sırasıyla A ve B tarafından üretilir
  - KAB, A ve B arasındaki oturumun oturum anahtarı olacak şekilde oluşturulmuş simetrik anahtardır
Protokol, güvenlik protokolü gösteriminde aşağıdaki gibi belirtilebilir:
A →S: . A,B,N_A .
 Alice sunucuya kendini ve Bob'u tanımlayan bir mesaj gönderir ve sunuya Bob ile iletişim kurmak istediğini söyler.
S →A: {N_A, K_AB, B, {K_AB, A}_K_BS}_K_AS
 Sunucu K_AB oluşturur ve Alice'e K_BS ile şifrelenmiş bir kopyasını Bob'a iletmesi için ve bu Kab'nin bir kopyasını kendisinde tutması için yollar. Nonce Alice'e gelen mesajın güncel olduğunu ve server'ın bu belirli mesajı cevapladığını garanti etmektedir. Alice birçok kişi ile iletişim kurabileceği için Alice'in bu anahtarı paylaşması gereken kişi olan Bob'un ismini Alice ile mesajın bir içeriği olarak bu mesaj içerisinde paylaşılmaktadır.
A →B: {K_AB, A}_K_BS
 Alice anahtarı sunucu ile daha önceden paylaştığı anahtarla şifresini çözebilen Bob'a iletir ve böylece verilerin kimlik doğrulaması gerçekleşir.
B →A: {N_B}_K_AB
Bob Alice'e Kab ile şifrelenmiş bir nonce'ı kendisinin anahtara sahip olduğunu göstermek için gönderir.
A →B: {N_B-1}_K_AB
 Alice, nonce üzerinde basit bir işlem yapar,yeniden şifreler,onu kendisinin hala hatta olduğunu ve anahtara sahip olduğunu doğrulamak için geri yollar.


### Protokole yapılan saldırılar.
Protokol bir tekrarlama saldırısına karşı savunmasızdır (Denning ve Sacco tarafından tanımlandığı gibi). Bir saldırgan daha eski, güvenliği ihlal edilmiş KAB kullanırsa {K_AB, A}_K_BSmesajı kabul eden ve anahtarın taze olmadığını bilmeyen Bob'a yeniden mesajı oynattırabilir.


### Saldırıyı düzeltme.
Bu kusur Kerberos protokolünde bir zaman damgası eklenerek düzeltildi. Aşağıda tarif edildiği gibi nonces kullanımı ile de düzeltilebilir. Protokolün başında:
 A →B: A
 Alice, Bob'a bir istek gönderir.
 B →A: {A,𝐍_𝐁'}_K_BS
 Bob sunucudaki anahtar ile nonce'ı şifreleyerek yanıt verir.
 A →S: . A,B,N_A,{A,𝐍_𝐁'}_K_BS .
 Alice sunucuya kendisini ve Bob'u tanımlayan bir mesaj gönderir ve sunucuya Bob ile iletişim kurmak istediğini söyler.
 S →A: {N_A, K_AB, B, {K_AB, A,𝐍_𝐁'}_K_BS}_K_AS
 Nonce'in dahil edildiğine dikkat edilmelidir.
Protokol daha sonra yukarıdaki orijinal protokolde tarif edildiği gibi son üç adım ile devam eder. N_B' nin N_B 'den farklı bir nonce olduğuna dikkat edilmesi gerekmektedir. Bu yeni nonce'nin dahil edilmesi, güvenliği ihlal edilmiş bir {K_AB, A}_K_BS sürümünün tekrar oynatılmasını engeller çünkü böyle bir mesajın {K_AB, A,𝐍_𝐁'}_K_BS formda olması gerekir ki saldırgan, K_BS'ye sahip olmadığı için bu formu taklit edemez.


## Açık anahtarlı şifreleme protokolü.
Bu protokol açık anahtarlı şifreleme algoritmasının kullanıldığını varsayar.
Burada Alice (A) ve Bob (B), açık anahtarların dağıtılması için bir güvenilir sunucu kullanır. Bu anahtarlar:
  - K PA ve K SA, sırasıyla A'ya ait bir şifreleme anahtar çiftinin genel ve özel yarılarıdır (S burada "gizli anahtar" anlamına gelir) 
  - K PB ve K SB, A'dakine benzer B'ye ait anahtarlardır. 
  - KPS ve KSS, A ve B'dekine benzer S'ye ait olan anahtarlardır. (Bu anahtar çiftleri dijital imzalar için kullanılacaktır, yani, KSS mesajı imzalamak için kullanılır ve KPS mesajı doğrulamak için kullanılır. KPS protokol başlamadan önce A ve B tarafından bilinmelidir.)
Protokol aşağıdaki gibi çalışır:
A →S: . A, B .
 A, B'nin S'den açık anahtarlarını ister.
S →A: {K_PB, B}_K_SS
 S, kimlik doğrulama amacıyla sunucu tarafından imzalanan B'nin kimliğinin yanında B'nin açık anahtarı olan KPB ile yanıt verir.
A →B: {N_A, A}_K_PB
 A bir rastgele NA seçer ve B'ye gönderir
B →S: . B, A .
 B artık A'nın iletişim kurmak istediğini biliyor, bu yüzden B A'nın açık anahtarlarını ister.
S →B: {K_PA, A}_K_SS
 Sunucu yanıt veriyor.
B →A: {N_A, N_B}_K_PA
 B rastgele bir NB seçer ve KSB anahtarı ile çözümleyebildiğini ispatlayabilmek için gönderdiği NA 'nın yanında NB 'yi gönderir.
A →B: {N_B}_K_PB
 A B'ye KSA ile deşifreleme yapabildiğini ispatlamak için NB 'yi onaylayarak B'ye gönderir.
Protokolün sonunda, A ve B birbirlerinin kimliklerini biliyorlar ve NA ve N B de biliniyor olacaktır. Bu nonce'lar araya sızacak olan dinleyiciler tarafından bilinmiyor olacaktır.


### Protokole Yapılan Bir Saldırı.
Bu protokol man-in-the-middle saldırısına karşı savunmasızdır. Bir sahtekar I, A'yı kendisi ile bir oturum başlatmak için ikna edebilirse, sahtekar mesajı B'ye iletebilir ve B'yi A ile konuştuğuna ikna edebilir.
S'ye giden ve S'den gelen trafiği göz ardı ederek, saldırı aşağıdaki gibi çalışır:
A →I: {N_A, A}_K_PI
 A, NA'yı KSI ile mesajın şifresini çözen I'ya gönderir.
I →B: {N_A, A}_K_PB
 I mesajı A'nın B ile iletişim kurmasını önleyerek B'ye aktarır.
B →I: {N_A, N_B}_K_PA
 B, NB 'yi gönderir
I →A: {N_A, N_B}_K_PA
 A'ya aktarıyorum
A →I: {N_B}_K_PI
 A,NB'yi çözer ve onaylamak için NB'yi öğrenmek isteyen I'ya gönderir.
I →B: {N_B}_K_PB
 I,NB'yi yeniden şifreler ve B'yi NB 'yi çözdüğüne ikna etmek için geri gönderir.
Saldırının sonunda B, A'nın onunla iletişim kurduğuna ve NA,NB 'nin sadece A ve B tarafından bilindiğine inanıyor olacaktır.
Bir sonraki örnek saldırıyı göstermektedir. Alice (A) bankası (B) ile temasa geçmek istiyor. Bir sahtekârın (I) A'yı başarılı bir şekilde banka olduklarına ikna ettiğini varsayıyoruz. Sonuç olarak A, bankasına göndermek istediği mesajları şifrelemek için B'nin açık anahtarını kullanmak yerine I'nin açık anahtarını kullanır. Bu nedenle, A, I'inin açık anahtarıyla şifrelenmiş olan nonce'ı gönderir. Gizli anahtarını kullanarak mesajı çözümler ve B ile A'nın açık anahtarı ile şifrelenmiş gibi mesajı yollamak için iletişime geçer.B'nin mesajın I'dan geldiğini anlamasının hiçbir yolu yoktur. B kendi nonce ve mesajı kendi açık anahtarı ile şifreleyerek yanıt verir. I, A'nın açık anahtarına sahip olmadığı için o mesajı A'ya içeriği bilmeden aktarmak zorundadır. A mesajı kendi gizli anahtarıyla çözümler ve B'nin nonce'nı kendi I'nın açık anahtarı ile şifreleyerek yanıt verir. I mesajı kendi açık anahtarı ile çözümler ve A, B'nin nonce'ına aynı anda sahip olur. Bu yüzden dolayı, I sırasıyla banka ve kullanıcı gibi davranabilir.


### Man-in-the-middle saldırısını düzeltme.
Saldırı ilk olarak 1995 yılında Gavin Lowe tarafından bulunmuştur. Makalesinde ayrıca, Needham – Schroeder – Lowe protokolü 'nün düzeltilmiş bir versiyonu da açıklanmaktadır. Düzeltilmiş versiyona mesajın yanıtlayanın kimliğini içermesi dahil edilmiştir. Protokolün şu kısmı değiştirilmiştir:
B →A: {N_A, N_B}_K_PA
Düzeltilmiş versiyonu:
B →A: {N_A, N_B, B}_K_PA
İzinsiz girmeye çalışan kişi mesajı tekrar oynattıramayabilir çünkü mesaj B'nin kimliğine sahip olmasına karşı A mesajda I'nın kimliğini beklemektedir.