एक आईडी को बाधित करना


85

मैं एक पूर्णांक आईडी को किसी अन्य पूर्णांक में एन्क्रिप्ट / बाधित करने का तरीका ढूंढ रहा हूं। अधिक सटीक रूप से, मुझे एक फ़ंक्शन की आवश्यकता है int F(int x), ताकि

  • x <-> F (x) एक-से-एक पत्राचार है (यदि x! = y, F (x)! = F (y))
  • F (x) दिया, यह पता लगाना आसान है x - तो F एक हैश फ़ंक्शन नहीं है
  • दिए गए x और F (x) F (y) का पता लगाना कठिन / असंभव है, ऐसा कुछ x ^ 0x1234काम नहीं करेगा

स्पष्टता के लिए, मैं एक मजबूत एन्क्रिप्शन समाधान की तलाश नहीं कर रहा हूं, यह केवल मोटापा है। जैसे कि यूआरएल के साथ एक वेब एप्लिकेशन की कल्पना करें example.com/profile/1, example.com/profile/2आदि प्रोफ़ाइल स्वयं गुप्त नहीं हैं, लेकिन मैं एक के बाद एक सभी प्रोफाइल देखने / प्राप्त करने के लिए आकस्मिक यात्रा को रोकना चाहूंगा, इसलिए मैं उन्हें कुछ के पीछे छिपाना चाहूंगा example.com/profile/23423, example.com/profile/80980234आदि। हालांकि डेटाबेस-संग्रहीत टोकन काम को काफी आसानी से कर सकते हैं, मुझे उत्सुकता है अगर इसके लिए कुछ सरल गणित उपलब्ध है।

एक महत्वपूर्ण आवश्यकता मैं इस बारे में स्पष्ट नहीं था कि परिणाम "यादृच्छिक" दिखना चाहिए, अर्थात् x,x+1,...,x+n, एक अनुक्रम दिया गया , F(x),F(x+1)...F(x+n)किसी भी प्रकार की प्रगति नहीं होनी चाहिए।


क्या int F (int x) एक आवश्यकता है, या क्या यह int [2] F (int x) हो सकता है?
यूजेन रीक

@ यूजेन रिएक, आदर्श रूप से, मैं चाहूँगा कि x और F (x) संख्या सीमा में हो
georg

@ toon81, हाँ फ़ंक्शन को गुप्त रखा जाएगा
georg

चूँकि आपने कहा था कि आप बिना टोकन के जाना चाहते हैं, तो क्या इसका मतलब है कि आप किसी भी प्रकार की लुकअप तालिका से बचना चाहते हैं?
डेनियल मोसमंडोर

16
यार, यह सवाल पूरी तरह से बताया गया है और ठीक वैसा ही है जैसा मैं देख रहा हूँ। अच्छी नौकरी।
स्नैक्स

जवाबों:


39

इसे 2 या 3 सरल विधियों के संयोजन के साथ देखें:

  • XOR
  • अलग-अलग बिट्स को फेरबदल करें
  • मॉड्यूलर प्रतिनिधित्व में परिवर्तित करें (D.Knuth, वॉल्यूम 2, अध्याय 4.3.2)
  • प्रत्येक उपसमुच्चय में बिट्स और XOR बिट्स के 32 (या 64) ओवरलैपिंग सबसेट और सबसेट के समता बिट्स चुनें)
  • इसे वैरिएबल-लेंथ संख्या प्रणाली और फेरबदल अंकों में दर्शाते हैं
  • विषम पूर्णांक की एक जोड़ी का चयन करें xऔर yजो एक दूसरे के गुणक व्युत्क्रम हैं (मॉडुलो 2 32 ), फिर ओब्स्क्यूलेट द्वारा xगुणा करें और yपुनर्स्थापित करने के लिए गुणा करें, सभी गुणा मोडुलो 2 32 हैं (स्रोत: "एरिक द्वारा गुणात्मक व्युत्क्रमों का व्यावहारिक उपयोग" Lippert )

