16

.NETプラットフォームで使用する楕円曲線暗号の実装をお勧めしますか?楕円曲線暗号の.NET実装(ライブラリ)

また、使用した場合は、使用すべき推奨カーブを教えてください。

[EDIT]

@FatCatが述べたように、その実装は、.NET Framework 3.5で提供されていますが、それは、Windows Vistaでのみ使用可能です。あなたはそれを使用する別の方法/ライブラリをお勧めしますか?

答えて

9

C#のBouncy Castleライブラリをチェックしてください。これにはECDHとECDSAがあります。

+0

Thanks Chochos。私はBouncy Castleライブラリをうまく使用しました。しかし、ドキュメンテーションを見つけるのは少し難しかった! :) – Hemant

+0

C#の最終リリースは2011年4月7日、Java 1.51、2014年7月27日です。C#プロジェクトでは、Bouncy Castleは機能がなく、コードが維持されていないため、好きではありません。 –

+0

C#のBouncyCastleのECCは非常に遅く、タイミング攻撃に対して脆弱である可能性があることに注意してください。 – CodesInChaos

11

.NET Frameworkには既に、楕円曲線の暗号アルゴリズムであるDiffie-Hellmanが含まれています。 System.Security.Cryptography.ECDiffieHellmanCngをご覧ください。

+0

素晴らしい! 私はそれを試しましたが、メッセージを暗号化するためにそれを使用する方法を見つけることができません。どのような "Encrypt"機能も持たないようです...フレームワーク3.5の新しいクラスのドキュメントは嫌です。 – Hemant

+0

ああ、今私はこれがWindows Vistaでのみ動作することを認識しています。 – Hemant

+1

* Cngサフィックスは、暗号化作業がWindows Vista以降で使用できるWindows CNG(Crypto Next Gen)にオフロードされることを意味します。 –

3

通常、暗号化にECCを使用する方法は、「Ephemeral-Static Diffie-Hellman」を使用する方法です。

それはこのように動作します:

  • は、意図した受信機(おそらく、証明書から)の公開鍵を取ります。これが静的キーです。
  • 一時的なECDH鍵ペアを生成します。これは一過性の鍵ペアです。
  • キーを使用して共有対称キーを生成します。
  • データを対称キーで暗号化します。
  • 一時鍵ペアから公開鍵とともに暗号化されたデータを送信します。

受信者は、一時的な公開鍵と自身の静的秘密鍵を使用して、対称鍵を再作成してデータを復号できるようになりました。

詳しくはStandards for Efficient Cryptography: SEC 1: Elliptic Curve Cryptographyセクション5.1.3をご覧ください。

0

グレートを見てください!私はそれを試しましたが、メッセージを暗号化するためにそれを使用する方法を見つけることができません。 は、任意の「暗号化」機能

これはSystem.Security.Cryptography.ECDiffieHellmanCngのためのMSDNのサンプルを持っていないようです。

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); 
       } 
      } 
     } 
    } 

} 
関連する問題