दिलचस्प पोस्ट
एंड्रॉइड होम स्क्रीन पर शॉर्टकट बनाएं जावा में स्ट्रिंग्स की तुलना मैं कैसे करूँ? "Async: false" jQuery.ajax () में क्या होता है? एसकेएल ग्रुप बनाम अलग से चित्रकारी फ़ोल्डर से गतिशील रूप से छवियां कैसे प्राप्त करें वेब-साइट को लैंडस्केप मोड में दिखाने के लिए मजबूर करना सी # एक और बिटमैप पर अल्फा चैनल में बिटमैप के पिक्सेल कॉपी करें पायथन में `string.split ()` का कोई जनरेटर संस्करण है? क्या सी # में वैरिएबल के लिए संदर्भ वापस करना संभव है? ReactJS दो घटक संचार NSUserDefaults में छवियों को सहेजें? मेरे एंड्रॉइड एप्लिकेशन में पीडीएफ कैसे पढ़ा जाए? मैं निश्चित वैरिएबल ऊंचाई हेडर और स्क्रॉल करने योग्य सामग्री बॉक्स की स्थिति में सीएसएस का उपयोग कैसे करूं? दृश्यता के बीच का अंतर। Collapsed और दृश्यता। Hidden पर्म स्पेस क्या है?

सी ++ बहुत बड़े पूर्णांकों से निपटने

मैं एन्क्रिप्शन / डिक्रिप्शन के लिए आरएसए एल्गोरिथ्म का उपयोग कर रहा हूं, और उन फाइलों को डिक्रिप्ट करने के लिए जो आपको कुछ बहुत बड़े मूल्यों से निपटना है। अधिक विशेष रूप से, जैसी चीजें

P = C^d % n = 62^65 % 133 

अब यह वास्तव में केवल गणना है कि बीमार हो रहा है मैंने मैट मैककटन के बिगइन्टेगर लाइब्रेरी का उपयोग करने की कोशिश की है, लेकिन मुझे लिंक करने के दौरान कई कंपलर त्रुटियां मिल रही हैं, जैसे:

 encryption.o(.text+0x187):encryption.cpp: undefined reference to `BigInteger::BigInteger(int)' encryption.o(.text+0x302):encryption.cpp: undefined reference to `operator<<(std::ostream&, BigInteger const&)' encryption.o(.text$_ZNK10BigIntegermlERKS_[BigInteger::operator*(BigInteger const&) const]+0x63):encryption.cpp: undefined reference to `BigInteger::multiply(BigInteger const&, BigInteger const&)' 

इसलिए मैं सोच रहा था कि आरएसए एल्गोरिथम से बाहर आने वाले वास्तव में बड़े पूर्णांकों को संभालने का सबसे अच्छा तरीका क्या होगा

मैंने सुना है कि एक संभावना आपके चर को दोहरा लंबे रूप में घोषित करने के लिए होगी, इसलिए …

 long long decryptedCharacter; 

लेकिन मुझे यकीन नहीं है कि वास्तव में कितना बड़ा है जो स्टोर कर सकता है


उदाहरण के लिए, मैं dev C ++ का उपयोग करके निम्न प्रोग्राम को संकलित करने और चलाने की कोशिश करता हूं:

 #include iostream #include "bigint\BigIntegerLibrary.hh" using namespace std; int main() { BigInteger a = 65536; cout << (a * a * a * a * a * a * a * a); return 0; } 

तो मुझे ये त्रुटि मिलती है

डेरेक, मैंने सोचा कि BigIntegerLibrary.hh फ़ाइल को शामिल करके, कि संकलक सभी आवश्यक फ़ाइलों के माध्यम से जाकर संकलित करेगा और उपयोग करेगा।

लिंकिंग त्रुटियों को हल करने के लिए ऊपर दिए गए प्रोग्राम को मैं कैसे प्रयास और संकलित करना चाहिए?

Solutions Collecting From Web of "सी ++ बहुत बड़े पूर्णांकों से निपटने"

मेटा-जवाब:

यदि आप बिगलन अंकगणित के लिए एक पुस्तकालय का उपयोग कर रहे हैं, तो खुद से पूछिए कि आप पूरे आरएसए कार्यान्वयन के लिए एक पुस्तकालय का उपयोग क्यों नहीं कर रहे हैं?

उदाहरण के लिए, http://www.gnu.org/software/gnu-crypto/ में एक आरएसए कार्यान्वयन शामिल है इसके पास जीएमपी के समान लाइसेंस है।

हालांकि, उनके पास http://mattmccutchen.net/bigint/ के समान लाइसेंस नहीं है, जो मुझे प्रतीत होता है कि वे अमेरिका में सार्वजनिक डोमेन में शामिल किए गए हैं।

मैं gmp का उपयोग करने का सुझाव देता हूं, यह मनमाने ढंग से लंबा ints को नियंत्रित कर सकता है और सभ्य C ++ बाइंडिंग है।