चर-लंबाई की संख्या प्रणाली प्रणाली अपने आप ही आपकी "प्रगति" आवश्यकता का पालन नहीं करती है। यह हमेशा कम अंकगणितीय प्रगति करता है। लेकिन जब इसे किसी अन्य विधि के साथ जोड़ा जाता है, तो यह अच्छे परिणाम देता है।

मॉड्यूलर प्रतिनिधित्व पद्धति के लिए भी यही सच है।

इनमें से 3 विधियों के लिए C ++ कोड उदाहरण यहां दिया गया है। फेरबदल बिट्स उदाहरण कुछ अलग मास्क और दूरी का उपयोग अधिक अप्रत्याशित हो सकता है। अन्य 2 उदाहरण छोटी संख्या (सिर्फ विचार देने के लिए) के लिए अच्छे हैं। उन्हें सभी पूर्णांक मानों को ठीक से लागू करने के लिए बढ़ाया जाना चाहिए।

// *** Numberic system base: (4, 3, 5) -> (5, 3, 4)
// In real life all the bases multiplied should be near 2^32
unsigned y = x/15 + ((x/5)%3)*4 + (x%5)*12; // obfuscate
unsigned z = y/12 + ((y/4)%3)*5 + (y%4)*15; // restore

// *** Shuffle bits (method used here is described in D.Knuth's vol.4a chapter 7.1.3)
const unsigned mask1 = 0x00550055; const unsigned d1 = 7;
const unsigned mask2 = 0x0000cccc; const unsigned d2 = 14;

// Obfuscate
unsigned t = (x ^ (x >> d1)) & mask1;
unsigned u = x ^ t ^ (t << d1);
t = (u ^ (u  >> d2)) & mask2;
y = u ^ t ^ (t << d2);

// Restore
t = (y ^ (y >> d2)) & mask2;
u = y ^ t ^ (t << d2);
t = (u ^ (u >> d1)) & mask1;
z = u ^ t ^ (t << d1);

// *** Subset parity
t = (x ^ (x >> 1)) & 0x44444444;
u = (x ^ (x << 2)) & 0xcccccccc;
y = ((x & 0x88888888) >> 3) | (t >> 1) | u; // obfuscate

t = ((y & 0x11111111) << 3) | (((y & 0x11111111) << 2) ^ ((y & 0x22222222) << 1));
z = t | ((t >> 2) ^ ((y >> 2) & 0x33333333)); // restore

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

3
@ thg435 मैंने pseudocode के बजाय C ++ का उपयोग किया। अप्रमाणित उदाहरण नहीं देना चाहते थे।
एवगेनी क्लूव

1
जब मैं x = 99 के साथ संख्यात्मक प्रणाली आधार कोड की कोशिश करता हूं, तो मुझे z = 44 मिलता है।
हार्वे

@ हार्वे: प्रतिवर्ती ऑब्सफ्यूलेटर प्राप्त करने के लिए सभी ठिकानों का उत्पाद संख्या से अधिक होना चाहिए ताकि वे बाधित हो सकें। इस उदाहरण में 3 * 4 * 5 = 60 है, इसलिए किसी भी बड़ी संख्या (जैसे 99) को आवश्यक रूप से समान मूल्य पर बहाल नहीं किया जाएगा।
एवगेनी क्लूव

1
@ हाईवे: इसके अलावा सभी बेस के उत्पाद छोटे लेकिन 2 ^ 32 के करीब पाने के लिए संभव है, और फिर एक छोटी तालिका का उपयोग करके शेष मानों को बाधित करें। इस मामले में सब कुछ 32-बिट संख्या में रहता है।
एवगेनी क्लूव

8

आप चाहते हैं कि परिवर्तन प्रतिवर्ती हो, और स्पष्ट न हो। यह एक एन्क्रिप्शन की तरह लगता है जो किसी दिए गए रेंज में एक नंबर लेता है और एक ही रेंज में एक अलग नंबर का उत्पादन करता है। यदि आपकी सीमा 64 बिट संख्या है, तो DES का उपयोग करें। यदि आपकी सीमा 128 बिट संख्या है तो एईएस का उपयोग करें। यदि आप एक अलग श्रेणी चाहते हैं, तो आपका सबसे अच्छा दांव संभवत: हॉस्ट पुडिंग साइफर है , जिसे विभिन्न ब्लॉक आकारों के साथ और संख्या सीमाओं के साथ सामना करने के लिए डिज़ाइन किया गया है जो किसी ब्लॉक में बड़े पैमाने पर फिट नहीं होते हैं, जैसे कि 100,000 से 999,999।


