A RSA az Diffie-Hellmann algoritmus esetén a biztonság eléréséhez igen nagy méretű egész számokra van szükség, hogy biztonságos kommunikációs rendszert kapjunk. Ez azért problémás, mivel a számÃtógépek számÃtási teljesÃtménye folyamatosan növekszik és egyre nagyobb méretű kulcsokat kell használnunk. Például a 2000-es évek elején még egy 1024 bites RSA kulcs biztonságosnak volt tekinthetÅ‘, de a 2000-es évek közepén már 2048 bit volt javasolt, manapság pedig inkább 4096 bit alkalmazott.
Éppen ezért kerültek elÅ‘térbe kriptográfiában az elliptikus görbék. Az elliptikus görbe egy sima (differenciálható) harmadfokú görbe a projektÃv sÃkban, aminek a nemszáma1 1. Egy ilyen görbe általános egyenlete y2 = x3 + ax + b formában Ãrható fel. Az elliptikus görbe elnevezés onnan származik, hogy elliptikus integrálokat paramétereznek.
Kriptográfiai jelentÅ‘ségük abban a nehézségben rejlik, hogy lehetetlen kiszámÃtani egy véletlenszerű elliptikus görbe elem diszkrét logaritmusát egy nyilvánosan ismert alapponthoz viszonyÃtva.
Az RSA-hoz képest egyenértékű kriptográfiai erÅ‘sséget kÃnálnak jóval alacsonyabb kulcsmérettel. Az alábbi táblázat a különbözÅ‘ rendszerek egyenértékű kulcsméretét foglalja össze bitben kifejezve:
| Szimmetrikus | elliptikus | RSA |
|---|---|---|
| 80 | 160 | 1024 |
| 112 | 224 | 2048 |
| 128 | 256 | 3072 |
| 192 | 384 | 7680 |
| 256 | 512 | 15360 |
A kisebb kulcsméret azt is jelenti, hogy erÅ‘sebb titkosÃtás érhetÅ‘ el kevesebb számÃtási teljesÃtmény és hálózati sávszélesség mellett, ami ideális jelöltté teszi az elliptikus módszereket IoT környezetekben is.
Diffie-Helmann
A Diffie-Helmann kulcscsere is adaptálható elliptikus görbékre. Ezt nevezzük ECDiffieHellman algoritmusnak. .NET esetén a Diffie-Helmann kulcscserének csak ezen változata implementált. Az alábbi példakód ennek a használatát mutatja be:
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
class Alice
{
public static byte[] alicePublicKey;
public static void Main(string[] args)
{
using (ECDiffieHellmanCng alice = new ECDiffieHellmanCng())
{
alice.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash;
alice.HashAlgorithm = CngAlgorithm.Sha256;
alicePublicKey = alice.PublicKey.ToByteArray();
Bob bob = new Bob();
CngKey bobKey = CngKey.Import(bob.bobPublicKey, CngKeyBlobFormat.EccPublicBlob);
byte[] aliceKey = alice.DeriveKeyMaterial(bobKey);
byte[] encryptedMessage = null;
byte[] iv = null;
Send(aliceKey, "Secret message", out encryptedMessage, out iv);
bob.Receive(encryptedMessage, iv);
}
}
private static void Send(byte[] key, string secretMessage, out byte[] encryptedMessage, out byte[] iv)
{
using (Aes aes = new AesCryptoServiceProvider())
{
aes.Key = key;
iv = aes.IV;
// Encrypt the message
using (MemoryStream ciphertext = new MemoryStream())
using (CryptoStream cs = new CryptoStream(ciphertext, aes.CreateEncryptor(), CryptoStreamMode.Write))
{
byte[] plaintextMessage = Encoding.UTF8.GetBytes(secretMessage);
cs.Write(plaintextMessage, 0, plaintextMessage.Length);
cs.Close();
encryptedMessage = ciphertext.ToArray();
}
}
}
}
public class Bob
{
public byte[] bobPublicKey;
private byte[] bobKey;
public Bob()
{
using (ECDiffieHellmanCng bob = new ECDiffieHellmanCng())
{
bob.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash;
bob.HashAlgorithm = CngAlgorithm.Sha256;
bobPublicKey = bob.PublicKey.ToByteArray();
bobKey = bob.DeriveKeyMaterial(CngKey.Import(Alice.alicePublicKey, CngKeyBlobFormat.EccPublicBlob));
}
}
public void Receive(byte[] encryptedMessage, byte[] iv)
{
using (Aes aes = new AesCryptoServiceProvider())
{
aes.Key = bobKey;
aes.IV = iv;
// Decrypt the message
using (MemoryStream plaintext = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(plaintext, aes.CreateDecryptor(), CryptoStreamMode.Write))
{
cs.Write(encryptedMessage, 0, encryptedMessage.Length);
cs.Close();
string message = Encoding.UTF8.GetString(plaintext.ToArray());
Console.WriteLine(message);
}
}
}
}
}
-
Egy felület nemszáma, vagy neme azoknak az egyszeresen összefüggÅ‘ zárt görbéknek a maximális számával egyezik meg, amelyek mentén szétvágva a felületet a felület összefüggÅ‘ marad. Például egy gömbfelület nemszáma 0, mivel nincsenek rajta lyukak, vagyis bármely egyszerű zárt görbe mentén szétvágva szétesik. – https://hu.wikipedia.org/wiki/Nemsz%C3%A1m↩