2012-01-12 13 views
5

यहां एक समस्या है जिसके लिए मैं सबसे अच्छा समाधान बनाने की कोशिश कर रहा हूं। मेरे पास [0 ... एन] की सीमा में गैर-ऋणात्मक पूर्णांक का एक सीमित सेट है। मुझे इस सेट में प्रत्येक नंबर को एक स्ट्रिंग के रूप में प्रस्तुत करने में सक्षम होना चाहिए और इस तरह की स्ट्रिंग को पीछे की ओर मूल संख्या में परिवर्तित करने में सक्षम होना चाहिए। तो यह एक bijective समारोह होना चाहिए।बायक्टेक्टीव "इंटीजर <-> स्ट्रिंग" फ़ंक्शन

अतिरिक्त आवश्यकताएँ हैं:

एक नंबर के
  1. स्ट्रिंग प्रतिनिधित्व कम से कम कुछ हद तक मूल संख्या अंधेरा करना चाहिए। तो एफ (x) = x.toString() जैसे आदिम समाधान काम नहीं करेंगे।
  2. स्ट्रिंग लंबाई महत्वपूर्ण है: कम बेहतर।
  3. एक कश्मीर की स्ट्रिंग प्रतिनिधित्व जानता है, मैं इसे K + 1 की स्ट्रिंग प्रतिनिधित्व अनुमान लगाना (कुछ हद तक) गैर तुच्छ हो करना चाहते हैं।

पी .1 & पी.2 के लिए स्पष्ट समाधान बेस 64 (या जो भी सभी मूल्यों को फिट करने के लिए बेसXXक्स) नोटेशन का उपयोग करना है। लेकिन क्या हम न्यूनतम अतिरिक्त प्रयास के साथ पी 3 में फिट बैठ सकते हैं? सामान्य ज्ञान मुझे बताता है कि मुझे अतिरिक्त जैविक "स्ट्रिंग < -> स्ट्रिंग" बेसXXक्स मानों के लिए फ़ंक्शन की आवश्यकता है। कोई सुझाव? या शायद सभी 3 आवश्यकताओं को फिट करने के लिए बेसXXक्स की तुलना में कुछ बेहतर है?

+0

दाईं ओर 'संबंधित' सूची में कई समान qs हैं, ऐसा लगता है कि – AakashM

+0

परिभाषा के अनुसार, एक उलटा obfuscating समारोह एक "साइफर" है। 'Enc (k) 'से' enc (k + 1)' की गणना करने में सक्षम नहीं होने के कारण एक अच्छा सिफर के लिए बहुत अधिक आवश्यक है, क्योंकि यदि आप एक ज्ञात सादे टेक्स्ट/सिफर जोड़ी कर सकते हैं तो आपको आस-पास के सादे टेक्स्ट के रूप में कई सिफरटेक्स मिलेंगे आपके पास गणना करने का समय था। मुझे लगता है कि सवाल यह है कि, कैसे "बुरा" (या महंगा-से-गणना) एक सिफर आप छोटे सिफर ग्रंथ प्राप्त करने के लिए स्वीकार करने के इच्छुक हैं, भले ही आप नमक का उपयोग करने जा रहे हों या नहीं, और क्या आपको एक स्ट्रीमिंग मोड –

+0

स्ट्रीमिंग मोड महत्वपूर्ण हैं और पूरी तरह से तुच्छ नहीं हैं, क्योंकि यदि आपका साइफर इसे एक नंबर के प्रतिनिधित्व को उलटा करने के लिए अक्षम बनाता है, तो एक हमलावर जो संख्याओं की एक लंबी श्रृंखला देख सकता है और सादे टेक्स्ट डेटा के संभावित वितरण के बारे में कुछ जानता है विशिष्ट सामान्य सादे पाठ मानों के सिफ़ेर्ड मानों की पहचान करने के लिए आवृत्ति विश्लेषण, मार्कोव चेन विश्लेषण इत्यादि करने में सक्षम हो सकता है। एक स्ट्रीमिंग मोड विफल होने के उदाहरण के लिए http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 देखें। –

उत्तर

0

तो आपको एक स्ट्रिंग की आवश्यकता है जो मूल संख्या को खराब कर दे, लेकिन स्ट्र (के) को ज्ञात होने पर किसी को स्ट्र (के + 1) निर्धारित करने की अनुमति मिलती है?