दिलचस्प सामान, लेकिन किसी को एक सिफर लागू करने के लिए पूछना थोड़ा मुश्किल हो सकता है कि 1) का अच्छी तरह से परीक्षण नहीं किया गया है और 2) का अच्छी तरह से परीक्षण नहीं किया गया है, क्योंकि इसे समझना इतना कठिन है :)
Maarten Bodewes

धन्यवाद! मैं इसे यथासंभव सरल रखने की कोशिश कर रहा हूं।
जॉर्ज डे

यदि आप हॉस्ट पुडिंग (आपको केवल अनुमत आकारों में से किसी एक की आवश्यकता है) का कार्यान्वयन नहीं मिल रहा है, तो आप आसानी से एक समान ब्लॉक आकार में एक साधारण 4-दौर Feistel सिफर ( en.wikipedia.org/wiki/Feistel_cipher ) को लागू कर सकते हैं । जब तक हैस्ट पुडिंग के साथ आउटपुट सही रेंज में है, तब तक एन्क्रिप्ट करते रहें। सुरक्षित नहीं है, लेकिन पर्याप्त करने के लिए पर्याप्त है।
रॉसकम

एनएसए ने अब स्पेक सिफर जारी किया है जिसमें ऐसे संस्करण शामिल हैं जिनमें 32-बिट और 48-बिट ब्लॉक आकार शामिल हैं। यह उन आकारों के साथ संख्याओं को बाधित करने के लिए भी उपयोगी हो सकता है। विशेष रूप से 32-बिट संस्करण उपयोगी होने की संभावना है।
रोज़म

5

सुरक्षा के संदर्भ में वास्तव में पर्याप्त नहीं है।

हालाँकि, अगर आप कैजुअल ऑन्सर करने की कोशिश कर रहे हैं, तो मैं दो तरीकों के संयोजन की सलाह दूंगा:

  • एक निजी कुंजी जिसे आप आईडी के साथ xor'ing द्वारा एक साथ जोड़ते हैं
  • कुंजी को लागू करने से पहले और बाद में एक निश्चित राशि से बिट्स को घुमाते हुए

यहाँ एक उदाहरण है (छद्म कोड का उपयोग करके):

  def F(x)
    x = x XOR 31415927       # XOR x with a secret key
    x = rotl(x, 5)           # rotate the bits left 5 times
    x = x XOR 31415927       # XOR x with a secret key again
    x = rotr(x, 5)           # rotate the bits right 5 times
    x = x XOR 31415927       # XOR x with a secret key again
    return x                 # return the value
  end

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


एक निरंतर मॉड 2 ^ 32 का जोड़ भी है (क्योंकि आपके बिट रोटेशन ने मुझे रोट 13, हर किसी का पसंदीदा तुच्छ प्रतिवर्ती फ़ंक्शन) याद दिलाया।
ccoakley

यह वास्तव में सिर्फ return x XOR rotr(31415927, 5)हालांकि, सही है? अंतिम एक्सोर पहले को पूर्ववत करता है, और प्रत्येक को घुमाता है .. बेशक प्रतिवर्ती संचालन की कोई भी श्रृंखला प्रतिवर्ती भी है, इसलिए यह उस स्थिति को संतुष्ट करता है।
हेरोल्ड

मैंने कुछ संक्षिप्त परीक्षण चलाए हैं और उम्मीद के मुताबिक परिणाम संतुष्ट हैं। के रूप में ccoakley का उल्लेख है, सड़ने के स्थान पर रोट 13 का उपयोग किया जा सकता है, कोई भी रोटेशन काम करेगा (कैविएट: 0> रोट> पूर्णांक-आकार) और एक अन्य कुंजी माना जा सकता है। अन्य चीजें हैं जो आप यहां फेंक सकते हैं, जैसे मापांक, जैसा कि वह सुझाव देता है, और जब तक वे हेरोल्ड के रूप में उल्लिखित हैं, तब तक वे प्रतिवर्ती हैं।
IANNNN

