आज तक मैं इस धारणा के तहत रह रहा था कि आरएसए का उपयोग कर आरएसए एन्क्रिप्शन निर्धारक है। आखिरकार, हस्ताक्षर सत्यापन कैसे काम करना चाहिए यदि यह नहीं था?क्यों 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
का अस्थिर आउटपुट डिक्रिप्शन को प्रभावित नहीं करता है, जो कि संभव है और अपेक्षित डेटा उत्पन्न करता है।
ठीक है, मैंने पूरी तरह से पैडिंग को यादृच्छिक डेटा शामिल किया था। आप यहां स्पष्ट रूप से सही हैं। आपके उत्तर के लिए धन्यवाद! (मैं जिस मोनो संस्करण को प्रतिबिंबित कर रहा था वह _very_ पुराना था, यह वास्तव में मोनोस आरएसए के लिए स्रोत था)। –
@ जोहान्स ध्यान दें कि आरएसए एन्क्रिप्शन को चुने हुए-सादे टेक्स्ट हमलों के खिलाफ सुरक्षित बनाने के लिए कुछ यादृच्छिक पैडिंग की आवश्यकता होती है (यानी आउटपुट को एक अनुमानित सादे टेक्स्ट को फिर से एन्क्रिप्ट करना यह देखने के लिए कि क्या आउटपुट पहले से अवरुद्ध करता है)। –
स्पष्टता के लिए मैं जोड़ता हूं कि 'एन्क्रिप्ट' में 'सत्य' का उपयोग करके यादृच्छिक पैडिंग में भी परिणाम होता है, मुझे विश्वास है ('ओएईपी')। –