केवल f(x) = (x + a).toString() करने के बारे में, जहां a गुप्त है? फिर कोई बाहरी उपयोगकर्ता xf(x) से निर्धारित नहीं कर सकता है, लेकिन वे भरोसा कर सकते हैं कि अगर उनके पास एक स्ट्रिंग "1234" है, तो अज्ञात x के लिए, "1235" मानचित्र x+1 पर हैं।

+1

वह विपरीत चाहता था - अनुमान लगा रहा था 'x + 1' होना चाहिए * nontrivial *। –

+0

आह, पूर्ण गलत पढ़ने – Chowlett

1

यदि आपको भी सुरक्षित होने की आवश्यकता नहीं है, तो आप बेसXXक्स में एन्कोडिंग के बाद बस एक सरल सममित सिफर का उपयोग कर सकते हैं। उदाहरण के लिए आप पूर्णांक [n₁, n₂, n₃ ...] का एक प्रमुख अनुक्रम चुन सकते हैं और फिर Vigenere cipher का उपयोग कर सकते हैं।

साइफर के पीछे मूल विचार सरल है - प्रत्येक वर्ण सी को सी + के (मोड 26) के रूप में एन्कोड करें जहां के कुंजी से तत्व है। जैसे ही आप साथ जाते हैं, कुंजी के मानों को समाप्त करने के बाद बस अगले चरित्र के लिए कुंजी से अगला नंबर प्राप्त करें।

आपके पास वास्तव में दो विकल्प हैं: आप पहले नंबर को बेसXXक्स में एक स्ट्रिंग में परिवर्तित कर सकते हैं और फिर एन्क्रिप्ट कर सकते हैं, या आप एक ही विचार के रूप में प्रत्येक नंबर को एन्क्रिप्ट करने के लिए एक ही विचार का उपयोग कर सकते हैं। उस स्थिति में, आप इसे mod 26 से mod N + 1 में बदलना चाहते हैं।

इसके बारे में सोचने के लिए आओ, एक आसान तरीका केवल xor कुंजी और मूल्य से तत्व होगा। (विजिनेर फॉर्मूला का उपयोग करने के विरोध में।) मुझे लगता है कि यह ओबफ्यूशन के लिए भी काम करेगा।

+0

विजिनेर सिफर मेरा पहला विचार था। बस आत्मविश्वास पाने की कोशिश कर रहा हूं कि मैंने कुछ और छोटा नहीं छोड़ा ... –

+0

हे, हमेशा अच्छा है जब किसी और के पास मेरे जैसा ही विचार है :) –

0

पी। 1 और पी। 3 थोड़ा विरोधाभासी और थोड़ा अस्पष्ट भी हैं।

मैं पूर्णांक संख्याओं के हेक्स प्रतिनिधित्व का उपयोग करने का प्रस्ताव दूंगा।

17 => 0x11 
123123 => 1E0F3 
+0

क्यों पी .1 और पी 3 विरोधाभासी हैं? और आपका समाधान निश्चित रूप से पी 3 का उल्लंघन करता है। –

1

इस विधि की आवश्यकताओं को पूरा करती है 1-3, लेकिन यह शायद थोड़ा भी computationally महंगा है:

  1. एक प्रमुख p > N+2 मिल जाए, नहीं भी बहुत बड़ा
  2. एक आदिम जड़ खोजने केg मॉड्यूल p, यानी, एक संख्या जिसका बहुविकल्पीय आदेश मॉड्यूलो pp-1
  3. के लिए है, enc(k) = min {j > 0 : g^j == (k+2) (mod p)}
  4. f(k) = enc(k).toString()
1

लंबाई M की एक तालिका का निर्माण करते हैं। इस तालिका को यादृच्छिक क्रम के साथ अलग-अलग छोटे तारों के लिए संख्या 0 से M-1 पर मानचित्र बनाना चाहिए। संख्या में अंकों का प्रतिनिधित्व करने के लिए तालिका से तारों का उपयोग करके, पूर्णांक को 0-संख्या के रूप में पूर्णांक व्यक्त करें। एक सीधा उलटा के साथ डीकोड।

M=26 के साथ, आप बस प्रत्येक अंक के लिए एक पत्र का उपयोग कर सकते हैं। या M=256 लें और प्रत्येक अंक के लिए बाइट का उपयोग करें।

यहां तक ​​कि एक अच्छा क्रिप्टोग्राफिक दृष्टिकोण भी दूरस्थ रूप से नहीं!

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