একটি আইডি অবলম্বন করা হচ্ছে


85

আমি কোনও পূর্ণসংখ্যার আইডিটিকে অন্য একটি পূর্ণসংখ্যার সাথে এনক্রিপ্ট / অবলম্বন করার উপায় খুঁজছি। আরও স্পষ্টভাবে, আমার একটি ফাংশন প্রয়োজন int F(int x), যাতে

  • x <-> এফ (এক্স) হ'ল একের সাথে চিঠিপত্র (যদি x! = y, F (x)! = F (y))
  • প্রদত্ত এফ (এক্স), এক্স খুঁজে পাওয়া সহজ - সুতরাং এফ হ্যাশ ফাংশন নয়
  • প্রদত্ত এক্স এবং এফ (এক্স) এফ (ওয়াই) খুঁজে পাওয়া শক্ত / অসম্ভব, এর মতো কিছু x ^ 0x1234কাজ করবে না

স্পষ্টতার জন্য, আমি একটি শক্তিশালী এনক্রিপশন সমাধান খুঁজছি না, এটি কেবল অবলম্বন। মত URL গুলি সহ একটি ওয়েব অ্যাপ্লিকেশন কল্পনা example.com/profile/1, example.com/profile/2ইত্যাদি প্রোফাইলের নিজেদের গোপন না, কিন্তু আমি / দৃশ্যে নৈমিত্তিক voyeurs প্রতিরোধ সব প্রোফাইলের আনা একের পর এক, তাই আমি তাদের মত কিছু পিছনে বরং আড়াল চাই চাই example.com/profile/23423, example.com/profile/80980234ইত্যাদি যদিও ডাটাবেস-সঞ্চিত টোকেনগুলি কাজটি খুব সহজেই করতে পারে, আমি যদি কৌতূহল করি তবে এর জন্য যদি কিছু সাধারণ গণিত উপলব্ধ থাকে।

একটা গুরুত্বপূর্ণ প্রয়োজন আমি পরিষ্কার করা হয় নি যে ফলাফল, "এলোমেলো" হওয়া উচিত যেমন, একটি ক্রম দেওয়া হয় x,x+1,...,x+n, F(x),F(x+1)...F(x+n)কোনো ধরনের একটি অগ্রগতি গঠন করা উচিত নয়।


ইন্ট এফ (ইনট এক্স) একটি প্রয়োজনীয়তা, বা এটি ইনট [2] এফ (ইনট এক্স) হতে পারে?
ইউজেন রিয়েক

@ ইউজেন রিইক, আদর্শভাবে, আমি x এবং F (x) নম্বর সীমাতে থাকতে চাই
জর্জি

@ toon81, হ্যাঁ ফাংশন রাখা হবে গোপন
গেয়র্গ

যেহেতু আপনি বলেছিলেন যে আপনি একটি টোকেন ছাড়াই যেতে চান, তার অর্থ কি আপনি কোনও ধরণের লুকিং টেবিল এড়াতে চান?
ড্যানিয়েল মোমন্ডর 21

16
ম্যান, এই প্রশ্নটি পুরোপুরি বর্ণিত এবং ঠিক আমি যা খুঁজছি। চমৎকার কাজ.
স্নেকস

উত্তর:


39

এটি 2 বা 3 সাধারণ পদ্ধতির কিছু সংমিশ্রণে আটকে দিন:

  • এক্সওআর
  • স্বতন্ত্র বিট পরিবর্তন করুন
  • মডুলার উপস্থাপনে রূপান্তর করুন (ডি.কুনথ, খণ্ড ২, অধ্যায় ৪.৩.২)
  • প্রতিটি উপসেটে বিট এবং এক্সওর বিটগুলির ওভারল্যাপিং সাবসেটগুলি 32 (বা )৪) চয়ন করুন (উপগ্রহের প্যারিটি বিট)
  • এটিকে ভেরিয়েবল-দৈর্ঘ্যের সংখ্যা সংক্রান্ত সিস্টেম এবং শফল ডিজিটগুলিতে উপস্থাপন করুন
  • বিজোড় পূর্ণসংখ্যার একজোড়া চয়ন করুন xএবং yএটি একে অপরের গুণক বিপরীত হয় (মডুলো 2 32 ), তারপরে পুনরুদ্ধার xকরে অণুবৃদ্ধি দ্বারা গুণ করুন এবং yসমস্ত গুণগুলি মডুলো 2 32 হয় (উত্স: এরিক দ্বারা "গুণিত বিপরীতগুলির ব্যবহারিক ব্যবহার" লিপার্ট )

