**ElGamal**-algoritmi on epäsymmetrinen julkisen avaimen salausalgoritmi, joka perustuu Diffie-Hellman avaimenvaihtojärjestelmään. Sen on esittänyt Taher Elgamal vuonna 1984. ElGamal-algoritmia käyttävät mm. GNU Privacy Guard -ohjelmisto, PGP:n uudemmat versiot ja monet muut salausjärjestelmät. DSA (Digital Signature Algorithm) on ElGamal -signatuuriskeeman variantti, mutta sitä ei tule sekoittaa ElGamal-algoritmiin.

ElGamal voidaan määrittää missä tahansa syklisessä ryhmässä G. Sen turvallisuus riippuu diskreetin logaritmin laskemisesta ryhmässä G.

Algoritmi
---------

ElGamal koostuu kolmesta komponentista: avainten generointi, salausalgoritmi ja salauksen purkualgoritmi.

Avainten generointi tapahtuu seuraavasti:

Liisa valitsee jonkin syklisen ryhmän {\displaystyle G}. Olkoon {\displaystyle q} ryhmän {\displaystyle G} kertaluku eli alkioiden lukumäärä. Tämä kertaluku määrää Liisan käyttämän salakirjoitusjärjestelmän avaimen pituuden.

Seuraavaksi Liisa etsii jonkin ryhmän {\displaystyle G}
primitiivisen alkion {\displaystyle g}. Primitiivisen alkion ominaisuus on se, että jokainen syklisen ryhmän {\displaystyle G} alkio voidaan esittää tämän alkion potenssina. Tämän eksponentin laskemista kutsutaan ryhmän {\displaystyle G} diskreetin logaritmin probleemaksi.

Liisa valitsee satunnaisen luvun {\displaystyle x} joukosta {\displaystyle \lbrace 0,1,...q-1\rbrace }.

Liisa laskee ryhmän {\displaystyle G} alkion {\displaystyle h=g^{x}}.

Liisa julkaisee käyttämänsä syklisen ryhmän {\displaystyle G}, sen kertaluvun {\displaystyle q}, primitiivisen alkion {\displaystyle g} ja 
laskemansa alkion {\displaystyle h}. Nämä muodostavat hänen julkisen avaimensa. Luvun {\displaystyle x} Liisa pitää salaisena avaimenaan.

Salausalgoritmi toimii seuraavasti:

Oletetaan, että Roope haluaa lähettää Liisalle salaisen viestin käyttäen Liisan julkistamaa salakirjoitusjärjestelmää.

Roope konvertoi aluksi viestinsä ryhmän {\displaystyle G} alkioksi {\displaystyle m} käyttäen jotain yksinkertaista ja tunnettua koodausta (vaikkapa ASCII-koodia). 

Roope valitsee satunnaisen alkion {\displaystyle y} lukujoukosta {\displaystyle \lbrace 0,1,...q-1\rbrace }.

Tämän jälkeen hän laskee ryhmän {\displaystyle G} alkiot {\displaystyle c\_{1}=g^{y}} ja 
{\displaystyle c\_{2}=m\cdot h^{y}}.

Roope lähettää Liisalle salakielisen viestin {\displaystyle (c\_{1},c\_{2})}.

Salauksen purku toimii seuraavasti:

Liisa laskee ryhmän {\displaystyle G} alkion {\displaystyle c\_{2}(c\_{1}^{x})^{-1}}.

Nyt
{\displaystyle c\_{2}(c\_{1}^{x})^{-1}={\frac {m\cdot h^{y}}{g^{xy}}}={\frac {m\cdot g^{xy}}{g^{xy}}}=m}.

Ryhmän {\displaystyle G} kertaluvun {\displaystyle q} määräämää avaimen pituutta pitemmät viestit joudutaan pilkkomaan avaimen pituutta pienempiin osiin.

ElGamal-järjestelmää käytetään kuitenkin varsinaisten viestien salaamisen sijasta yleensä ns. avaimenvaihtojärjestelmänä. Tällöin lyhyt symmetrisen salauksen salakirjoitusjärjestelmän avain vaihdetaan ElGamal-järjestelmää käyttäen ja näin vaihdettua avainta käytetään sitten varsinaisten pitempien viestien salaamiseen.

Tehokkuus
---------

Viestin salaamiseen ElGamal-järjestelmää käyttäen tarvitaan kaksi potenssiinkorotusta. Nämä potenssiinkorotukset voidaan kuitenkin laskea toisistaan riippumatta. Viestin purkamiseen tarvitaan kuitenkin vain yksi potenssiinkorotus. Desiferoinnissa käytetty laskukaava voidaan nimittäin kirjoittaa muotoon {\displaystyle c\_{2}(c\_{1}^{x})^{-1}=c\_{2}c\_{1}^{-x}=c\_{2}c\_{1}^{q-x}}.

Toisin kuin RSA-menetelmässä, laskentaa ei voida nopeuttaa kiinalaista jäännöslausetta käyttäen.

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

| * 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 |

 |