.NET

2010-07-07 3 views
10

में न्यूनतम संदेश आकार सार्वजनिक कुंजी एन्क्रिप्शन मैं सार्वजनिक कुंजी क्रिप्टोग्राफ़ी सिस्टम का उपयोग कर जितना संभव हो उतना छोटा (अधिकतम, 16 बाइट्स से अधिक नहीं) संदेश में बहुत कम डेटा (सटीक होने के लिए 15 बाइट) एन्क्रिप्ट करना चाहता हूं ।.NET

मानक सार्वजनिक कुंजी सिस्टम, आरएसए, दुर्भाग्य से संदेशों को अपनी चाबियों के रूप में बड़ा बनाता है, जो मुख्य आकार के आधार पर लगभग 100 बाइट्स है। चीजों को और अधिक कठिन बनाने के लिए, मैं केवल .NET ढांचे पुस्तकालयों का उपयोग कर सकता हूं, यानी कोई तीसरी पार्टी नहीं।

मैंने विकिपीडिया में अंडाकार वक्र क्रिप्टोग्राफी के बारे में कुछ पढ़ा है और पाठ में यह सुझाव मिलता है कि मुख्य आकार आरएसए कुंजी से आमतौर पर बहुत कम होते हैं।

क्या यह छोटे संदेशों को भी अनुवाद करता है? क्या संदेशों को डी/एन्क्रिप्ट करने के लिए .NET ECDiffieHellmanCng कक्षा का उपयोग किया जा सकता है? ऐसा लगता है कि आरएसए या सममित सिफर कहते हैं, तो यह एक अलग वर्ग संरचना की विशेषता है।

+0

सार्वजनिक कुंजी क्रिप्टोग्राफी बड़ी कुंजी के आकार पर निर्भर करता है, क्योंकि आज तेजी से कंप्यूटर कुछ ही घंटों में भी 256-बिट कुंजी तोड़ सकते हैं:

यहां एक छोटा वर्ग है कि स्थिर स्थैतिक ECDH करना होगा है। यदि सुरक्षा की आवश्यकता अधिक है तो आपको छोटी चाबियों का उपयोग नहीं करना चाहिए। ओडब्ल्यू बस एक सममित कुंजी का उपयोग करें। – apoorv020

+3

@ apoorv020; अंडाकार वक्र सार्वजनिक कुंजी क्रिप्टोग्राफ़ी पर लागू होने पर आपका कथन गलत है। –

उत्तर

10

आप संदेशों को एन्क्रिप्ट करने के लिए ECDiffieHellman का उपयोग कर सकते हैं। आपके पास दो विकल्प हैं: स्टेटिक-स्टेटिक ईसीडीएच और स्थैतिक-क्षणिक ईसीडीएच:

स्थैतिक-स्थिर ईसीडीएच के लिए रिसीवर को प्रेषकों की सार्वजनिक कुंजी (यह आपके आवेदन में एक विकल्प हो सकता है या नहीं) को जानने की आवश्यकता होगी। आपके पास कुछ संदेश भी होना चाहिए जो इस संदेश के लिए अद्वितीय है (यह एक धारावाहिक-संख्या हो सकती है जो आप कहीं और प्रोटोकॉल या डेटाबेस-पंक्ति में प्राप्त करते हैं या जो भी हो या यह एक गैर-हो सकता है)। फिर आप एक गुप्त कुंजी उत्पन्न करने के लिए ईसीडीएच का उपयोग करते हैं और अपने डेटा को एन्क्रिप्ट करने के लिए इसका उपयोग करते हैं। यह आपको 16 बाइट्स की वांछित एन्क्रिप्टेड डेटा लंबाई देगा, लेकिन यह पूरी तरह असममित नहीं है: एन्क्रिप्टर संदेशों को डिक्रिप्ट करने में भी सक्षम है (फिर से: यह आपके एप्लिकेशन में कोई समस्या हो सकती है या नहीं)।

स्टेटिक-इफेमेरल थोड़ा अलग है: यहां एन्क्रिप्टर एक अस्थायी (क्षणिक) ईसी कीपैयर उत्पन्न करता है। उसके बाद वह एक कुंजीपटल उत्पन्न करने के लिए रिसीवर सार्वजनिक कुंजी के साथ इस कीपैयर का उपयोग करता है जिसका उपयोग डेटा एन्क्रिप्ट करने के लिए किया जा सकता है। अंत में वह एन्क्रिप्टेड डेटा के साथ रिसीवर को क्षणिक कीपैयर की सार्वजनिक कुंजी भेजता है। यह आपके एप्लिकेशन में बेहतर फिट हो सकता है, लेकिन पूर्ण एन्क्रिप्टेड डेटा अब ईसीडीएच -256 और एईएस का उपयोग करके 2 * 32 + 16 = 80 बाइट्स होगा (जैसा कि ग्रेग्स नोट्स आप 32 बाइट्स को केवल सार्वजनिक-एक्स के समन्वय को भेजकर सहेज सकते हैं- कुंजी, लेकिन मुझे विश्वास नहीं है कि .NET वाई-समन्वय को पुन: गणना करने के लिए कार्यक्षमता का खुलासा करता है)।