পরিবর্তনশীল দৈর্ঘ্যের সংখ্যা সংক্রান্ত সিস্টেম পদ্ধতিটি আপনার নিজের "অগ্রগতি" প্রয়োজনীয়তাটি নিজের মতো করে না। এটি সর্বদা সংক্ষিপ্ত গাণিতিক অগ্রগতি তৈরি করে। তবে অন্য কোনও পদ্ধতির সাথে মিলিত হলে এটি ভাল ফলাফল দেয়।

মডুলার প্রতিনিধিত্ব পদ্ধতির ক্ষেত্রেও এটি একই।

এই পদ্ধতির 3 টির জন্য এখানে সি ++ কোড উদাহরণ রয়েছে। শাফল বিট উদাহরণ আরও অনাকাঙ্ক্ষিত হতে কিছু ভিন্ন মুখোশ এবং দূরত্ব ব্যবহার করতে পারে। অন্যান্য 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

আপনার উত্তর করার জন্য আপনাকে ধন্যবাদ। আপনি যদি কিছু সিডো-কোড উদাহরণ সরবরাহ করতে পারেন, তবে দুর্দান্ত।
জর্জি

4
@ thg435 আমি সিউডোকোডের পরিবর্তে সি ++ ব্যবহার করেছি। অনির্দিষ্ট উদাহরণ দিতে চাননি।
এভজেনি ক্লুয়েভ

4
আমি যখন x = 99 দিয়ে উপরের সংখ্যার সিস্টেমের বেস কোডটি চেষ্টা করি তখন আমি z = 44 পেয়ে যাই।
হার্ভে

@ হার্ভে: বিপরীতমুখী ওফসকেটর পেতে সমস্ত ঘাঁটির পণ্যটি সংখ্যার চেয়ে বড় হওয়া উচিত। এই উদাহরণে 3 * 4 * 5 = 60, সুতরাং কোনও বৃহত্তর সংখ্যা (99 এর মতো) অগত্যা একই মানটিতে পুনরুদ্ধার করা হবে না।
ইভজেনি ক্লুয়েভ

4
@ হার্ভে: এছাড়াও সমস্ত ঘাঁটির উত্পাদন ছোট হওয়া সম্ভব তবে খুব কাছাকাছি ২ ^ ৩২, এবং একটি ছোট টেবিল ব্যবহার করে বাকী মানগুলি অবলম্বন করা সম্ভব। এই ক্ষেত্রে সবকিছু 32-বিট সংখ্যায় থেকে যায়।
ইভজেনি ক্লুয়েভ

8

আপনি চান রূপান্তরটি পুনর্বারযোগ্য, এবং সুস্পষ্ট নয়। এটি কোনও এনক্রিপশনের মতো শোনাচ্ছে যা প্রদত্ত পরিসরে একটি সংখ্যা নেয় এবং একই পরিসরে একটি পৃথক সংখ্যা উত্পাদন করে। আপনার পরিসীমা যদি 64 বিট সংখ্যা হয় তবে DES ব্যবহার করুন। আপনার পরিসীমা যদি 128 বিট সংখ্যা হয় তবে এএস ব্যবহার করুন। যদি আপনি কোনও ভিন্ন পরিসর চান, তবে আপনার সেরা বেটটি সম্ভবত হ্যাস্টি পুডিং সিফার , যা বিভিন্ন ব্লকের আকার এবং 100,000 থেকে 999,999 এর মতো কোনও ব্লকের সাথে খুব ভালভাবে ফিট না করে এমন সংখ্যার রেঞ্জগুলির সাথে মানিয়ে নিতে ডিজাইন করা হয়েছে।