1
क्षमा करें, लेकिन @harold ज्यादातर सही है - आपका पूरा फ़ंक्शन x = x XOR F(0), या x = x XOR 3087989491, के बराबर है x = x XOR rotr(31415927, 5)। आपका पहला और अंतिम xors एक दूसरे को नकारते हैं, इसलिए आप जो कुछ भी कर रहे हैं, वह बिटशिफ्ट किए गए इनपुट को कुंजी से जोड़ रहा है - या समकक्ष से, बिटशिफ्ट किए गए कुंजी के साथ इनपुट को xoring कर रहा है। ध्यान दें कि यह सच है, भले ही आपने प्रत्येक चरण के लिए अलग-अलग कुंजियों का उपयोग किया हो - सभी कुंजियों को एक ही कुंजी में संयोजित किया जा सकता है, जिसे प्लेटेक्स्ट के साथ xored किया जा सकता है।
निक जॉनसन

2
यह और भी बुरा है, यह साबित करना बहुत आसान है कि एक निरंतर ऑफसेट और एक निरंतर के साथ xors द्वारा घूमने की किसी भी श्रृंखला को केवल एक घुमाव और सिर्फ एक xor के लिए संघनित किया जा सकता है। प्रत्येक अभिघात के बाद दो घुमावों को जोड़ा जा सकता है (अपनी ऑफसेट जोड़ सकते हैं), प्रत्येक अभिघात के बाद दो xors को जोड़ा जा सकता है (दो स्थिरांक के xor के साथ xor), और एक ही घुमाव को लागू करने के लिए एक xor / rot युग्म को रोट / xor में स्वैप किया जा सकता है। Xor में स्थिर।
हेरोल्ड


3

मैंने इस धागे में कुछ विचारों का उपयोग करते हुए कुछ JS कोड लिखा है:

const BITS = 32n;
const MAX = 4294967295n;
const COPRIME = 65521n;
const INVERSE = 2166657316n;
const ROT = 6n;
const XOR1 = 10296065n; 
const XOR2 = 2426476569n;


function rotRight(n, bits, size) {
    const mask = (1n << bits) - 1n;
    // console.log('mask',mask.toString(2).padStart(Number(size),'0'));
    const left = n & mask;
    const right = n >> bits;
    return (left << (size - bits)) | right;
}

const pipe = fns => fns.reduce((f, g) => (...args) => g(f(...args)));

function build(...fns) {
    const enc = fns.map(f => Array.isArray(f) ? f[0] : f);
    const dec = fns.map(f => Array.isArray(f) ? f[1] : f).reverse();

    return [
        pipe(enc),
        pipe(dec),
    ]
}

[exports.encode, exports.decode] = build(
    [BigInt, Number],
    [i => (i * COPRIME) % MAX, i => (i * INVERSE) % MAX],
    x => x ^ XOR1,
    [x => rotRight(x, ROT, BITS), x => rotRight(x, BITS-ROT, BITS)],
    x => x ^ XOR2,
);

यह कुछ अच्छे परिणाम देता है जैसे:

1 1352888202n 1 'mdh37u'
2 480471946n 2 '7y26iy'
3 3634587530n 3 '1o3xtoq'
4 2225300362n 4 '10svwqy'
5 1084456843n 5 'hxno97'
6 212040587n 6 '3i8rkb'
7 3366156171n 7 '1jo4eq3'
8 3030610827n 8 '1e4cia3'
9 1889750920n 9 'v93x54'
10 1017334664n 10 'gtp0g8'
11 4171450248n 11 '1wzknm0'
12 2762163080n 12 '19oiqo8'
13 1621319561n 13 'qtai6h'
14 748903305n 14 'cdvlhl'
15 3903018889n 15 '1sjr8nd'
16 3567473545n 16 '1mzzc7d'
17 2426613641n 17 '144qr2h'
18 1554197390n 18 'ppbudq'
19 413345678n 19 '6u3fke'
20 3299025806n 20 '1ik5klq'
21 2158182286n 21 'zoxc3y'
22 1285766031n 22 'l9iff3'
23 144914319n 23 '2ea0lr'
24 4104336271n 24 '1vvm64v'
25 2963476367n 25 '1d0dkzz'
26 2091060108n 26 'ykyob0'
27 950208396n 27 'fpq9ho'
28 3835888524n 28 '1rfsej0'
29 2695045004n 29 '18kk618'
30 1822628749n 30 'u559cd'
31 681777037n 31 'b9wuj1'
32 346231693n 32 '5q4y31'