public static class StaticStaticDiffieHellman 
{ 
    private static Aes DeriveKeyAndIv(ECDiffieHellmanCng privateKey, ECDiffieHellmanPublicKey publicKey, byte[] nonce) 
    { 
    privateKey.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash; 
    privateKey.HashAlgorithm = CngAlgorithm.Sha256; 
    privateKey.SecretAppend = nonce; 
    byte[] keyAndIv = privateKey.DeriveKeyMaterial(publicKey); 
    byte[] key = new byte[16]; 
    Array.Copy(keyAndIv, 0, key, 0, 16); 
    byte[] iv = new byte[16]; 
    Array.Copy(keyAndIv, 16, iv, 0, 16); 

    Aes aes = new AesManaged(); 
    aes.Key = key; 
    aes.IV = iv; 
    aes.Mode = CipherMode.CBC; 
    aes.Padding = PaddingMode.PKCS7; 

    return aes; 
    } 

    public static byte[] Encrypt(ECDiffieHellmanCng privateKey, ECDiffieHellmanPublicKey publicKey, byte[] nonce, byte[] data){ 
    Aes aes = DeriveKeyAndIv(privateKey, publicKey, nonce); 
    return aes.CreateEncryptor().TransformFinalBlock(data, 0, data.Length); 
    } 

    public static byte[] Decrypt(ECDiffieHellmanCng privateKey, ECDiffieHellmanPublicKey publicKey, byte[] nonce, byte[] encryptedData){ 
    Aes aes = DeriveKeyAndIv(privateKey, publicKey, nonce); 
    return aes.CreateDecryptor().TransformFinalBlock(encryptedData,0, encryptedData.Length); 
    } 
} 

// Usage: 

ECDiffieHellmanCng key1 = new ECDiffieHellmanCng();  
ECDiffieHellmanCng key2 = new ECDiffieHellmanCng(); 

byte[] data = Encoding.UTF8.GetBytes("TestTestTestTes"); 
byte[] nonce = Encoding.UTF8.GetBytes("whatever"); 

byte[] encryptedData = StaticStaticDiffieHellman.Encrypt(key1, key2.PublicKey, nonce, data); 

Console.WriteLine(encryptedData.Length); // 16 

byte[] decryptedData = StaticStaticDiffieHellman.Decrypt(key2, key1.PublicKey, nonce, encryptedData); 

Console.WriteLine(Encoding.UTF8.GetString(decryptedData)); 
+1

आप केवल अल्पकालिक सार्वजनिक कुंजी के एक्स समन्वय को भेजकर 32 बाइट्स को सहेज सकते हैं। –

+0

धन्यवाद! स्थिर-स्थिर ईसीडीएच ऐसा लगता है जो मैं खोज रहा था। क्या आपको पता है कि संदेश को एन्क्रिप्ट करने के लिए मैं .NET ECDH कक्षाओं का उपयोग कैसे कर सकता हूं? जैसा कि सनी ने बताया, यह उनका प्राथमिक कार्य प्रतीत नहीं होता है। – Jens

+0

@ जेन्स: मैंने एक छोटा सा उदाहरण जोड़ा है –

0

ईसीडीएफआई हेल्मैन सीएनजी मूल डिफी-हेलमैन कुंजी एक्सचेंज प्रोटोकॉल का व्युत्पन्न है।
यह संदेशों को एन्क्रिप्ट करने के लिए नहीं बल्कि दोनों सिरों पर एक ही गुप्त मूल्य की गणना करने के लिए है।

Here ECDiffieHellmanCNG और इसके उद्देश्य पर कुछ जानकारी है।

+0

इनपुट के लिए धन्यवाद! मैं उम्मीद कर रहा था कि मैं किसी भी तरह से इस उद्देश्य में मेरे उद्देश्य के लिए उपयोग किए गए एल्गोरिदम का दुरुपयोग कर सकता हूं। =) – Jens

संबंधित मुद्दे