আকর্ষণীয় স্টাফ, তবে কাউকে সাইফার বাস্তবায়নের জন্য জিজ্ঞাসা করা কিছুটা কঠিন হতে পারে যে 1) ভাল পরীক্ষা করা হয়নি এবং 2) ভাল পরীক্ষা করা হয়নি কারণ এটি বোঝা খুব কঠিন) :)
মার্টেন বোদেউয়েস

ধন্যবাদ! আমি যদিও এটি যথাসম্ভব সহজ রাখার চেষ্টা করছি।
জর্জি

যদি আপনি হ্যাস্টি পুডিংয়ের কোনও বাস্তবায়ন খুঁজে না পান (আপনার কেবল অনুমোদিত আকারের একটি প্রয়োজন) তবে আপনি সহজেই একটি এমনকি ব্লক আকারে একটি সাধারণ 4-রাউন্ড ফিস্টেল সিফার ( en.wikedia.org/wiki/Feistel_cipher ) প্রয়োগ করতে পারেন । হেস্টি পুডিংয়ের মতো আউটপুট সঠিক পরিসরে না আসা পর্যন্ত কেবল এনক্রিপ্ট করা চালিয়ে যান। সুরক্ষিত নয়, তবে বিভ্রান্ত করার পক্ষে যথেষ্ট।
rossum

এনএসএ এখন স্পেক সাইফার প্রকাশ করেছে যার মধ্যে সংস্করণ রয়েছে যার মধ্যে 32-বিট এবং 48-বিট ব্লক আকার রয়েছে। এটি সেই আকারগুলির সাথে সংখ্যার অবসন্নকরণের জন্যও কার্যকর হতে পারে। বিশেষত 32-বিট সংস্করণটি সম্ভবত কার্যকর হবে।
রোসুম

5

সুরক্ষার দিক থেকে বাধা বিপত্তি আসলেই যথেষ্ট নয়।

তবে, আপনি যদি নৈমিত্তিক দর্শকদের ব্যর্থ করার চেষ্টা করছেন, আমি দুটি পদ্ধতির সংমিশ্রণের পরামর্শ দেব:

  • একটি ব্যক্তিগত কী যা আপনি আইডিটির সাথে একসাথে যুক্ত করে একত্রিত করেন
  • কী প্রয়োগ করার আগে এবং পরে উভয়ই নির্দিষ্ট পরিমাণে বিটগুলি ঘোরানো

এখানে একটি উদাহরণ (সিউডো কোড ব্যবহার করে):

  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 of 32 সংযোজন রয়েছে (কারণ আপনার বিট রোটেশনটি আমার কাছে রট 13 এর স্মরণ করিয়ে দিয়েছে, সবার প্রিয় তুচ্ছভাবে বিপরীতমুখী ফাংশন)।
ccoakley

এটা সত্যিই ঠিক return x XOR rotr(31415927, 5)যদিও, তাই না? শেষ জোওরটি প্রথমটিকে পূর্বাবস্থায় ফিরে আসে এবং ঘোরাফেরা প্রত্যেকে পূর্বাবস্থায় ফেরায় .. অবশ্যই বিপরীতমুখী ক্রিয়াকলাপগুলির যে কোনও শৃঙ্খলাও বিপর্যয়কর, তাই এটি শর্তটি পূরণ করে না।
21

আমি কয়েকটি সংক্ষিপ্ত পরীক্ষা চালিয়েছি এবং ফলস্বরূপ প্রত্যাশার সাথে সন্তুষ্ট। Ccoakley উল্লেখ করেছে যে, পচা 13 এর পরিবর্তে rot5 ব্যবহার করা যেতে পারে, যে কোনও ঘূর্ণন কাজ করবে (ক্যাভিয়েট: 0> পচা> পূর্ণসংখ্যার আকার) এবং অন্য কী হিসাবে বিবেচিত হতে পারে। আপনি এখানে অন্যান্য জিনিস ফেলে দিতে পারেন যেমন মডেলাস তার পরামর্শ অনুসারে, এবং যতক্ষণ না তারা হরোল্ড উল্লিখিত হিসাবে বিপরীতমুখী হয়।
IAmNaN

