**Diffie–Hellman**-avaintenvaihtoprotokolla (DHE, D-H) on salausprotokolla, jonka avulla kaksi osapuolta voivat sopia yhteisestä salaisuudesta turvattoman tietoliikenneyhteyden ylitse. Kun osapuolilla on yhteinen salaisuus, sitä voidaan käyttää viestien salaamiseen perinteisillä salausmenetelmillä.

Algoritmin julkaisivat Whitfield Diffie ja Martin Hellman vuonna 1976, vaikka myöhemmin onkin selvinnyt että sen oli jo aiemmin keksinyt englantilainen Malcolm J. Williamson, mutta sitä pidettiin sotasalaisuutena. Ralf Merkle osallistui merkittävällä tavalla algoritmia edeltävän julkisen avaimen salausmenetelmän ajatuksen kehittämiseen.

Diffie–Hellman-avainteenvaihtoa käytetään muiden todennusmenetelmien kanssa suojaamaan IP-liikennettä IPsec-protokollien Internet Key Exchange-avaintenvaihtoprotokollassa. Diffie–Hellman oli ensimmäinen julkisen avaimen salausmenetelmä.

Yksinkertaistettu kuvaus
------------------------

Diffie-Hellman
Alkuperäisessä ja yksinkertaisimmassa muodossaan protokolla käyttää kokonaislukujen jäännösluokkarenkaan multiplikatiivista ryhmää modulo jokin alkuluku *p* ja sen primitiivistä alkiota *g*.

Esimerkki protokollasta:

1. Liisa ja Roope sopivat käyttävänsä alkulukua *p*=23 ja primitiivistä alkiota *g*=5.
2. Liisa valitsee salaisen kokonaisluvun *a*=6, ja lähettää Roopelle luvun (*ga* mod *p*)
	* 56 mod 23 = 8.
3. Roope valitsee salaisen kokonaisluvun *b*=15 ja lähettää Liisalle luvun (*gb* mod p)
	* 515 mod 23 = 19.
4. Liisa laskee luvun (*gb* mod *p*)*a* mod *p*
	* 196 mod 23 = 2.
5. Roope laskee luvun (*ga* mod *p*)*b* mod *p*
	* 815 mod 23 = 2.

Liisa ja Roope ovat nyt saaneet saman luvun, koska *gab* ja *gba* ovat yhtäsuuret. Huomattakoon, että ainoastaan luvut *a*, *b*, *gab* ja *gba* ovat salassa pidettäviä. Kaikki muut luvut voidaan lähettää selväkielisinä. Kun Liisa ja Roope ovat saaneet näin vaihdettua salaiset avaimet, he voivat käyttää niitä avoimessa tietoliikennekanavassa tapahtuvan keskinäisen viestintänsä salaamiseen.

Todellisessa tilanteessa tulisi tietysti valita luvut *a*, *b* ja *p* huomattavasti suuremmiksi. 
Jos alkuluku *p* olisi yli 300 numeroinen ja luvut *a* ja *b* vähintään 100 numeroisia lukuja, parhailtakin tunnetuilta (diskreetin logaritmin) algoritmeilta kuluisi vähintään tunnetun maailmankaikkeuden iän verran aikaa lukujen *a* ja *b* laskemiseen tunnettujen lukujen *g*, *p*, *ga* mod *p* ja *gb* mod *p* perusteella. Luvun *g* ei välttämättä tarvitse olla kovin suuri. Itse asiassa luvut 2 tai 5 ovat tavallisia valintoja.

Yleisempi kuvaus
----------------

1. Liisa ja Roope sopivat käytettävästä äärellisestä syklisestä ryhmästä *G* ja sen generoivasta alkiosta *g*. (Tämä tehdään yleensä paljon ennen protokollan käyttötapahtumaa; Alkion *g* oletetaan olevan mahdollisten hyökkääjien tiedossa.) Käytämme ryhmän *G* laskutoimitukselle multiplikatiivista merkintätapaa (ts. kertomerkkiä).
2. Liisa valitsee satunnaisen luonnollisen luvun *a* ja laskee ryhmän *G* alkion *g**a*, jonka hän lähettää Roopelle.
3. Roope valitsee satunnaisen luonnollisen luvun *b* ja laskee ryhmän *G* alkion *g**b*, jonka hän lähettää Liisalle.
4. Liisa laskee ryhmän *G* alkion (*g**b*)*a*.
5. Roope laskee ryhmän *G* alkion (*g**a*)*b*.