के साथ परीक्षण:

  const {encode,decode} = require('./obfuscate')

  for(let i = 1; i <= 1000; ++i) {
        const j = encode(i);
        const k = decode(j);
        console.log(i, j, k, j.toString(36));
   }

XOR1और XOR20 और के बीच केवल यादृच्छिक संख्याएँ हैं MAXMAXहै 2**32-1; आपको यह निर्धारित करना चाहिए कि जो भी आपको लगता है कि आपकी उच्चतम आईडी होगी।

COPRIMEएक संख्या है जो कोप्राइम w / है MAX। मुझे लगता है कि प्राइम नंबर खुद हर दूसरे नंबर (खुद के गुणकों को छोड़कर) के साथ नकल करते हैं।

INVERSEयह पता लगाने के लिए मुश्किल है। ये ब्लॉग पोस्ट सीधे उत्तर नहीं देते हैं, लेकिन वुल्फरामअल्फा इसका पता लगा सकते हैं । मूल रूप से, बस के लिए समीकरण (COPRIME * x) % MAX = 1को हल करें x

buildसमारोह कुछ मैं यह आसान इन एनकोड / डीकोड पाइपलाइनों बनाने के लिए बनाने के लिए बनाया गया है। आप इसे उतने ऑपरेशन खिला सकते हैं जितने आप [encode, decode]जोड़े के रूप में चाहते हैं । इन कार्यों को बराबर और विपरीत होना है। XORकार्यों के लिए अपने स्वयं प्रशंसा ताकि आप एक देखते जोड़ी की जरूरत नहीं है कर रहे हैं।


यहाँ एक और मजेदार निमंत्रण है :

function mixHalves(n) {
    const mask = 2n**12n-1n;
    const right = n & mask;
    const left = n >> 12n;
    const mix = left ^ right;
    return (mix << 12n) | right;
}

(24-बिट पूर्णांक मानता है - बस किसी अन्य आकार के लिए संख्याएं बदलें)


1
शांत, साझा करने के लिए धन्यवाद! BTW "32n" क्या है? ऐसा पहले कभी नहीं देखा।
जियोर्ग

1
nBigInts के लिए एक नंबर उपसर्ग है । यह एक नया JS फीचर है जो आपको वास्तव में बड़ी संख्या में प्रोसेस करने की अनुमति देता है। मुझे इसका उपयोग करने की आवश्यकता थी क्योंकि मैं वास्तव में बड़ी संख्याओं से गुणा कर रहा हूं जो कि मध्यवर्ती मूल्यों में से एक को अस्थायी रूप से अधिक Number.MAX_SAFE_INTEGERऔर सटीक खो सकता है।
एमपीएन

2

आईडी के बिट्स के साथ कुछ भी करें जो उन्हें नष्ट नहीं करेगा। उदाहरण के लिए:

  • मान को घुमाएं
  • मूल्य के कुछ हिस्सों को बदलने के लिए लुकअप का उपयोग करें
  • कुछ मान के साथ xor
  • स्वैप बिट्स
  • स्वैप बाइट्स
  • पूरे मूल्य का आइना
  • मूल्य का एक हिस्सा दर्पण
  • ... अपनी कल्पना का प्रयोग

डिक्रिप्शन के लिए, रिवर्स ऑर्डर में वह सब करें।