4
দুঃখিত, তবে @harold বেশিরভাগ ক্ষেত্রেই সঠিক - আপনার সম্পূর্ণ ফাংশনটি x = x XOR F(0), বা x = x XOR 3087989491, বা এর সমান x = x XOR rotr(31415927, 5)। আপনার প্রথম এবং শেষ xors একে অপরকে অবজ্ঞা করে, সুতরাং আপনি যা করছেন তা হ'ল কী - বা সমতুল্যভাবে, বিটশিফ্ট কী দ্বারা ইনপুটটি xore করে বিটশিফ্ট ইনপুটটি xore করা হচ্ছে। আপনি প্রতিটি স্তরের জন্য বিভিন্ন কী ব্যবহার করলেও এটি সত্য - নোটটি সমস্ত কীগুলি একটি একক কীতে মিশ্রিত করা যেতে পারে যা প্লেইন টেক্সট দিয়ে জোর করা যায়।
নিক জনসন

4
এটি আরও খারাপ, এটি প্রমাণ করা বেশ সহজ যে কোনও ধ্রুবক অফসেট দ্বারা ধীরে ধীরে যে কোনও শৃঙ্খলা ঘোরানো হয় এবং ধ্রুবক সহ xors কেবল একটি ঘোরা এবং কেবল একটি জোরকে ঘনীভূত করা যায়। প্রত্যেকে একত্রিত করার পরে দুটি ঘোরানো (তাদের অফসেট যুক্ত করুন), প্রত্যেকের পরে দুটি জোড় সংযুক্ত করা যায় (দুটি ধ্রুবকের জোরের সাথে জোর), এবং একই ঘূর্ণনটি প্রয়োগ করে একটি জোর / পচা জোড়কে পচা / জোরে বদলে নেওয়া যেতে পারে জোর ধ্রুবক।
হারোড


3

আমি এই থ্রেডের কিছু ধারণাগুলি ব্যবহার করে কিছু জেএস কোড লিখেছি:

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হ'ল এমন একটি সংখ্যা যা ডাব্লু / এর কপিরাইম 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-বিট পূর্ণসংখ্যা ধরে নেওয়া - অন্য যে কোনও আকারের জন্য কেবল সংখ্যাগুলি পরিবর্তন করুন)


4
শীতল, ভাগ করে নেওয়ার জন্য ধন্যবাদ! বিটিডব্লিউ "32 এন" কী? এর আগে কখনও দেখেনি।
জর্জি 8

4
nবিগআইন্টসের জন্য একটি নম্বর পোস্টফিক্স । এটি একটি নতুন জেএস বৈশিষ্ট্য যা আপনাকে সত্যিই বড় সংখ্যক প্রক্রিয়া করতে দেয়। আমার এটি ব্যবহারের দরকার ছিল কারণ আমি সত্যিই বড় সংখ্যার সাথে গুণ করছি যার ফলে মধ্যবর্তী মানগুলির মধ্যে একটি অস্থায়ীভাবে অতিক্রম করতে Number.MAX_SAFE_INTEGERএবং নির্ভুলতা হারাতে পারে।
এমপেন

2

আইডিটির বিট দিয়ে এমন কিছু করুন যা তাদের ধ্বংস করবে না। উদাহরণ স্বরূপ:

  • মানটি ঘোরান
  • মানটির নির্দিষ্ট অংশগুলি প্রতিস্থাপনের জন্য অনুসন্ধান ব্যবহার করুন
  • কিছু মান সহ xor
  • অদলবদল বিট
  • বাইটগুলি অদলবদল করুন
  • পুরো মান আয়না
  • মান একটি অংশ আয়না
  • ... তোমার কল্পনা শক্তি ব্যবহার কর

ডিক্রিপশন-এর জন্য, সমস্ত বিপরীত ক্রমে করুন।

এমন একটি প্রোগ্রাম তৈরি করুন যা আপনার জন্য কিছু আকর্ষণীয় মান 'এনক্রিপ্ট' করবে এবং সেগুলি আপনি টেবিলে পরীক্ষা করতে পারেন এমন টেবিলে রাখবেন। আপনি আপনার সিস্টেমে যে মানগুলি রাখতে চান সেগুলির সাথে আপনার এনক্রিপশন / ডিক্রিপশন রুটিন পরীক্ষা করুন।