Sekä Liisa, että Roope tietävät nyt ryhmän alkion *g**ab*, joka toimii heidän salaisena avaimenaan. Ryhmän *G* alkiot (*g**b*)*a* ja (*g**a*)*b* ovat keskenään yhtäsuuret, koska ryhmät ovat potenssiassosiatiivisia.

Yksityiskohtia ja ongelmia
--------------------------

Operaatiot tehdään oikeasti hyvin valituilla äärellisiin eli Galois’n kuntiin kuuluvilla arvoilla ja operaatioilla, jolloin saadaan erityisen helposti laskettavat eksponenttioperaatiot ja vaikeasti laskettavat diskreetit logaritmioperaatiot. Yksinkertaistaen tämä tarkoittaa vain sitä, että luvut katkaistaan tiettyyn pituuteen. Ollakseen turvallinen, Diffie–Hellman-algoritmissa käytettävien lukujen pitää olla hyvin pitkiä, tuhansia bittejä eli satoja numeroita.

Kukaan ei ole todistanut sitä, ettei ole olemassa keinoa laskea logaritmeja paljon nykyistä tehokkaammin. Jonain päivänä nyt varmana pidetty Diffie–Hellman-avain voikin murtua helposti.

Diffie–Hellman-algoritmin suuri ongelma on se, ettei vastapuolta todenneta.
Tämä mahdollistaa jonkun toimimisen Roopen ja Liisan välissä. Sen sijaan, että Roope on sopinut salaisuuden Liisan kanssa, hän onkin sopinut sen Villen kanssa. Ville tekee myös tämän saman Liisalle. Kun Roope ja Liisa kuvittelevat sopineensa salaisuuden keskenään ja alkavat salatun tiedonsiirron, kaikki kulkeekin selväkielisenä Villen kautta. Tätä kutsutaan mies välissä -hyökkäykseksi (engl. *man-in-the-middle attack*).

Algoritmi edellyttää myös ulkopuoliselle täysin arvaamattomien satunnaislukujen käyttöä. Tällaisten tekeminen on usein yllättävän vaikeaa pelkän tietokoneen avulla.

Haavoittuvuudet
---------------

Vuonna 2015 raportoitiin Logjam-hyökkäyksestä, joka hyödyntää Diffie–Hellmanissa olevaa haavoittuvuutta.

Standardit
----------

* RFC 2631 Diffie–Hellman Key Agreement Method
* RFC 3526 More Modular Exponential (MODP) Diffie–Hellman groups for Internet Key Exchange (IKE)

Lähteet
-------

1. ↑  Weak Diffie-Hellman and the Logjam Attack *weakdh.org*. Viitattu 1.11.2019. (englanniksi)
2. ↑  Dan Goodin: HTTPS-crippling attack threatens tens of thousands of Web and mail servers  20.5.2015. Ars Technica. Viitattu 1.11.2019. (englanniksi)

Aiheesta muualla
----------------

CommonsCommons
Wikimedia Commonsissa on kuvia tai muita tiedostoja aiheesta **Diffie–Hellman**.
* "Public Key Cryptography: Diffie-Hellman Key Exchange" – Khan Academy (englanniksi)
* U.S. Patent #4,200,770[vanhentunut linkki] , Alkuperäinen patentti (Diffie, Hellman ja Merkle), ei enää voimassa
* *Summary of ANSI X9.42: Agreement of Symmetric Keys Using Discrete Logarithm Cryptography*[vanhentunut linkki] ANSI X9.42 standardi (PDF)

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * n
* k
* m
Kryptografiset algoritmit |
| --- |
|  |
| Symmetrinen salaus | 
* 3-DES
* AES
* AES-GCM
* Blowfish
* CAST-128
* CAST-256
* DES
* GOST
* IDEA
* RC2
* RC4
* RC5
* RC6
* Salsa20
* Skipjack
* Twofish

 |
|  |
| Julkisen avaimen salaus | 
* Diffie-Hellman
* ElGamal
* Elliptiset käyrät
* RSA

 |
|  |
| Kryptografiset tiivisteet | 
* MD2
* MD4
* MD5
* SHA-0
* SHA-1
* SHA-2
* SHA-3
* BLAKE
* BLAKE2
* BLAKE3

 |
|  |
| Salausprotokollat | 
* CCMP
* TKIP
* TLS
* WEP
* WPA

 |
|  |
| Viestin todennuskoodit | 
* HMAC
* CMAC
* GMAC
* Poly1305
* SipHash

 |
|  |
| Digitaaliset allekirjoituskoodit | 
* DSA
* ECDSA
* EdDSA
* X.509

 |
|  |
| Luettelo salausalgoritmeista |

 |