एक कार्यक्रम बनाएं जो आपके लिए कुछ दिलचस्प मूल्यों को 'एन्क्रिप्ट' करेगा और उन्हें एक तालिका में रख सकता है जिसे आप जांच सकते हैं। आपके सिस्टम में आपके पास जो मान हैं, उन सभी सेटों के साथ अपने एन्क्रिप्शन / डिक्रिप्शन रूटीन को टेस्ट करें।

उपरोक्त सूची में सामान जोड़ें जब तक कि आपके नंबर आपको ठीक से दिखाई नहीं देंगे।

किसी और चीज के लिए, द बुक की एक प्रति प्राप्त करें


आप जो वर्णन करते हैं वह ब्लॉक सिफर के बिल्डिंग ब्लॉक्स हैं। यह एक मौजूदा का उपयोग करने के लिए अपने स्वयं के आविष्कार की तुलना में अधिक समझ में आता है।
निक जॉनसन

@NickJohnson मुझे पता है कि, क्या आपने मेरी पोस्ट की अंतिम पंक्ति के लिंक पर क्लिक किया है?
डैनियल मूसमेडर

मैं एक साथ एक रोटल / एक्सआर संयोजन देने में विफल रहा, जिससे परिणाम "बेतरतीब" दिखे (अपडेट देखें)। कोई संकेत?
जॉर्ज डे

@ DanielMošmondor मुझे पता है कि आप क्या लिंक कर रहे हैं - लेकिन यह इस तथ्य को नहीं बदलता है कि आप शुरू में सुझाव दे रहे हैं कि वह खुद कुछ का निर्माण करे, जब यह सिर्फ एक मौजूदा का उपयोग करने के लिए बहुत अधिक समझ में आता है?
निक जॉनसन

@NickJohnson जाहिर है कि ओपी मौजूदा क्रिप्टो का उपयोग नहीं करना चाहता, क्योंकि वह या तो नया एपीआई सीखना चाहता है या नहीं। मैं पूरी तरह से उससे संबंधित हो सकता हूं।
डैनियल मोसमंडोर

2

मैंने ब्लॉक सिफर्स के साथ सुरक्षित क्रमपरिवर्तन पर एक लेख लिखा था , जिसे आपकी आवश्यकताओं को पूरा करने के लिए कहा जाना चाहिए।

मैं सुझाव देता हूं, हालांकि, यदि आप पहचानकर्ताओं को अनुमान लगाना कठिन चाहते हैं, तो आपको उन्हें पहली जगह में उपयोग करना चाहिए: यूयूआईडी उत्पन्न करें, और पहली बार में अपने रिकॉर्ड के लिए प्राथमिक कुंजी के रूप में उन का उपयोग करें - सक्षम होने की कोई आवश्यकता नहीं है 'वास्तविक' ID से और में परिवर्तित करने के लिए।


2
@ thg435 यदि आप इस दृष्टिकोण में रुचि रखते हैं, तो एक उपयोगी खोज शब्द "प्रारूप-संरक्षण एन्क्रिप्शन" है। विकिपीडिया पेज निक के लेख में वर्णित ब्लैक / रोगवे पेपर को कवर करता है, साथ ही साथ हाल के घटनाक्रमों को भी। मैंने सफलतापूर्वक FPE का उपयोग कुछ ऐसे ही चीज़ों के लिए किया है जो आप कर रहे हैं; हालाँकि मेरे मामले में मैंने आईडी के अलावा कुछ बिट्स जोड़े थे जिनका उपयोग मैंने कुछ हल्की वैधता जाँच के लिए किया था।
पॉल डू बोइस

1

यह निश्चित नहीं है कि "कठिन" आपको इसकी कितनी आवश्यकता है, कितनी तेजी से, या कितनी छोटी मेमोरी का उपयोग करना है। यदि आपके पास कोई मेमोरी बाधा नहीं है, तो आप सभी पूर्णांकों की सूची बना सकते हैं, उन्हें फेरबदल कर सकते हैं और उस सूची को मैपिंग के रूप में उपयोग कर सकते हैं। हालाँकि, यहां तक ​​कि 4 बाइट पूर्णांक के लिए आपको बहुत अधिक मेमोरी की आवश्यकता होगी।