রুটিনগুলিতে রুটিনগুলিতে উপরের তালিকায় স্টাফ যুক্ত করুন যতক্ষণ না আপনার নম্বরগুলি আপনাকে যথাযথভাবে ম্যাংলড দেখায়।

অন্য যে কোনও কিছুর জন্য, বইটির একটি অনুলিপি পান ।


আপনি যা বর্ণনা করছেন তা হ'ল একটি ব্লক সাইবারের বিল্ডিং ব্লক। এটি নিজের আবিষ্কারের চেয়ে বিদ্যমানটি ব্যবহার করা আরও বেশি অর্থবোধ করে।
নিক জনসন

@ নিক জোনসন আমি জানি যে, আপনি কি আমার পোস্টের শেষ লাইনে লিঙ্কটিতে ক্লিক করেছেন?
ড্যানিয়েল মোমন্ডর

আমি একটি রোল / এক্সওর সংমিশ্রণ একসাথে রাখতে ব্যর্থ হয়েছি যে ফলাফলগুলি "এলোমেলো" যথেষ্ট দেখাচ্ছে (আপডেট দেখুন)। কোন পয়েন্টার?
জর্জি

@ ড্যানিয়েলমোমন্ডর আমি জানি আপনি কীসের সাথে সংযুক্ত রয়েছেন - তবে আপনি যে প্রাথমিকভাবে তিনি নিজেকে কিছু নির্মাণ করার পরামর্শ দিচ্ছেন তা পরিবর্তিত হয় না, যখন কেবল বিদ্যমানটি ব্যবহার করা আরও বেশি অর্থবোধ করে?
নিক জনসন

@ নিক জোনসন স্পষ্টতই ওপি বিদ্যমান ক্রিপ্টো ব্যবহার করতে চান না, কারণ তিনি হয় নতুন এপিআই শিখতে বা না শিখতে চান। আমি সম্পূর্ণরূপে এটি সম্পর্কিত করতে পারেন।
ড্যানিয়েল মোমন্ডর

2

আমি ব্লক সাইফারগুলির সাথে সুরক্ষিত অনুমতি সম্পর্কে একটি নিবন্ধ লিখেছি , যা আপনার প্রয়োজনীয়তা যেমন বলা হয়েছে তা পূরণ করা উচিত।

যদিও আমি পরামর্শ দিচ্ছি যে আপনি যদি শনাক্তকারীদের অনুমান করতে কঠোর চান তবে আপনার সেগুলি প্রথমে ব্যবহার করা উচিত: ইউআইডিগুলি তৈরি করুন এবং সেগুলি আপনার রেকর্ডের জন্য প্রাথমিক কী হিসাবে প্রথম স্থানে ব্যবহার করুন - সক্ষম হওয়ার দরকার নেই একটি 'আসল' আইডি থেকে এবং রূপান্তর করতে।


4
@ thg435 আপনি যদি এই পদ্ধতির প্রতি আগ্রহী হন তবে একটি দরকারী অনুসন্ধান শব্দটি হ'ল "ফর্ম্যাট-সংরক্ষণের এনক্রিপশন"। উইকিপিডিয়া পৃষ্ঠাতে নিকের নিবন্ধে উল্লিখিত ব্ল্যাক / রোগওয়ে কাগজ, পাশাপাশি আরও সাম্প্রতিক ঘটনাবলি রয়েছে। আপনি যা করছেন তার অনুরূপ কিছু জন্য আমি সাফল্যের সাথে এফপিই ব্যবহার করেছি; যদিও আমার ক্ষেত্রে আমি আইডি ছাড়াও কয়েকটি বিট যুক্ত করেছি যা আমি কিছুটা হালকা বৈধতা যাচাইয়ের জন্য ব্যবহার করেছি।
পল ডু বোয়িস

1

আপনার এটি কতটা "শক্ত" হতে হবে তা নিশ্চিত নয়, কত দ্রুত, বা কতটা স্মৃতি ব্যবহার করা উচিত। আপনার যদি মেমরির সীমাবদ্ধতা না থাকে আপনি সমস্ত পূর্ণসংখ্যার একটি তালিকা তৈরি করতে পারেন, এগুলি শাফল করুন এবং সেই তালিকাটি ম্যাপিং হিসাবে ব্যবহার করুন। যাইহোক, এমনকি একটি 4 বাইট পূর্ণসংখ্যার জন্য আপনার প্রচুর স্মৃতি দরকার।

