सी

2015-10-23 2 views
5

में भारी संख्याओं से निपटने के लिए कैसे मैं सी में एक आरएसए एन्क्रिप्शन एल्गोरिदम लिख रहा हूं। मैं इसे कहीं भी उत्पादन में रखने की योजना नहीं बना रहा हूं, यह मुख्य रूप से बस है इसलिए मैं एन्क्रिप्शन की अपनी समझ को विस्तृत कर सकता हूं।सी

मैं आरएसए उत्पन्न करने वाली बड़ी संख्याओं से कैसे निपटूं? यहां तक ​​कि जब 103 की तरह एक अपेक्षाकृत छोटे निजी कुंजी के साथ डिक्रिप्शन प्रदर्शन, मैं अभी भी इस तरह की बातें से निपटने का मुद्दा है:

67^103 आधुनिक 143 = (1.21816096336830017301951805581 x 10^188) आधुनिक 143

उस आकार की संख्या को स्टोर करने का सबसे अच्छा तरीका क्या है? मानक पुस्तकालयों का उपयोग कर ऐसा करने का कोई तरीका है? ।

+2

आप को लागू कर सकता है सभी बड़ी संख्या अपने आप को गणित, लेकिन यह सिर्फ जीएमपी की तरह एक मौजूदा बहु परिशुद्धता लाइब्रेरी का उपयोग करना आसान है। –

+0

@ArtjomB। मैं सोच रहा था कि मैं आधार 2^64 में संख्याओं को स्टोर करने के लिए संभवतः एरे का उपयोग करके एक को कार्यान्वित कर सकता हूं। मुझे नहीं पता था कि यह व्यावहारिक होगा या नहीं। – mstagg

+0

यह काम करेगा। हालांकि अतिप्रवाह के साथ सावधान। आपको गुणा लागू करना है, और फिर विभाजन (मॉड्यूलो के लिए)। लेकिन गंभीरता से, जीएमपी का प्रयोग करें। –

उत्तर

4

गलत दृष्टिकोण। 67^103 mod 143 को पहले 67^103 की गणना करने की आवश्यकता नहीं है।

एक लूप में modulo की गणना करें, एक समय में एक्सपोनेंट का 1 बिट।

uint32_t powmod(uint32_t base, uint32_t expo, uint32_t mod) { 

    // % mod need only for the cases expo==0, mod<=1 
    uint32_t y = 1u % mod; 

    while (expo) { 
    if (expo & 1u) { 
     y = ((uint64_t) base * y) % mod; 
    } 
    expo >>= 1u; 
    base = ((uint64_t) base * base) % mod; 
    } 

    return y; 
} 

int main(void) { 
    printf("%lu",(unsigned long) powmod(67, 103, 143)); 
} 

आउटपुट

89 
+0

_trick_ "आरएसए उत्पन्न करने वाली बड़ी संख्याओं से निपटने" के लिए सामान्य तरीके से गणित नहीं करना है - उपरोक्त की तरह शॉर्ट-कट का उपयोग करें। – chux

+1

ओह ओह हाँ, शक्ति के प्रत्येक बिट का इलाज करके, पहले भी इस शक्ति अभ्यास को किया: क्यू सावधानीपूर्वक पर्याप्त नहीं पढ़ा, +1। –

+0

@ वेदर वेन हां - [आरएसए] का पूरा बिंदु (https: //en.wikipedia।संगठन/विकी/आरएसए_ (क्रिप्टोसिस्टम)) कम्प्यूटेशनल ट्रिक्स का उपयोग करना है, अगर किसी के पास कुंजी है, तो गणितीय ब्लैक बॉक्स समस्या को हल करने के लिए जो अन्यथा ब्रूट फोर्स द्वारा गणना करने के लिए अक्षम है। – chux