हालाँकि, इसे इतना छोटा किया जा सकता है कि सभी पूर्णांकों को मैप करने के बजाय आप केवल 2 (या सबसे खराब स्थिति 1) बाइट का नक्शा बनाएंगे और पूर्णांक में प्रत्येक समूह पर लागू करेंगे। तो, 2 बाइट्स का उपयोग करके एक पूर्णांक होगा (group1) (group2) आप प्रत्येक समूह को यादृच्छिक मानचित्र के माध्यम से मैप करेंगे। लेकिन इसका मतलब है कि यदि आप केवल समूह 2 को बदलते हैं तो समूह 1 के लिए मानचित्रण समान रहेगा। यह प्रत्येक समूह के लिए अलग-अलग बिट्स को मैप करके "फिक्स्ड" हो सकता है।

तो, * (समूह 2) हो सकता है (बिट 14,12,10,8,6,4,2,0) हां, 1 जोड़ने दोनों बदल जाएगा GROUP1 और समूह 2

फिर भी, यह केवल अस्पष्टता से सुरक्षा है, कोई भी जो आपके फ़ंक्शन में नंबर फीड कर सकता है (भले ही आप फ़ंक्शन को गुप्त रखते हैं) काफी आसानी से इसका पता लगा सकते हैं।


सिस्टम की बाधाओं के आधार पर यह संभवत: काम नहीं करेगा, क्योंकि यदि आप F (x) को वापस x पर उल्टा कर सकते हैं, तो आपके पास क्रमपरिवर्तन उपलब्ध होना होगा, जिससे आप तब आसानी से F (y) दिए गए गणना कर सकते हैं मनमाना y।
templatetypedef

@templatetypedef जैसा कि मैंने कहा, यह केवल अस्पष्टता से सुरक्षा है। क्रमचय को जाना होगा, लेकिन आप क्रमचय को "कुंजी" के रूप में देख सकते हैं। यहां सबसे बड़ी समस्या यह है कि ओपी एक सेट (एक छोटा) में सभी संदेशों को एन्क्रिप्ट करने में सक्षम होना चाहता है जहां एन्क्रिप्टेड संदेश एक ही सेट में फिट होना चाहिए और यह सेट में सभी संदेशों के लिए मान्य होना चाहिए।
रोजर लिंडजो

धन्यवाद। मैं किसी भी लुकअप टेबल से बचने की कोशिश कर रहा हूं।
जॉर्ज डे

1

अपने आवेदन में उपयोग के लिए एक निजी सममित कुंजी बनाएं, और इसके साथ अपने पूर्णांक को एन्क्रिप्ट करें। यह सभी तीन आवश्यकताओं को पूरा करेगा, जिसमें सबसे कठिन # 3 शामिल है: किसी को आपकी योजना को तोड़ने के लिए आपकी कुंजी का अनुमान लगाने की आवश्यकता होगी।


thg435 ने पूर्णांक से पूर्णांक के लिए कहा (और जहां तक ​​मैं समझता हूं कि इसे सभी पूर्णांक के लिए काम करना चाहिए)। क्या आप एक निजी कुंजी एल्गोरिथ्म का सुझाव दे सकते हैं जिसमें ये गुण होंगे?
रोजर लिंडजो

1

