2014-04-24 11 views
6

यह सुनिश्चित नहीं है कि क्रिप्टोग्राफी प्रश्न पूछने के लिए यह सही जगह है, लेकिन यहां जाता है।आरएसए की गणना डी

मैं आरएसए में "डी" काम करने की कोशिश कर रहा हूं, मैंने पी, क्यू, ई, एन और ओएनएन का काम किया है; होगा एक उदाहरण:

p = 79, q = 113, e = 2621 

n = pq     øn = (p-1)(q-1) 
n = 79 x 113 = 8927  øn = 78 x 112 = 8736 

e = 2621 
d = 

मैं नहीं कर सकते घ खोजने के लिए लगता है, मुझे पता है कि घ कि एक मूल्य करने के लिए है .. एड आधुनिक ø (एन) = 1. किसी भी मदद की सराहना की होगी

संपादित करें ई = 17, डी = 2753, पर = 3120

17 * 2753 आधुनिक 3120 = 1

+0

यह सवाल प्रतीत होता है विषय से हटकर है क्योंकि यह [क्रिप्टोग्राफी] के बारे में है (http://crypto.stackexchange.com) –

उत्तर

6

आप की (आधुनिक n) मॉड्यूलर उलटा है, जो बढ़ाया इयूक्लिडियन कलन विधि का उपयोग की जा सकती है के लिए देख रहे हैं:

function inverse(x, m) 
    a, b, u := 0, m, 1 
    while x > 0 
     q := b // x # integer division 
     x, a, b, u := b % x, u, x, a - q * u 
    if b == 1 return a % m 
    error "must be coprime" 

इस प्रकार, अपने उदाहरण में, inverse(17, 3120) = 2753 और inverse(2621, 8736) = 4373. यदि आप एल्गोरिदम लागू नहीं करना चाहते हैं, तो आप उत्तर के लिए Wolfram|Alpha से पूछ सकते हैं।

+0

चीयर्स, मैंने वोल्फ्राम अल्फा के बारे में सुना है, मैंने सोचा था कि यह एक ऐसा प्रोग्राम था जिसे आपको इंस्टॉल करना था, इसलिए मैंने अब तक इसके साथ कभी परेशान नहीं किया। मुझे जवाब मिला 4373 मॉड्यूलो 8736 के विपरीत - कमांड का उपयोग करके 4373 था। हालांकि अगर मैं जवाब दोहराता हूं तो मुझे 0 मिलता है, क्या यह 1 होना चाहिए? "एड मोड ø (एन) = 1"। इसके अलावा मेरा मानना ​​है कि आप आरएसए में एक छोटी और बड़ी संख्या में 2 लगने वाले हैं। मैं काम करने की कोशिश कर रहा हूं, मेरे पास एक बड़ा "ई" है लेकिन उदाहरण में "ई" छोटा है और "डी" बड़ा है – user3423572

+0

मैंने एक त्रुटि की है जो मुझे मिलता है 7936 है, 0 नहीं। – user3423572

+0

मेरा मूल समाधान संख्याओं को गलत तरीके से पढ़ना; जवाब अब तय कर दिया गया है। गलतफहमी के लिए खेद है। आरएसए में आमतौर पर _e_ की बाइनरी प्रस्तुति में केवल 1-बिट्स की एक छोटी संख्या होती है, क्योंकि 0-बिट्स के लिए कोई गणना नहीं होती है। इस प्रकार, ई = 3 = 11 बी या ई = 65537 = 10000000000000001b आम हैं। – user448810

3

एल्गोरिथ्म आप की जरूरत Extended Euclidean Algorithm है। यह आपको Bézout की पहचान का गुणांक जिसमें कहा गया है कि किसी भी दो गैर शून्य पूर्णांकों a और b के लिए, वहाँ पूर्णांकों x और y ऐसे हैं जो अस्तित्व में गणना करने के लिए अनुमति देता है:

ax + by = gcd(a,b) 

यह तुरंत उपयोगी नहीं लग सकता है, लेकिन हम जानते हैं कि e और φ(n) coprime हैं, gcd(e,φ(n)) = 1। तो एल्गोरिथ्म हमें देता है x और y ऐसी है कि:

ex + φ(n)y = gcd(e,φ(n)) 
      = 1 
Re-arrange: 
ex = -φ(n)y + 1 

यह ex mod φ(n) = 1 कहा, तो x = d के बराबर है।

+0

उत्तर के लिए धन्यवाद। मैंने आपकी व्याख्या को थोड़ा खो दिया है, मैं अपनी समस्या के लिए प्रदान किए गए फॉर्मूला को लागू करने के लिए संघर्ष कर रहा हूं। मैं अतीत में यूक्लिड के एल्गोरिदम में आया हूं लेकिन यह केवल एक महान आम divisor की गणना करने के लिए था - gcd – user3423572

+0

@ user3423572 मेरा जवाब वास्तव में एक वर्णन है कि एल्गोरिदम क्यों काम करता है - "विस्तारित यूक्लिडियन एल्गोरिदम" की पहली पंक्ति में लिंक होना चाहिए आपको सही दिशा में इंगित करें। आप सही हैं कि सामान्य यूक्लिडियन एल्गोरिदम आपको जीसीडी देता है, हालांकि "विस्तारित" संस्करण आपको बेज़ौट की पहचान के लिए गुणांक देता है - जिसमें से एक की आपको आवश्यकता है। – Iridium

2

उदाहरण के लिए आप अगले में घ प्राप्त करने की आवश्यकता:
3 * घ = 1 (आधुनिक 9167368)

इस समान रूप से है:
3 * घ = 1 + K * 9,167,368, जहां कश्मीर = 1, 2, 3, ...

यह रीराइट:
घ = (1 + K * 9167368)/3

आपका डी सबसे कम के साथ पूर्णांक होना चाहिए।
के सूत्र लिखते हैं:
घ = (1 + K * फाई)/ई

public static int MultiplicativeInverse(int e, int fi) 
     { 
      double result; 
      int k = 1; 
      while (true) 
      { 
       result = (1 + (k * fi))/(double) e; 
       if ((Math.Round(result, 5) % 1) == 0) //integer 
       { 
        return (int)result; 
       } 
       else 
       { 
        k++; 
       } 
      } 
     } 

आइए परीक्षण इस कोड:

Assert.AreEqual(Helper.MultiplicativeInverse(3, 9167368), 6111579); // passed 
संबंधित मुद्दे