তবে এটি আরও ছোট করা যেতে পারে তাই সমস্ত সংখ্যার মানচিত্র তৈরির পরিবর্তে আপনি কেবলমাত্র 2 (বা সবচেয়ে খারাপ ক্ষেত্রে 1) বাইট ম্যাপ করবেন এবং পূর্ণসংখ্যার প্রতিটি গ্রুপে এটি প্রয়োগ করুন। সুতরাং, 2 বাইট ব্যবহার করে একটি পূর্ণসংখ্যা হবে (গ্রুপ 1) (গ্রুপ 2) আপনি এলোমেলো মানচিত্রের মাধ্যমে প্রতিটি দলকে ম্যাপ করবেন। তবে এর অর্থ এই যে আপনি যদি কেবল গ্রুপ 2 পরিবর্তন করেন তবে গ্রুপ 1 এর ম্যাপিংটি একই থাকবে would এটি প্রতিটি গ্রুপে বিভিন্ন বিট ম্যাপিং দ্বারা "স্থির" হতে পারে।

সুতরাং, * (GROUP2) হতে পারে (বিআইটি 14,12,10,8,6,4,2,0) যাতে, 1 যোগ উভয় পরিবর্তন হবে GROUP1 এবং GROUP2

তবুও, এটি কেবল অস্পষ্টতার দ্বারা সুরক্ষা, যে কেউ আপনার ফাংশনে নম্বর ফিড করতে পারে (আপনি যদি ফাংশনটি গোপন রাখেনও) তবে এটি মোটামুটি সহজেই তা বের করতে পারে।


সিস্টেমের সীমাবদ্ধতার উপর নির্ভর করে এটি সম্ভবত কাজ করবে না, কারণ আপনি যদি F (x) কে x এ ফিরে পরিবর্তন করতে পারেন তবে আপনাকে অনুমতিটি উপলব্ধ থাকতে হবে, যা থেকে আপনি সহজেই F (y) গণনা করতে পারবেন নির্বিচারে y
টেম্পলেটটিফাইফ

@templatetypedef আমি যেমন বলেছি, এটি কেবল অস্পষ্টতার দ্বারা সুরক্ষা। ফলশ্রুতিটি জানতে হবে, তবে আপনি আদেশটি "কী" হিসাবে দেখতে পেলেন। এখানে সবচেয়ে বড় সমস্যাটি হ'ল ওপি মনে হয় যে সমস্ত বার্তাকে একটি সেটে (একটি ছোট একটি) এনক্রিপ্ট করতে সক্ষম হতে চায় যেখানে এনক্রিপ্ট করা বার্তা একই সেটে ফিট করা উচিত এবং এটি সেটের সমস্ত বার্তাগুলির জন্য বৈধ হওয়া উচিত।
রজার Lindsjö

ধন্যবাদ আমি কোনও দেখার সারণী এড়ানোর চেষ্টা করছি।
জর্জি

1

আপনার অ্যাপ্লিকেশনটিতে ব্যবহারের জন্য একটি প্রাইভেট প্রতিসম কী তৈরি করুন এবং এটির সাথে আপনার পূর্ণসংখ্যা এনক্রিপ্ট করুন। এটি শক্তিশালী # 3 সহ সমস্ত তিনটি প্রয়োজনীয়তা পূরণ করবে: আপনার স্কিমটি ভেঙে যাওয়ার জন্য আপনার চাবিটি অনুমান করতে হবে।


thg435 পূর্ণসংখ্যার পূর্ণসংখ্যার জন্য জিজ্ঞাসা করেছিল (এবং যতদূর আমি বুঝতে পারি এটি সমস্ত পূর্ণসংখ্যার জন্য কাজ করা উচিত)। আপনি কি কোনও ব্যক্তিগত কী অ্যালগরিদম প্রস্তাব করতে পারেন যাতে এই বৈশিষ্ট্যগুলি থাকবে?
রজার Lindsjö

