2011-11-29 18 views
9

आज तक मैं इस धारणा के तहत रह रहा था कि आरएसए का उपयोग कर आरएसए एन्क्रिप्शन निर्धारक है। आखिरकार, हस्ताक्षर सत्यापन कैसे काम करना चाहिए यदि यह नहीं था?क्यों RSACryptoServiceProvider.Encrypt() आउटपुट स्थिर नहीं है?

मेरी बड़ा आश्चर्य करने के लिए

, .NETs RSACryptoServiceProvider एक स्थिर उत्पादन जब एक ही कुंजी के साथ बाइट्स के एक ही सेट को एनक्रिप्ट नहीं है:

[Fact] 
public void Learning() 
{ 
    const int keySize = 1024; 

    System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider(keySize); 

    var bytes = GenerateRandomDataWithLength(36); 

    for (int i = 0; i < 4; i++) 
     Assert.Equal(rsa.Encrypt(bytes, false), rsa.Encrypt(bytes, false)); 
} 

byte[] GenerateRandomDataWithLength(int length) 
{ 
    Random r = new Random(); 

    byte[] data = new byte[length]; 
    r.NextBytes(data); 

    return data; 
} 

मैं PKCS Specification के माध्यम से स्किम्ड है और मैं पीछे का गणित समझते हैं आरएसए, तो मुझे सच में आश्चर्य है कि मैं अस्थिर होने के लिए आउटपुट क्यों देख रहा हूं।

मोनो के आरएसए कार्यान्वयन में स्थिर उत्पादन है। Encrypt का अस्थिर आउटपुट डिक्रिप्शन को प्रभावित नहीं करता है, जो कि संभव है और अपेक्षित डेटा उत्पन्न करता है।

उत्तर

13

आरएसए एन्क्रिप्शन शुद्ध गणित है इसलिए यह आपको हर बार एक ही परिणाम देगा। हालांकि .NET में Encrypt को कॉल करना आरएसए एन्क्रिप्शन नहीं कर रहा है।

क्यों? पीकेसीएस # 1 पैडिंग (डिफ़ॉल्ट जब आप falseEncrypt में उपयोग करते हैं) डिफ़ॉल्ट रूप से प्रत्येक एन्क्रिप्टेड परिणाम अलग करेगा क्योंकि इसमें यादृच्छिक डेटा (पैडिंग उद्देश्य के लिए) शामिल है।

मोनो समान व्यवहार (कम से कम मेरे सिस्टम पर, नोट देखें)। हालांकि यदि आप EncryptValue का उपयोग कर रहे हैं, जो मोनो का समर्थन करता है लेकिन .NET नहीं करता है (CryptoAPI सीमा), तो नहीं पैडिंग किया जाएगा और एन्क्रिप्टेड परिणाम हर बार समान होगा।

नोट: यदि आपके पास अलग-अलग परिणाम हैं तो कृपया http://bugzilla.xamarin.com पर एक बग रिपोर्ट भरें और उस संस्करण संख्या को शामिल करें जिसका आप उपयोग कर रहे हैं।

+0

ठीक है, मैंने पूरी तरह से पैडिंग को यादृच्छिक डेटा शामिल किया था। आप यहां स्पष्ट रूप से सही हैं। आपके उत्तर के लिए धन्यवाद! (मैं जिस मोनो संस्करण को प्रतिबिंबित कर रहा था वह _very_ पुराना था, यह वास्तव में मोनोस आरएसए के लिए स्रोत था)। –

+1

@ जोहान्स ध्यान दें कि आरएसए एन्क्रिप्शन को चुने हुए-सादे टेक्स्ट हमलों के खिलाफ सुरक्षित बनाने के लिए कुछ यादृच्छिक पैडिंग की आवश्यकता होती है (यानी आउटपुट को एक अनुमानित सादे टेक्स्ट को फिर से एन्क्रिप्ट करना यह देखने के लिए कि क्या आउटपुट पहले से अवरुद्ध करता है)। –

+2

स्पष्टता के लिए मैं जोड़ता हूं कि 'एन्क्रिप्ट' में 'सत्य' का उपयोग करके यादृच्छिक पैडिंग में भी परिणाम होता है, मुझे विश्वास है ('ओएईपी')। –

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