वर्तमान हार्डवेयर / सॉफवेयर लंबे लम्बे पर afaik 64 बिट हैं, इसलिए अहस्ताक्षरित संख्याओं को संभाल कर सकते हैं (2 ** 64) -1 == 18446744073709551615 जो आपको आरएसए से निपटने के लिए संख्याओं की तुलना में बहुत कम है

तेमैक, ऐसा लगता है कि आप बिगइटेगर कोड से सही ढंग से लिंक नहीं कर रहे हैं। मुझे लगता है कि आपको एक नई लाइब्रेरी तलाशने के बजाय इस समस्या को हल करना चाहिए। मैंने स्रोत पर एक नज़र BigInteger::BigInteger(int) , और BigInteger::BigInteger(int) सबसे निश्चित रूप से परिभाषित है एक संक्षिप्त नज़र यह दर्शाता है कि दूसरों के साथ-साथ भी हैं

उन लिंक त्रुटियों का अर्थ है जो आप BigInteger स्रोत को संकलित करने की उपेक्षा करते हैं, या जब आप लिंक करते हैं तो परिणामी ऑब्जेक्ट फ़ाइलों को शामिल करने की उपेक्षा करते हैं। कृपया ध्यान दें कि BigInteger स्रोत "सीसीपी" के बजाय "सीसी" एक्सटेंशन का उपयोग करता है, इसलिए सुनिश्चित करें कि आप इन फ़ाइलों को भी संकलित कर रहे हैं

लंबे समय तक कोशिश करने का आकार देखने के लिए:

 #include <stdio.h> int main(void) { printf("%d\n", sizeof(long long)); return 0; } 

मेरे मशीन पर यह 8 देता है जिसका मतलब है 8 बाइट्स जो 2 ^ 64 मानों को संग्रहीत कर सकते हैं।

आरएसए के लिए आपको एक बिग्नम पुस्तकालय की आवश्यकता है 64-बिट लंबे समय तक फिट होने के लिए संख्याएं बहुत बड़ी हैं एक बार मैं विश्वविद्यालय में एक सहयोगी था जिसने आरएसए को लागू करने के लिए एक असाइनमेंट मिला जिसमें खुद को बिग्नम लाइब्रेरी बनाने की व्यवस्था शामिल थी।

जैसे ही होता है, पायथन में एक बिग्नम पुस्तकालय है। कम्प्यूटर साइंस असाइनमेंट में फिट होने के लिए बिग्नम संचालकों को लिखना काफी छोटा है, लेकिन अब तक यह एक गैर तुच्छ काम करने के लिए पर्याप्त पासचा है। उनका समाधान था पायथन लायब्रेरी का उपयोग करने के लिए परीक्षण डेटा उत्पन्न करने के लिए अपने bignum पुस्तकालय को मान्य

आपको अन्य बिग्नम पुस्तकालयों को प्राप्त करने में सक्षम होना चाहिए।

वैकल्पिक रूप से, पायथन में एक प्रोटोटाइप को लागू करने की कोशिश करें और देखें कि क्या यह तेज़ है

यदि आप आरएसए को स्कूल के काम या कुछ और के रूप में लागू नहीं कर रहे हैं, तो मैं क्रिप्टो ++ लाइब्रेरी http://www.cryptopp.com को देखने का सुझाव देता हूं ।

क्रिप्टो सामान को बुरी तरह से लागू करना इतना आसान है

यह मेरा दृष्टिकोण है, यह स्क्वायरिंग + मॉड्यूलर एक्सपोन्नेशन का उपयोग करके तेजी से एक्सपोनेन्टेशन को जोड़ती है जो आवश्यक अंतरिक्ष को कम करता है

 long long mod_exp (long long n, long long e, long long mod) { if(e == 1) { return (n % mod); } else { if((e % 2) == 1) { long long temp = mod_exp(n, (e-1)/2, mod); return ((n * temp * temp) % mod); } else { long long temp = mod_exp(n, e/2, mod); return ((temp*temp) % mod); } } } 

मैं जीएमपी लाइब्रेरी की कोशिश करूँगा – यह इस प्रकार के कोड के लिए मजबूत, अच्छी तरह से परीक्षण किया जाता है, और आमतौर पर इस्तेमाल किया जाता है।

Openssl भी एक Bignum प्रकार आप उपयोग कर सकते हैं मैंने इसे इस्तेमाल किया है और यह अच्छी तरह से काम करता है यदि आप चाहते हैं तो सी ++ या उद्देश्य-सी जैसे ऊ भाषा में लपेटें आसान है

https://www.openssl.org/docs/crypto/bn.html

इसके अलावा, यदि आप नहीं जानते थे, तो इस फार्म x ^ y% z के समीकरण का उत्तर ढूंढने के लिए, एक एल्गोरिथ्म देखें जो कि मॉड्यूलर एक्सपोनेंटिएशन है। अधिकांश क्रिप्टो या बिग्नम पुस्तकालयों का विशेष रूप से इस गणना के लिए एक फ़ंक्शन होगा।

