টিঙ্ক কী রোটেশন সক্ষম করতে কীসেট ব্যবহার করে। আনুষ্ঠানিকভাবে, একটি কীসেট হলো কী-এর একটি অ-খালি তালিকা ১, যেখানে একটি কী-কে প্রাইমারি হিসেবে মনোনীত করা হয় (যে কী-টি, উদাহরণস্বরূপ, নতুন প্লেইনটেক্সট সাইন এবং এনক্রিপ্ট করতে ব্যবহৃত হয়)। এছাড়াও, একটি কীসেটের কী-গুলো একটি অনন্য আইডি ২ এবং একটি কী স্ট্যাটাস পায়, যা কী-সেট থেকে কী-গুলো না সরিয়েই সেগুলোকে নিষ্ক্রিয় করার সুযোগ দেয়।
কীসেট হলো প্রধান উপায় যার মাধ্যমে ব্যবহারকারীরা কী অ্যাক্সেস করতে পারে ( KeysetHandle ক্লাসের মাধ্যমে)। এটি নিশ্চিত করে যে প্রত্যেক ব্যবহারকারীর কাছে একই সাথে একাধিক কী পরিচালনা করার জন্য কোড রয়েছে। ক্রিপ্টোগ্রাফির বেশিরভাগ ব্যবহারকারীর জন্য, একাধিক কী পরিচালনা করা একটি অপরিহার্য বিষয় : কী পরিবর্তন করা সম্ভব হতে হবে (উদাহরণস্বরূপ, পুরোনো কী ফাঁস হয়ে যেতে পারে), এবং এমন কোনো অ্যাটমিক "পরবর্তী কী-তে পরিবর্তন" প্রায় কখনোই থাকে না যা কোড চালিত মেশিনগুলোতে এবং সমস্ত সাইফারটেক্সটে বিশ্বব্যাপী এবং এক মুহূর্তে প্রয়োগ করা যায়। তাই, ব্যবহারকারীকে এমন কোড লিখতে হয় যা একটি কী থেকে পরবর্তী কী-তে পরিবর্তনের সময় কাজ করে।
উদাহরণ: AEAD
একটি AEAD কীসেটের কথা বিবেচনা করুন, যেটিতে AEAD প্রিমিটিভের জন্য একাধিক কী রয়েছে। পূর্বে যেমন ব্যাখ্যা করা হয়েছে, প্রতিটি কী স্বতন্ত্রভাবে দুটি ফাংশন নির্দিষ্ট করে: \(\mathrm{Enc}\) এবং \(\mathrm{Dec}\)কী-সেটটিতে এখন দুটি নতুন ফাংশনও নির্দিষ্ট করা হয়েছে: \(\mathrm{Enc}\) এবং \(\mathrm{Dec}\) - \(\mathrm{Enc}\) সহজভাবে ফাংশনের সমান \(\mathrm{Enc}\) কীসেটের প্রাইমারি কী-এর, যখন ফাংশনটি \(\mathrm{Dec}\) সমস্ত কী ব্যবহার করে ডিক্রিপ্ট করার চেষ্টা করে, এবং সেগুলোকে একটি নির্দিষ্ট ক্রমে চালনা করে (টিঙ্ক কীভাবে এর পারফরম্যান্স উন্নত করে, তা জানতে নিচে দেখুন)।
এটি লক্ষণীয় যে কীসেটগুলি হলো পূর্ণাঙ্গ কী : এগুলি হলো ফাংশনগুলির একটি সম্পূর্ণ বিবরণ। \(\mathrm{Enc}\) এবং\(\mathrm{Dec}\) ব্যবহৃত। এর মানে হলো, ব্যবহারকারীরা এমন একটি ক্লাস লিখতে পারেন যা ইনপুট হিসেবে একটি KeysetHandle গ্রহণ করে, যা এই ধারণা দেয় যে ক্লাসটির অবজেক্টগুলোর একটি সম্পূর্ণ বিবরণ প্রয়োজন। \(\mathrm{Enc}\) এবং \(\mathrm{Dec}\) সঠিকভাবে কাজ করার জন্য । এটি ব্যবহারকারীকে এমন এপিআই (API) লেখার সুযোগ দেয় যা এই বার্তাটি দেয় যে: এই ক্লাসটি ব্যবহার করার জন্য আপনাকে একটি ক্রিপ্টোগ্রাফিক প্রিমিটিভের বিবরণ প্রদান করতে হবে।
চাবি ঘূর্ণন
একজন টিঙ্ক ব্যবহারকারীর কথা ভাবুন, যিনি এমন একটি প্রোগ্রাম লিখছেন যা প্রথমে একটি কেএমএস (KMS) থেকে একটি কীসেট সংগ্রহ করে, তারপর সেই কীসেট ব্যবহার করে একটি এইএডি (AEAD) অবজেক্ট তৈরি করে এবং সবশেষে এই অবজেক্টটি ব্যবহার করে সাইফারটেক্সট এনক্রিপ্ট ও ডিক্রিপ্ট করে।
এই ধরনের ব্যবহারকারী স্বয়ংক্রিয়ভাবে কী রোটেশনের জন্য প্রস্তুত থাকেন; এবং যদি তাদের বর্তমান পছন্দটি আর মান পূরণ না করে, তবে অ্যালগরিদম পরিবর্তন করার জন্যও প্রস্তুত থাকেন।
তবে এই ধরনের কী রোটেশন প্রয়োগ করার সময় কিছুটা সতর্ক থাকতে হবে: প্রথমত, KMS-কে কীসেটে একটি নতুন কী যোগ করতে হবে (কিন্তু এটিকে তখনও প্রাইমারি হিসেবে সেট করা যাবে না)। তারপর, নতুন কীসেটটি সমস্ত বাইনারিতে রোল আউট করতে হবে, যাতে এই কীসেট ব্যবহারকারী প্রতিটি বাইনারিতে কীসেটের সবচেয়ে নতুন কী-টি থাকে। শুধুমাত্র তখনই নতুন কী-টিকে প্রাইমারি করা উচিত এবং ফলস্বরূপ প্রাপ্ত কীসেটটি পুনরায় সেই কীসেট ব্যবহারকারী সমস্ত বাইনারিতে বিতরণ করা উচিত।
সাইফারটেক্সটে মূল শনাক্তকারী
AEAD কীসেটের উদাহরণটি আবার বিবেচনা করুন। সরলভাবে করলে, একটি সাইফারটেক্সট ডিক্রিপ্ট করার জন্য Tink-কে কীসেটের সমস্ত কী দিয়ে ডিক্রিপ্ট করার চেষ্টা করতে হয়, কারণ কীসেটটি এনক্রিপ্ট করতে কোন কী ব্যবহার করা হয়েছিল তা জানার কোনো উপায় নেই। এর ফলে পারফরম্যান্সে একটি বড় ধরনের অতিরিক্ত চাপ সৃষ্টি হতে পারে।
এই কারণে, টিঙ্ক আইডি থেকে প্রাপ্ত একটি ৫-বাইট স্ট্রিং দিয়ে সাইফারটেক্সটের শুরুতে প্রিফিক্স যোগ করার সুযোগ দেয়। উপরে উল্লিখিত 'ফুল কী' (Full Keys) নীতি অনুসরণ করে, এই প্রিফিক্সটি কী-এর একটি অংশ , এবং এই কী দিয়ে প্রাপ্ত সমস্ত সাইফারটেক্সটে এই প্রিফিক্সটি থাকা উচিত। ব্যবহারকারীরা যখন কী তৈরি করেন, তখন তারা বেছে নিতে পারেন যে কী-টিতে এই ধরনের প্রিফিক্স ব্যবহার করা হবে, নাকি এটি ছাড়া কোনো সাইফারটেক্সট ফরম্যাট ব্যবহার করা হবে।
যখন কোনো কী একটি কীসেটের মধ্যে থাকে, তখন টিঙ্ক সেই কীসেটে থাকা আইডি থেকে এই ট্যাগটি গণনা করে। একটি কীসেটের মধ্যে আইডিগুলো অনন্য হওয়ার বিষয়টি এটাই বোঝায় যে ট্যাগগুলোও অনন্য। সুতরাং, যদি শুধুমাত্র ট্যাগযুক্ত কী ব্যবহার করা হয়, তবে একটিমাত্র কী দিয়ে ডিক্রিপ্ট করার তুলনায় পারফরম্যান্সে কোনো ঘাটতি হয় না: ডিক্রিপ্ট করার সময় টিঙ্ককে কেবল একটি কী দিয়েই চেষ্টা করতে হয়।
তবে, যেহেতু ট্যাগটি কী-এর একটি অংশ, তাই এটিও বোঝায় যে কী-টি কেবল তখনই একটি কীসেটে থাকতে পারে যদি তার একটি নির্দিষ্ট আইডি থাকে। বিভিন্ন ভাষায় কী অবজেক্টের বাস্তবায়ন বর্ণনা করার ক্ষেত্রে এর কিছু প্রভাব রয়েছে।
যেসব কী-এর জন্য আইডি প্রয়োজন কিন্তু কোনো আউটপুট প্রিফিক্স নেই
কিছু কী-এর একটি নির্দিষ্ট আইডি থাকা আবশ্যক, কিন্তু সেগুলো তাদের আউটপুটে কোনো প্রিফিক্স যোগ করে না। উদাহরণস্বরূপ, NO_PREFIX_WITH_PREHASH_ID ভ্যারিয়েন্টের সিগনেচার কী (যা WITH_ID_REQUIREMENT আউটপুট প্রিফিক্স টাইপের সাথে সংরক্ষিত থাকে) কোনো প্রিফিক্স ছাড়াই সিগনেচার তৈরি করে। যখন আপনি Prehash প্রিমিটিভের সাথে এই ধরনের কোনো কী ব্যবহার করেন, তখন Tink কী-এর আইডিটি প্রিহ্যাশ ভ্যালুতে লিখে রাখে, যাতে একজন রিমোট সাইনার জানতে পারে যে এর কোন কী দিয়ে সাইন করতে হবে।
প্রিফিক্স ব্যবহারকারী কী-গুলোর মতোই, এই ধরনের একটি কী শুধুমাত্র সেই একটি আইডির অধীনে একটি কীসেটে থাকতে পারে। প্রিহ্যাশ ভ্যালুতে থাকা কী আইডিটি আউটপুট প্রিফিক্সের মতোই একটি সাধারণ মেটাডেটা: সিগনেচার এটিকে বাইন্ড করে না এবং ভেরিফায়াররা এটি কখনও দেখতে পায় না। বাইট-লেভেল লেআউটের জন্য, টিঙ্ক ওয়্যার ফরম্যাট দেখুন।
Tink-এর কিছু অংশ এখনও কীসেটগুলোকে একটি সেট হিসেবে বিবেচনা করে। তবে, এটি পরিবর্তন করা উচিত। এর কারণ হলো, সাধারণত ক্রমটি গুরুত্বপূর্ণ: উদাহরণস্বরূপ, Aead-এর সাথে একটি কী রোটেশনের সাধারণ জীবনচক্রটি বিবেচনা করুন। প্রথমে, একটি কীসেটে একটি নতুন কী যোগ করা হয়। এই কী-টিকে তখনও প্রাইমারি করা হয় না, কিন্তু এটি সক্রিয় থাকে। এই নতুন কীসেটটি সমস্ত বাইনারিতে ছড়িয়ে দেওয়া হয়। একবার সমস্ত বাইনারি নতুন কী-টি সম্পর্কে জেনে গেলে, কী-টিকে প্রাইমারি করা হয় (শুধুমাত্র এই পর্যায়ে এই কী-টি ব্যবহার করা নিরাপদ)। এই দ্বিতীয় ধাপে, কী রোটেশনের সর্বশেষ যোগ করা কী-টি সম্পর্কে জানা প্রয়োজন। ↩
গুগলের একটি অভ্যন্তরীণ লাইব্রেরির সাথে সামঞ্জস্যের জন্য, টিঙ্ক এমন কীসেট ব্যবহারের সুযোগ দেয় যেখানে আইডিগুলোর পুনরাবৃত্তি ঘটে। ভবিষ্যতে এই সুবিধাটি তুলে দেওয়া হবে। ↩