2011-11-11 7 views
8

मैथमैटिका में कभी भी अतिप्रवाह त्रुटि नहीं थी, निम्नलिखित हुआ।गणित ओवरफ्लो [] त्रुटि: क्यों और कैसे बाईपास करें?

RSA-एन्क्रिप्शन के सिद्धांत मैं डेमो-एड इस प्रकार है:

n = 11*13 
m = EulerPhi[n] 
e = 7 
GCD[e, m] 
d = PowerMod[e, -1, m] 
cipher2[m_String] := Map[Mod[#^e, n] &, ToCharacterCode[m]] 
decipher2[x_Integer] := FromCharacterCode[Map[Mod[#^d, n] &, x]] 

In[207]:= cipher2["StackOverflow"] 
decipher2[cipher2["StackOverflow"]] 
Out[207]= {8,129,59,44,68,40,79,62,49,119,4,45,37} 
Out[208]= StackOverflow 

कोई समस्या नहीं है sofar।

तब मैंने प्राइम संख्याओं को और यथार्थवादी रूप से बदल दिया, लेकिन अभी भी बहुत ही मध्यम आकार में बदल गया।

n = 252097800611*252097800629 

In[236]:= cipher2["StackOverflow"] 
decipher2[cipher2["StackOverflow"]] 

Out[236]= {27136050989627, 282621973446656, 80798284478113, \ 
93206534790699, 160578147647843, 19203908986159, 318547390056832, \ 
107213535210701, 250226879128704, 114868566764928, 171382426877952, \ 
207616015289871, 337931541778439} 

During evaluation of In[236]:= General::ovfl: Overflow occurred in computation. >> 

During evaluation of In[236]:= General::ovfl: Overflow occurred in computation. >> 

Out[237]= FromCharacterCode[{Overflow[], Overflow[], Overflow[], 
    Overflow[], Overflow[], Overflow[], Overflow[], Overflow[], 
    Overflow[], Overflow[], Overflow[], Overflow[], Overflow[]}] 

प्रश्न: मैं बस मेथेमेटिका की सीमा के माध्यम से चला है? क्या मैंने गलत दृष्टिकोण इस्तेमाल किया है? बाई पास क्या है, अगर कोई है ??

उत्तर

8

decyphering ऑपरेशन में PowerMod उपयोग करके देखें:

n = 252097800611*252097800629; 
m = EulerPhi[n]; 
e = 7; 
Print[GCD[e, m]]; 
d = PowerMod[e, -1, m]; 
Print[{"n" -> n, "m" -> m, "e" -> e, "d" -> d}]; 
Grid[ 
Join[{ 
    {"Input", "Encrypted", "Decrypt with Mod", "Decrypt with PowerMod"}}, 
    Table[{i, (j = Mod[i^e, n]), Mod[j^d, n], PowerMod[j, d, n]}, {i, 40}]], 
Frame -> All] 
+0

धन्यवाद अर्नोउड, (अपने नाम से पता चलता आपके पास बेल्जियम में, या एनएल जहां मैं रहता हूं।) –

6

हाँ, आप मेथेमेटिका की सीमा के माध्यम से चले गए हैं। गणित के किसी विशेष संस्करण में सिस्टम पर अधिकतम संख्या का प्रतिनिधित्व किया जा सकता है $MaxNumber द्वारा दिखाया गया है। आपके दूसरे उदाहरण में, d=18158086021982021938023 और इसलिए 27136050989627^d$MaxNumber से बड़ा तरीका है।

आप दूसरे चरण के लिए भी है जैसे आप d के लिए किया था, जो Mod अधिक कुशलता से a^b mod n गणना करेंगे PowerMod उपयोग कर सकते हैं। decipher2[x_List] := FromCharacterCode[Map[PowerMod[#, d, n] &, x]] के साथ, आप मिल:

cipher2["StackOverflow"] 
decipher2[cipher2["StackOverflow"]] 

Out[1]= {27136050989627, 282621973446656, 80798284478113, \ 
93206534790699, 160578147647843, 19203908986159, 318547390056832, \ 
107213535210701, 250226879128704, 114868566764928, 171382426877952, \ 
207616015289871, 337931541778439} 

Out[2]= "StackOverflow" 
+1

मुझे लगता है कि मैंने माना है कि मैथमैटिका सतह के नीचे पावरमोड पर स्विच करेगी जब यह एक छोटा एन के साथ मॉड एन होगा। - वैसे भी, PowerMod काम करता है, धन्यवाद। - मैं अर्नौड बुजिंग के जवाब को स्वीकार करूंगा क्योंकि यद्यपि उसने पहले जवाब दिया था और आपके जितना अंक नहीं है, क्षमा करें। –

0

हाँ, के रूप में अन्य पुरुष जवाब आप अच्छी तरह से और सही मायने में पहुँच गए हैं $ MAXNUMBER मेथेमेटिका संभाल कर सकते हैं।

एक बाईपास है जो मैक्सनंबर से बड़ी संख्या में बड़ी संख्या में मॉड पाएगा।

बड़ी संख्या में गणित में सीधे 163840000000^18158086021982021938023 को लागू करने की बजाय, जो कि बहुत बड़ा है, गणित को बचाने के लिए मॉड्यूलर अंकगणित का उपयोग करें ताकि बड़ी संख्या की गणना करने की समस्या हो।

इसके लिए आपको गणित कोड विकसित करने में सक्षम होना चाहिए, मुझे अभी तक यह नहीं पता कि यह कैसे करना है। लेकिन आप इसे हाथ से कर सकते हैं: मॉड [मॉड [मॉड [मॉड [मॉड [मॉड [मॉड [मॉड [मॉड [163840000000^181, एन]^580, एन]^860, एन]^21 9, एन]^820, एन]^219, एन]^380, एन]^23, एन]

कौन सा सही जवाब आप के लिए देख रहे हैं देता है, $ MAXNUMBER को पार किए बिना पूर्वजों

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