यहाँ आप जो वर्णन कर रहे हैं, वह एक तरफ़ा कार्य के विपरीत प्रतीत होता है: इसे लागू करना आसान है लेकिन इसे लागू करना कठिन है। एक विकल्प एक मानक, ऑफ-द-शेल्फ सार्वजनिक-कुंजी एन्क्रिप्शन एल्गोरिथ्म का उपयोग करना होगा जहां आप गुप्त (गुप्त, बेतरतीब ढंग से चुनी हुई) सार्वजनिक कुंजी को ठीक करते हैं जिसे आप एक गुप्त और एक निजी कुंजी रखते हैं जिसे आप दुनिया के साथ साझा करते हैं। इस प्रकार, आपका फ़ंक्शन F (x) सार्वजनिक कुंजी का उपयोग करके x का एन्क्रिप्शन होगा। फिर आप निजी डिक्रिप्शन कुंजी का उपयोग करके आसानी से F (x) को वापस x पर डिक्रिप्ट कर सकते हैं। ध्यान दें कि सार्वजनिक और निजी कुंजी की भूमिकाएँ यहाँ उलट हैं - आप सभी को निजी कुंजी देते हैं ताकि वे फ़ंक्शन को डिक्रिप्ट कर सकें, लेकिन सार्वजनिक कुंजी को अपने सर्वर पर गुप्त रखें। उस तरफ:

  1. फ़ंक्शन एक जीव है, इसलिए यह उलटा है।
  2. एफ (एक्स) को देखते हुए, एक्स कुशलतापूर्वक गणना योग्य है।
  3. एक्स और एफ (एक्स) को देखते हुए, वाई से एफ (वाई) की गणना करना बेहद मुश्किल है, क्योंकि सार्वजनिक कुंजी के बिना (आप क्रिप्टोग्राफिक रूप से मजबूत एन्क्रिप्शन योजना का उपयोग करते हैं) डेटा को एन्क्रिप्ट करने का कोई व्यावहारिक तरीका नहीं है, भले ही निजी हो डिक्रिप्शन कुंजी ज्ञात है।

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

एक विवरण- आपको निश्चित रूप से यहां मानक इंट प्रकार का उपयोग नहीं करना चाहिए। 64-बिट पूर्णांक के साथ भी, बहुत कम संयोजन संभव हैं कि एक हमलावर केवल कुछ y के लिए एन्क्रिप्शन F (y) को खोजने के लिए जब तक कि उनके पास चाबी न हो, तब तक सब कुछ निकालने की कोशिश कर सकते हैं। मैं एक 512-बिट मान की तरह कुछ का उपयोग करने का सुझाव दूंगा, क्योंकि यहां तक ​​कि एक साइंस फिक्शन हमला भी इस पर जोर नहीं दे पाएगा।

उम्मीद है की यह मदद करेगा!


लेकिन thg435 एन्क्रिप्शन के लिए पूछ रहा है जो संदेशों के एक छोटे सेट (4 बाइट संदेश) को संदेशों के एक ही सेट में एन्क्रिप्ट कर सकता है, और एन्क्रिप्शन को सभी संदेशों के लिए काम करना चाहिए।
रोजर लिंडजो

आपके उत्तर के लिए धन्यवाद। एक पूर्ण विकसित एन्क्रिप्शन फ्रेमवर्क का उपयोग करना शायद ऐसा करने का सबसे अच्छा तरीका है, लेकिन मेरी जरूरतों के लिए थोड़ा "भारी"।
जॉर्ज

1

अगर xorसब कुछ के लिए स्वीकार्य है, लेकिन F(y)दिया गया है xऔर F(x)फिर मुझे लगता है कि आप एक नमक के साथ ऐसा कर सकते हैं । पहले एक गुप्त एक-तरफ़ा फ़ंक्शन चुनें। उदाहरण के लिए S(s) = MD5(secret ^ s)। फिर F(x) = (s, S(s) ^ x)कहां sबेतरतीब ढंग से चुना जाता है। मैंने लिखा है कि टपल के रूप में, लेकिन आप दो हिस्सों को एक पूर्णांक में जोड़ सकते हैं, जैसे F(x) = 10000 * s + S(s) ^ x। डिक्रिप्शन नमक sफिर से निकालता है और उपयोग करता है F'(F(x)) = S(extract s) ^ (extract S(s)^x)। दिया गया है xऔर F(x)आप देख सकते हैं s(हालांकि यह थोड़ा अस्पष्ट है) और आप पता लगा सकते हैं, S(s)लेकिन कुछ अन्य उपयोगकर्ता yके लिए एक अलग यादृच्छिक नमक tके साथ उपयोगकर्ता जो जान F(x)नहीं सकता है S(t)


धन्यवाद, लेकिन यह मेरे लिए पर्याप्त यादृच्छिक नहीं लगता (अपडेट देखें)
georg

नमक को बेतरतीब ढंग से चुना जाता है और हैश S(s)भी बेतरतीब दिखाई F(x)देगा जिससे किसी भी तरह की प्रगति नहीं होगी।
बेन जैक्सन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.