1

আপনি এখানে যা বর্ণনা করছেন তা একদিকের ফাংশনের বিপরীত বলে মনে হচ্ছে: এটি উল্টানো সহজ তবে প্রয়োগ করা খুব সহজ। একটি বিকল্প হ'ল একটি স্ট্যান্ডার্ড, অফ-দ্য-শেল্ফ পাবলিক-কী এনক্রিপশন অ্যালগরিদম ব্যবহার করা যেখানে আপনি একটি গোপনীয় রাখেন এমন একটি সার্বজনীন কী এবং আপনি বিশ্বের সাথে ভাগ করে নেওয়া একটি ব্যক্তিগত কী fix এইভাবে, আপনার F (x) ফাংশনটি পাবলিক কী ব্যবহার করে এক্সের এনক্রিপশন হবে। তারপরে আপনি ব্যক্তিগত ডিক্রিপশন কী ব্যবহার করে সহজেই F (x) কে ডিক্রিপ্ট করতে পারবেন। লক্ষ্য করুন যে এখানে সরকারী এবং ব্যক্তিগত কীগুলির ভূমিকাগুলি বিপরীত হয়েছে - আপনি প্রত্যেককে ব্যক্তিগত কী প্রদান করেন যাতে তারা ফাংশনটি ডিক্রিপ্ট করতে পারে তবে আপনার সার্ভারে সর্বজনীন কী গোপন রাখে। ঐ দিকে:

  1. ফাংশনটি হ'ল বাইজেকশন, সুতরাং এটি অবিচ্ছিন্ন।
  2. প্রদত্ত এফ (এক্স), এক্স দক্ষতার সাথে গণনাযোগ্য।
  3. এক্স এবং এফ (এক্স) দেওয়া, y থেকে F (y) গণনা করা অত্যন্ত কঠিন, যেহেতু পাবলিক কী ব্যতীত (ধরে নিই যে আপনি একটি ক্রিপ্টোগ্রাফিকভাবে শক্তিশালী এনক্রিপশন স্কিম ব্যবহার করছেন) এমনকি ডেটা এনক্রিপ্ট করার কোনও সম্ভাব্য উপায় নেই, এমনকি ব্যক্তিগত ডিক্রিপশন কী জানা যায়।

এর অনেক সুবিধা রয়েছে। প্রথমত, আপনি আশ্বস্ত হয়ে থাকতে পারেন যে ক্রিপ্টো সিস্টেমটি নিরাপদ, আপনি যদি আরএসএ-এর মতো সু-প্রতিষ্ঠিত অ্যালগরিদম ব্যবহার করেন তবে দুর্ঘটনাজনিত নিরাপত্তাহীনতা সম্পর্কে আপনার চিন্তা করার দরকার নেই। দ্বিতীয়ত, এটি করার জন্য ইতিমধ্যে এখানে গ্রন্থাগার রয়েছে, সুতরাং আপনার খুব বেশি কোডিং করার দরকার নেই এবং পার্শ্ব-চ্যানেল আক্রমণগুলিতে অনাক্রম্য হতে পারে। অবশেষে, আপনি যে কারও পক্ষে F (x) গণনা করতে সক্ষম হবেন না করে যে কারও কাছে যাওয়া এবং এফ (এক্স) বিপরীত করা সম্ভব করে তুলতে পারবেন।

একটি বিশদ- আপনার অবশ্যই এখানে স্ট্যান্ডার্ড ইনট টাইপ ব্যবহার করা উচিত নয়। এমনকি -৪-বিট পূর্ণসংখ্যার সাথেও, খুব কম সংমিশ্রণ রয়েছে যে আক্রমণকারী কেবল কিছুটা ওয়াইয়ের জন্য এনক্রিপশন এফ (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)


ধন্যবাদ, তবে এটি আমার পক্ষে এলোমেলো মনে হচ্ছে না (আপডেটটি দেখুন)
জর্জি

লবণ এলোমেলোভাবে বেছে নেওয়া হয় এবং হ্যাশ S(s)এলোমেলো দেখায় তাই F(x)কোনও ধরণের অগ্রগতিও হবে না।
বেন জ্যাকসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.