सिर्फ बड़ी संख्या से आरएसए कार्यान्वयन को सुरक्षित करने के लिए अधिक है। एक साधारण आरएसए कार्यान्वयन साइड चैनलों के माध्यम से निजी जानकारी को लीक करने के लिए विशेष रूप से समय (सरल शब्दों में: गणना करने का समय प्रक्रिया डेटा पर निर्भर करता है, जो कि किसी हमलावर को निजी कुंजी बिट्स के कुछ, संभवतः सभी को पुनर्प्राप्त करने की अनुमति देता है)। अच्छा आरएसए कार्यान्वयन काउंटरमेशर्स लागू करते हैं।

इसके अलावा, मॉड्यूलर एक्सपेंन्टिएशन से परे, पूरे पैडिंग व्यवसाय है, जो अवधारणात्मक रूप से कठिन नहीं है, लेकिन, सभी आई / ओ और पार्सिंग कोड के रूप में, सूक्ष्म बगों के लिए कमरा है। लिखने का सबसे आसान कोड वह कोड है जिसे पहले किसी और के द्वारा लिखा गया है।

एक और मुद्दा यह है कि एक बार जब आप अपना आरएसए कोड अप और चल रहे हैं, तो आप एक्सटेंशन और अन्य परिस्थितियों की कल्पना करना शुरू कर सकते हैं, उदाहरण के लिए "क्या होगा अगर मैं उपयोग करना चाहता हूं जो निजी कुंजी रैम में नहीं है लेकिन एक स्मार्ट कार्ड में?" कुछ मौजूदा आरएसए लागूकरण वास्तव में एपीआई हैं जो इसे संभाल सकते हैं। माइक्रोसॉफ्ट की दुनिया में, आप क्रिप्टोपीआई तलाशना चाहते हैं, जो कि विंडोज में एकीकृत है। आप एनएसएस पर भी देखना चाह सकते हैं, जो कि फ़ायरफ़ॉक्स ब्राउज़र एसएसएल के लिए उपयोग करता है।

संक्षेप करने के लिए: आप बड़े पूर्णांकियों से आरएसए-अनुपालन कार्यान्वयन का निर्माण कर सकते हैं, लेकिन यह आमतौर पर जो दिखता है उससे सही तरीके से करना कठिन होता है, इसलिए मेरी सलाह है कि मौजूदा आरएसए कार्यान्वयन का उपयोग करना है।

एक लंबे इंट आम तौर पर 64 बिट्स होते हैं जो संभवत: एक पूर्णांक को संभालना पर्याप्त नहीं होगा जो कि बड़े आपको शायद किसी प्रकार का एक बड़ा पुस्तकालय की आवश्यकता होगी।

स्टैक ओवरफ्लो पर भी यह प्रश्न देखें

अपने कंपाइलर दस्तावेज़ देखें कुछ कंपलर्स के प्रकार ऐसे परिभाषित हैं जैसे कि __int64 जो आपको उनका आकार देते हैं। शायद आपको उनमें से कुछ उपलब्ध हैं

बस नोट करने के लिए: __int64 और लंबे समय तक गैर मानक एक्सटेंशन हैं। सभी C ++ कंपाइलर द्वारा समर्थित होने की गारंटी नहीं है C ++ C89 पर आधारित है (यह 98 में आया था, इसलिए यह C99 पर आधारित नहीं हो सकता है)

(C 'सीएएम' के बाद से 'लंबे समय तक' के लिए समर्थन है)

वैसे, मुझे नहीं लगता कि 64 बिट पूर्णांक इस समस्या को हल करते हैं।

तथ्य यह है कि, आपको कुछ बड़ी लाइटर लाइब्रेरी का उपयोग करने में कोई समस्या है, इसका मतलब यह नहीं है कि यह एक गलत दृष्टिकोण है।

लंबे समय से प्रयोग करना निश्चित रूप से एक बुरा दृष्टिकोण है।

जैसा कि अन्य लोगों ने पहले से ही एक बड़ा दिमाग़ पुस्तकालय का उपयोग कर पहले से ही एक अच्छा दृष्टिकोण का प्रयोग किया है, लेकिन आपको उन त्रुटियों को हल करने में मदद करने में सक्षम होने के लिए आप हमारे लिए लाइब्रेरी का उल्लेख करते हुए अधिक विवरण पोस्ट करना होगा।

मैंने जीएमपी का इस्तेमाल किया जब मैंने आरएसए कार्यान्वयन लिखा था

मेरे क्रिप्टो की जरूरतों के लिए LibTomCrypt लाइब्रेरी का उपयोग करते हुए मुझे बहुत सफलता मिली है यह तेज़, दुबला, और पोर्टेबल है यह आपके लिए आरएसए कर सकता है या यदि आप चाहें तो गणित को संभाल सकते हैं।