16

Bạn có thể đề xuất bất kỳ việc thực hiện mã hóa đường cong elip nào để được sử dụng trên nền tảng .NET không?Triển khai .NET (thư viện) của mật mã đường cong elliptic

Ngoài ra nếu bạn đã sử dụng chúng, bạn có thể cho tôi biết các đường cong được khuyến nghị nên được sử dụng không?

[EDIT]

Như @FatCat đã đề cập, việc thực hiện nó có sẵn trong .NET framework 3.5 nhưng đó là chỉ có sẵn trên Windows Vista. Bạn có thể đề nghị một cách khác/thư viện để sử dụng nó?

Trả lời

9

Kiểm tra thư viện Bouncy Castle cho C#, nó có ECDH và ECDSA.

+0

Cảm ơn Chochos. Tôi đã sử dụng thành công thư viện Lâu đài Bouncy. Đó là ít khó khăn để tìm tài liệu mặc dù! :) – Hemant

+0

Lần phát hành cuối cùng cho C# là 1.7, ngày 7 tháng 4 năm 2011, cho Java 1.51, ngày 27 tháng 7 năm 2014. Đối với các dự án C# tôi không thích Lâu đài Bouncy, vì thiếu các tính năng và không được duy trì mã. –

+0

Lưu ý rằng ECC trong BouncyCastle cho C# rất chậm và dễ bị tấn công theo thời gian. – CodesInChaos

11

Khuôn khổ .NET đã bao gồm Diffie-Hellman, một thuật toán mã hóa đường cong elip. Xem dưới System.Security.Cryptography.ECDiffieHellmanCng.

+0

Tuyệt vời! Tôi đã thử nhưng không thể tìm cách sử dụng nó để mã hóa tin nhắn. Dường như không có bất kỳ chức năng "Mã hóa" nào ... Tài liệu về các lớp mới trong khuôn khổ 3.5 rất tệ. – Hemant

+0

Oh và bây giờ tôi nhận ra rằng điều này sẽ chỉ hoạt động trên Windows Vista. – Hemant

+1

* Hậu tố Cng có nghĩa là công việc mã hóa được tải xuống Windows CNG (Crypto Next Gen) có sẵn trong Windows Vista trở lên. –

3

Cách bạn thường sử dụng ECC để mã hóa bằng cách sử dụng "Ephemeral-Static Diffie-Hellman".

Nó hoạt động theo cách này:

  • Hãy thu dự định khóa công khai (có lẽ từ một giấy chứng nhận). Đây là khóa tĩnh.
  • Tạo cặp khóa ECDH tạm thời. Đây là cặp khoá tạm thời.
  • Sử dụng các phím để tạo khóa đối xứng dùng chung.
  • Mã hóa dữ liệu bằng khóa đối xứng.
  • Truyền dữ liệu đã mã hóa cùng với khóa công khai từ cặp khóa tạm thời.

Hiện tại, người nhận có thể sử dụng khóa công cộng tạm thời và khóa riêng tĩnh của riêng mình để tạo lại khóa đối xứng và giải mã dữ liệu.

Bạn có thể đọc thêm trong mục Standards for Efficient Cryptography: SEC 1: Elliptic Curve Cryptography phần 5.1.3.

0

Tuyệt vời! Tôi đã thử nó nhưng không thể tìm cách sử dụng nó để mã hóa một tin nhắn. Dường như không có bất kỳ chức năng "Mã hóa" nào

Mẫu MSDN này cho 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); 
       } 
      } 
     } 
    } 

} 
Các vấn đề liên quan