.NET-реализация (библиотеки) криптографии эллиптических кривых
Пожалуйста, можете ли вы предложить какую-либо реализацию криптографии эллиптических кривых для использования на платформе .NET?
Также, если вы использовали их, можете ли вы сказать мне рекомендуемые кривые, которые следует использовать?
[EDIT]
Как упоминалось в @FatCat, его реализация доступна в .NET framework 3.5, но доступна только в windows vista. Не могли бы вы предложить другой способ/библиотеку, чтобы использовать его?
5 ответов:
Проверьте библиотекуBouncy Castle для C#, в ней есть ECDH и ECDSA.
Платформа .NET Framework уже включает в себя алгоритм Диффи-Хеллмана, представляющий собой криптоалгоритм эллиптической кривой. Посмотрите под системой.Безопасность.Криптография.ECDiffieHellmanCng .
Способ, которым вы обычно используете ECC для шифрования, заключается в использовании "эфемерно-статического Диффи-Хеллмана".
Это работает следующим образом:
Теперь получатель может использовать эфемерный открытый ключ и свой собственный статический закрытый ключ для воссоздания симметричного ключа и расшифровки данных.
- Возьмите открытый ключ предполагаемого получателя (возможно, из сертификата). Это статический ключ.
- Создайте временную пару ключей ECDH. Это эфемерная ключевая пара.
- Используйте ключи для создания общего симметричного ключа.
Шифрование данных с помощью симметричного ключа.- передайте зашифрованные данные вместе с открытым ключом от эфемерных ключей.
Вы можете прочитать больше встандартах эффективной криптографии: раздел 1: криптография эллиптических кривых раздел 5.1.3.
Взгляните на SecureBlackBox Компоненты
Отлично! Я попробовал его, но не могу найти, как использовать его для шифрования сообщения. Похоже, у него нет никакой функции "шифровать"
Это образец MSDN для
System.Security.Cryptography.ECDiffieHellmanCng.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 k = CngKey.Import(bob.bobPublicKey, CngKeyBlobFormat.EccPublicBlob); byte[] aliceKey = alice.DeriveKeyMaterial(CngKey.Import(bob.bobPublicKey, CngKeyBlobFormat.EccPublicBlob)); 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); } } } } }
Comments