16

कृपया आप .NET प्लेटफ़ॉर्म पर उपयोग किए जाने वाले अंडाकार वक्र क्रिप्टोग्राफ़ी के किसी भी कार्यान्वयन का सुझाव दे सकते हैं?अंडाकार वक्र क्रिप्टोग्राफी के .NET कार्यान्वयन (पुस्तकालय)

यदि आपने उन्हें उपयोग किया है, तो क्या आप मुझे सुझाए गए अनुशंसित वक्र बता सकते हैं?

[संपादित करें]

@FatCat उल्लेख किया है, इसके कार्यान्वयन के .NET Framework 3.5 में उपलब्ध है, लेकिन है कि Windows Vista पर ही उपलब्ध है। क्या आप इसका उपयोग करने के लिए एक और तरीका/लाइब्रेरी सुझा सकते हैं?

उत्तर

9

सी # के लिए Bouncy Castle लाइब्रेरी देखें, इसमें ईसीडीएच और ईसीडीएसए है।

+0

धन्यवाद Chochos। मैंने सफलतापूर्वक बाउंसी कैसल लाइब्रेरी का उपयोग किया है। हालांकि दस्तावेज को ढूंढना मुश्किल था! :) – Hemant

+0

जावा के लिए अंतिम रिलीज 1.7, 7 अप्रैल 2011 जावा 1.51, 27 जुलाई 2014 के लिए है। सी # परियोजनाओं के लिए मुझे लापता कैसल पसंद नहीं है, क्योंकि गायब सुविधाओं और बनाए रखा कोड नहीं है। –

+0

ध्यान दें कि सी # के लिए बाउंसीकास्टल में ईसीसी बहुत धीमी है और समय पर हमले के लिए कमजोर है। – CodesInChaos

11

.NET Framework में पहले से ही डिफी-हेलमैन शामिल है, जो एक अंडाकार वक्र क्रिप्टो एल्गोरिदम है। System.Security.Cryptography.ECDiffieHellmanCng के तहत देखें।

+0

बढ़िया! मैंने कोशिश की लेकिन संदेश को एन्क्रिप्ट करने के लिए इसका उपयोग कैसे करें। ऐसा लगता है कि कोई "एन्क्रिप्टेड" फ़ंक्शन नहीं है ... ढांचे में नए वर्गों का दस्तावेज़ीकरण 3.5 बेकार है। – Hemant

+0

ओह और अब मुझे एहसास है कि यह केवल विंडोज विस्टा पर ही काम करेगा। – Hemant

+1

* सीएनजी प्रत्यय का अर्थ है क्रिप्टो काम को विंडोज सीएनजी (क्रिप्टो नेक्स्ट जेन) में ऑफलोड किया गया है जो कि विंडोज विस्टा और बाद में लाभान्वित है। –

3

जिस तरह से आप आमतौर पर एन्क्रिप्शन के लिए ईसीसी का उपयोग करते हैं, वह "एफेमेरल-स्टेटिक डिफी-हेलमैन" का उपयोग करके होता है।

  • इरादा रिसीवर सार्वजनिक कुंजी (शायद एक प्रमाण पत्र से) ले लो:

    यह इस तरह से काम करता है। यह स्थिर कुंजी है।

  • एक अस्थायी ईसीडीएच कीपैयर उत्पन्न करें। यह क्षणिक कीपैयर है।
  • साझा सममित कुंजी उत्पन्न करने के लिए कुंजी का उपयोग करें।
  • सममित कुंजी के साथ डेटा एन्क्रिप्ट करें।
  • एन्क्रिप्टेड डेटा को अस्थायी कीपैयर से सार्वजनिक कुंजी के साथ एक साथ प्रेषित करें।

रिसीवर अब सममित सार्वजनिक कुंजी और सममित कुंजी को फिर से बनाने और डेटा को डिक्रिप्ट करने के लिए अपनी स्थिर निजी कुंजी का उपयोग कर सकता है।

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

}