2013-01-07 7 views
6

मैं का उपयोग कर सी # आरएसए एन्क्रिप्शन/डिक्रिप्शन लागू करने की आवश्यकतामानचित्रण RSA एन्क्रिप्शन पैरामीटर सीआरटी (चीनी शेष प्रमेय) से नेट प्रारूप करने के लिए

मैं निम्नलिखित मानकों के साथ एक निजी कुंजी:

mod n, exponent, p , q, dP, dQ, और (p-1mod q)

से ऊपर मानकों की व्याख्या कर रहे हैं

Modulus, Exponent, P, Q, DP, DQ, D, InverseQ

जब मैं कोशिश कर रहा हूँ: Chinese remainder algorithm

हालांकि सी आरएसए की # .NET कार्यान्वयन में एड अलग पैरामीटर निम्नलिखित के रूप में स्थापित किया है CRT से DOTNET तक डेटा को मैप करने के लिए, मुझे त्रुटि Bad Data

के लिए, q, dP और dQ मैपिंग स्पष्ट है लेकिन बाकी पैरामीटर के बारे में मुझे यकीन नहीं है।

यह बहुत अच्छा होगा यदि मैं Modulus करने के लिए इन पैरामीटर

उत्तर

5

mod n नक्शे मानचित्रण सहायता प्राप्त कर सकते हो सकता है, p-1mod qInverseQ के नक्शे, Exponent लिए एन्क्रिप्शन प्रतिपादक नक्शे और D को डिक्रिप्शन प्रतिपादक नक्शे।

एन्क्रिप्शन एक्सपोनेंट e और डिक्रिप्शन एक्सपोनेंट d ई * डी = 1 मोड (पी -1) (क्यू -1) से संबंधित हैं। इस प्रकार यदि आपके पास एक है तो आप आसानी से सिस्टम का उपयोग कुछ तरीकों से प्राप्त कर सकते हैं System.umerics.BigInteger क्लास।

var Pminus1 = BigInteger.Subtract(P, BigInteger.One); 
var Qminus1 = BigInteger.Subtract(Q, BigInteger.One); 
var Phi = BigInteger.Multiply(Pminus1, Qminus1); 
var PhiMinus1 = BigInteger.Subtract(Phi, BigInteger.One); 
// var D = BigInteger.ModPow(E, PhiMinus1, Phi); 

ध्यान दें कि देखभाल जब एक .NET BigInteger निर्माण, खासकर यदि आप जावा के BigInteger वर्ग के लिए उपयोग किया जाता है लिया जाना चाहिए। अधिक जानकारी के लिए this question देखें।

संपादित करें:

CodeInChaos के रूप में बताते हैं कि अंतिम पंक्ति गलत है!

गलत! गलत! गलत!

मैं शर्मिंदा हूं। बुराई की ताकतों के धनुष में बिगइंटर वर्ग में मॉड्यूलर उलटा तरीका नहीं है और न ही एक विस्तारित यूक्लिडियन एल्गोरिदम विधि है। फिर भी आप 'सी # विस्तारित यूक्लिडियन एल्गोरिदम' के लिए Google कर सकते हैं, आप कई कार्यान्वयन पा सकते हैं। विस्तारित यूक्लिडियन एल्गोरिदम आपको पूर्णांक एक्स और वाई प्रदान करेगा जैसे कि 1 = ई * एक्स + फाई * वाई। एक्स ई मॉड फाई के विपरीत है, इसलिए सेटिंग डी = एक्स मॉड फाई की आवश्यकता है।

+0

ग्रेग्स, मेरे मामले में मेरे पास केवल एक एक्सपोनेंट है जो एक प्रमुख संख्या है। क्या मुझे इसे एन्क्रिप्शन और डिक्रिप्शन एक्सपोनेंट दोनों के रूप में उपयोग करना चाहिए? दूसरे शब्दों में डी और एक्सपोनेंट दोनों के लिए समान संख्या असाइन करें? – AaA

+0

नहीं, एन्क्रिप्ट और डिक्रिप्ट एक्सपोनेंट अलग हैं, हालांकि जब आप दोनों प्राइम होते हैं तो किसी को अन्य से लिया जा सकता है। –

+0

जब मैं सी # में आरएसए कुंजी उत्पन्न करता हूं, 'डी' मॉड्यूलस (128 बाइट्स या 1024 बिट्स) के समान आकार होता है। जैसा कि आप प्रश्न में देख सकते हैं, मेरे डेटा में डी या कुछ भी एन्क्रिप्शन/डिक्रिप्शन एक्सपोनेंट नाम नहीं है। दिए गए डेटा से डी की गणना करने के लिए कोई व्यावहारिक संदर्भ है। सभी नमूना कोड जिन्हें मैं पा सकता हूं एक पूर्णांक मॉड्यूलस (2 बाइट्स) का उपयोग करता हूं जो मेरा मामला नहीं है – AaA

0

डी इस तरह गणना की जा सकती:

var qq = BigInteger.Multiply(phi, n); 
    var qw = BigInteger.Multiply(phi, qq); 
    BigInteger D = BigInteger.ModPow(e, (qw - 1), phi); 
1

विस्तारित इयूक्लिडियन एल्गोरिथ्म मॉड्यूलर उलटा गणना करने के लिए, इस मामले डी में गणना की जाएगी, इस लिंक का उपयोग किया जा सकता है: http://www.di-mgt.com.au/euclidean.html#extendedeuclidean विस्तार पाने के लिए, मैं नीचे दिए गए सी # में स्रोत कोड का परीक्षण किया गया, और परिणाम मेल खाता है,

public static BigInteger modinv(BigInteger u, BigInteger v) 
{ 
    BigInteger inv, u1, u3, v1, v3, t1, t3, q; 
    BigInteger iter; 
    /* Step X1. Initialise */ 
    u1 = 1; 
    u3 = u; 
    v1 = 0; 
    v3 = v; 
    /* Remember odd/even iterations */ 
    iter = 1; 
    /* Step X2. Loop while v3 != 0 */ 
    while (v3 != 0) 
    { 
     /* Step X3. Divide and "Subtract" */ 
     q = u3/v3; 
     t3 = u3 % v3; 
     t1 = u1 + q * v1; 
     /* Swap */ 
     u1 = v1; v1 = t1; u3 = v3; v3 = t3; 
     iter = -iter; 
    } 
    /* Make sure u3 = gcd(u,v) == 1 */ 
    if (u3 != 1) 
     return 0; /* Error: No inverse exists */ 
     /* Ensure a positive result */ 
     if (iter < 0) 
      inv = v - u1; 
     else 
      inv = u1; 
     return inv; 
} 
संबंधित मुद्दे