16

타원 곡선 암호화의 구현을 .NET 플랫폼에서 사용하도록 제안 할 수 있습니까?타원 곡선 암호화의 .NET 구현 (라이브러리)

또한 사용했다면 권장 곡선을 말해야합니까?

[편집]

@FatCat가 언급 한 바와 같이, 그 구현은 .NET 프레임 워크 3.5에서 사용할 수 있지만이 윈도우 비스타에서만 사용할 수 있습니다. 다른 방법/라이브러리를 사용 하시겠습니까?

답변

9

C# 용 Bouncy Castle 라이브러리를 확인하십시오. ECDH와 ECDSA가 있습니다.

+0

감사합니다. 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

나는 그것을 시험해 보았지만 그것을 사용하여 메시지를 암호화하는 방법을 찾지 못했다. 어떤 "암호화"기능도없는 것 같습니다 ... 프레임 워크 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); 
       } 
      } 
     } 
    } 

}