আদিম এবং ইন্টারফেস

আমরা পরবর্তীতে সংজ্ঞায়িত করি (অনানুষ্ঠানিকভাবে, কিন্তু তারপরে আরও আনুষ্ঠানিকভাবে), টিঙ্কে ব্যবহৃত ভাষার দুটি গুরুত্বপূর্ণ অংশ, আদিম এবং ইন্টারফেস

আদিম

একটি আদিম হল একটি গাণিতিক বস্তু যা সমস্ত অ্যালগরিদমের সাথে সামঞ্জস্যপূর্ণ কিছু কাজ নিরাপদে সম্পাদন করে। উদাহরণস্বরূপ, AEAD আদিম সমস্ত এনক্রিপশন অ্যালগরিদম নিয়ে গঠিত যা Tink-এর একটি Aead-এর জন্য প্রয়োজনীয় নিরাপত্তা বৈশিষ্ট্যগুলিকে সন্তুষ্ট করে।

আমরা জোর দিই যে আদিম একটি প্রোগ্রামিং ভাষা বা তাদের অ্যাক্সেস করার একটি নির্দিষ্ট উপায়ে আবদ্ধ নয়। পরিবর্তে, একজনকে আদিমকে সম্পূর্ণরূপে গাণিতিক বস্তু হিসাবে ভাবা উচিত। উদাহরণস্বরূপ, যদি আমরা AEAD বিবেচনা করি, মৌলিকভাবে এটি ফাংশনগুলির জোড়া নিয়ে গঠিত, একটি যা এনক্রিপশন সম্পাদন করে এবং একটি যা ডিক্রিপশন সম্পাদন করে।

ইন্টারফেস

একটি ইন্টারফেস হল একটি উপায় যেখানে আমরা ব্যবহারকারীদের একটি আদিম অ্যাক্সেস প্রদান করি। উদাহরণস্বরূপ, আমরা আশা করি যে ভবিষ্যতে Tink একটি Mac ইন্টারফেস প্রদান করবে, তবে একটি StreamingMac ইন্টারফেসও প্রদান করবে, যা মেমরিতে সরাসরি লোড না হওয়া ডেটার ম্যাক গণনা করতে দেয়।

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

আনুষ্ঠানিক সংজ্ঞা

বেশিরভাগ পাঠকের জন্য, উপরের স্বজ্ঞাত ব্যাখ্যাগুলি সম্ভবত যথেষ্ট। তবুও, আমরা মনে করি যে এই ধারণাগুলির আনুষ্ঠানিক সংজ্ঞা প্রদান করা কখনও কখনও গুরুত্বপূর্ণ হতে পারে।

ক্রিপ্টোগ্রাফিক ফাংশন

একটি ক্রিপ্টোগ্রাফিক ফাংশনের ধারণাটি একটি আদিম ধারণার মতো গুরুত্বপূর্ণ নয়, তবে আমাদের আনুষ্ঠানিকভাবে আদিম সংজ্ঞায়িত করার জন্য এটি চালু করতে হবে।

ক্রিপ্টোগ্রাফিক ফাংশন

একটি ক্রিপ্টোগ্রাফিক ফাংশন একটি মানচিত্র

\[ f: {\bf K} \times {\bf R} \times {\bf I} \to {\bf O}\]

একটি সেট \({\bf K}\) (কী স্থান), একটি সেট \({\bf R} = \{0,1\}^{\infty}\)(এলোমেলোতা, যা আমরা অসীম বিটস্ট্রিংয়ের সেট বলে ধরে নিই), এবং একটি সেট \({\bf I}\) (ইনপুট স্পেস), একটি সেট \({\bf O}\) (আউটপুট স্থান)।

আমরা কেন একটি নির্দিষ্ট এলোমেলোতা পরামিতি যোগ করেছি তা পরে পরিষ্কার হয়ে যাবে।

একটি উদাহরণ হিসাবে, আমরা একটি সম্ভাবনা দেখাই কিভাবে এই ধারণাগুলি AES-GCM-তে ম্যাপ করা যেতে পারে। প্রতিটি বৈধ কী আকার \(s_k\), nonce size \(s_n\), এবং ট্যাগ আকার\(s_t\), AES-GCM দুটি ক্রিপ্টোগ্রাফিক ফাংশন নিয়ে গঠিত, একটি এনক্রিপশনের জন্য এবং একটি ডিক্রিপশনের জন্য৷ উভয়েরই একই কী স্পেস থাকবে \({\bf K} = \{0,1\}^{s_k}\)।

এনক্রিপশন ফাংশন \(\mathrm{Enc}\)এর জন্য, প্রথম \(s_n\) বিট র্যান্ডমনেস ব্যবহার করা হবে ননস নির্বাচন করতে।

\({\bf B} = \{0,1\}^8\) একটি বাইট নির্দেশ করে। এনক্রিপশন ফাংশনের ইনপুট স্পেস হল যথেচ্ছ দৈর্ঘ্যের বাইট স্ট্রিংগুলির জোড়া \({\bf I} = {\bf B}^{*} \times {\bf B}^{*}\) । জোড়ার প্রথম উপাদানটি বার্তা বোঝানো হয়, দ্বিতীয় উপাদানটি সংশ্লিষ্ট ডেটা। AES-GCM স্ট্যান্ডার্ডের ইনপুটগুলির দৈর্ঘ্যের একটি উচ্চ সীমা রয়েছে, তবে আমরা নির্বিচারে দৈর্ঘ্যের অনুমতি দিতে পছন্দ করি এবং পরিবর্তে আউটপুট স্পেসে একটি বিশেষ ত্রুটি চিহ্ন \(\bot\) যোগ করি। আউটপুট স্পেস তখন হয়ে যায় \({\bf O} = {\bf B}^* \cup \{\bot\}\), যেখানে আমরা সফল গণনার ফলাফলকে নির্বিচারে সংজ্ঞায়িত করি \((\mathrm{IV} \| \mathrm{ciphertext} \| \mathrm{tag})\) হিসাবে স্ট্যান্ডার্ডে দেওয়া হিসাবে, এবং আউটপুট\(\bot\), যদি কিছু ইনপুট খুব দীর্ঘ হয়। তাই, একটি নির্দিষ্ট কী-এর জন্য, এনক্রিপশন ফাংশনটি \(\mathrm{Enc}_k : {\bf R} \times {\bf B}^* \times {\bf B}^* \rightarrow {\bf B}^* \cup \{\bot\}\)টাইপ হয়ে যায়।

ডিক্রিপশন ফাংশন \(\mathrm{Dec}\) এর জন্য কী স্পেস একই। ইনপুট স্থান কাকতালীয়ভাবে একই: \({\bf I} ={\bf B}^* \times {\bf B}^*\), কিন্তু এখন প্রথম উপাদানটি এনক্রিপশন ফাংশনের আউটপুট হিসাবে বোঝানো হয়েছে, যখন দ্বিতীয়টি এখনও সম্পর্কিত ডেটা।

আউটপুট স্থান একই \({\bf O} = {\bf B}^* \cup \{\bot\}\) (আবার একটি কাকতালীয়) হতে পারে। ব্যাখ্যাটি কিছুটা ভিন্ন, কারণ \(\bot\) সাধারণত একটি প্রমাণীকরণ ত্রুটি নির্দেশ করে (যদিও কিছু ইনপুট খুব দীর্ঘ হলে এটি আউটপুটও হবে)।

আমরা জোর দিয়েছি যে উপরের আনুষ্ঠানিকীকরণ মানকে আনুষ্ঠানিক করার একমাত্র বিকল্প নয় । উদাহরণস্বরূপ, কেউ ননকে ইনপুটের একটি অংশ হিসাবে বিবেচনা করতে পারে, পরিবর্তে এটিকে এলোমেলোতা থেকে পড়ার (যার ফলে একটি খুব ভিন্ন আদিম হয়)। বিকল্পভাবে, কেউ আউটপুটটিকে একটি ট্রিপল হিসাবে সংজ্ঞায়িত করতে পারে যাতে ননস, সাইফারটেক্সট এবং ট্যাগ থাকে (সংযুক্তির পরিবর্তে)। অথবা কেউ\({\bf K} = \{0,1\}^{128} \cup \{0,1\}^{256}\)এ কী স্পেস (কিছুটা নির্বিচারে) সীমাবদ্ধ করতে পারে।

ক্রিপ্টোগ্রাফিক অ্যালগরিদম:

একটি (প্রতিসম) ক্রিপ্টোগ্রাফিক অ্যালগরিদম একটি টিপল

\[(f_1, ... f_k)\]

ক্রিপ্টোগ্রাফিক ফাংশন, যেখানে সমস্ত ফাংশন একই কী স্পেস আছে। ক্রিপ্টোগ্রাফিক অ্যালগরিদমের ধরন হল tuple \((({\bf I}_1, {\bf O}_1), \ldots, ({\bf I}_k, {\bf O}_k))\)।

উদাহরণস্বরূপ, কী, ননস এবং ট্যাগ আকারের প্রতিটি বৈধ ট্রিপল \((s_k, s_n, s_t)\) এর জন্য, AES-GCM\({}_{s_k, s_n, s_t}\) হল একটি ক্রিপ্টোগ্রাফিক অ্যালগরিদম যার দুটি ফাংশন \(\mathrm{Enc}\) এবং \(\mathrm{Dec}\) উপরে বর্ণিত।

আদিম এবং ইন্টারফেস

আমরা পরবর্তীতে একটি ক্রিপ্টোগ্রাফিক আদিম সংজ্ঞায়িত করি।

আদিম
একটি আদিম হল ক্রিপ্টোগ্রাফিক অ্যালগরিদমগুলির একটি সেট, যেখানে সমস্ত অ্যালগরিদম একই ধরনের \((({\bf I}_1, {\bf O}_1), \ldots, ({\bf I}_k, {\bf O}_k))\), এবং অ্যালগরিদমের মূল স্পেসগুলি জোড়ায় জোড়ায় বিচ্ছিন্ন।

একটি উদাহরণ হিসাবে, Tink-এ \(\mathrm{AEAD}\) আদিম বিবেচনা করুন। এটির একাধিক অ্যালগরিদম রয়েছে, এর মধ্যে রয়েছে কী সাইজ 128 এবং 256 বিটের জন্য AES-GCM, ননস সাইজ 96 বিট সহ, কিছু কী সাইজ সহ AES-EAX এবং XChaCha20Poly1305। তাদের আলাদা কী স্পেস আছে, কিন্তু সব একই ক্রিপ্টোগ্রাফিক ফাংশন\(\mathrm{Enc}\) এবং \(\mathrm{Dec}\)প্রদান করে। (এই আনুষ্ঠানিক আলোচনায় আমরা কোনোভাবে AES-GCM-এর বিভিন্ন কী মাপ ভেঙে ফেলার কোনো উদ্দেশ্য দেখতে পাচ্ছি না, তবে অবশ্যই কেউ তা করতে পারে)।

আদিম সংজ্ঞায়িত করা

আদিম চিন্তা করার স্বাভাবিক উপায় হল প্রথমে ক্রিপ্টোগ্রাফিক ফাংশনগুলির বৈশিষ্ট্যগুলিকে সংজ্ঞায়িত করা, এবং তারপরে কেবল আদিমকে এই জাতীয় সমস্ত অ্যালগরিদম হিসাবে বিবেচনা করা।

উদাহরণস্বরূপ, AEAD-এর জন্য আমরা বলব যে \(\mathrm{Dec}_k(\mathrm{Enc}_k(m, a), a) = m\) 'সর্বদা' সন্তুষ্ট (যেমন যদি প্লেইনটেক্সট \(m\) খুব দীর্ঘ হয়)। উপরন্তু, আমরা নিরাপত্তা বৈশিষ্ট্য আছে; উদাহরণস্বরূপ, একটি র্যান্ডম কী-এর জন্য, এনক্রিপশন শব্দার্থগতভাবে সুরক্ষিত।

তখন AEAD আদিম হল সমস্ত ক্রিপ্টোগ্রাফিক অ্যালগরিদমের সেট যা এই বৈশিষ্ট্যগুলিকে সন্তুষ্ট করে। অন্য কথায়, বাস্তবে, যখন আমরা একটি নির্দিষ্ট আদিম সংজ্ঞায়িত করি, তখন আমরা বৈশিষ্ট্যের উপর ভিত্তি করে এটি সংজ্ঞায়িত করি। সংজ্ঞাটি নির্দেশ করে আমরা অ্যালগরিদমের একটি তালিকা দিই না।

ইন্টারফেস

টিঙ্কের একটি ইন্টারফেস একটি আদিম অ্যাক্সেস দেয়, এই অর্থে যে এটি ইনপুট স্থান থেকে আউটপুট স্থানের একটি উপাদান গণনা করতে দেয়। উদাহরণস্বরূপ, জাভাতে AEAD ইন্টারফেস বিবেচনা করুন:

public interface Aead {
  byte[] encrypt(byte[] plaintext, byte[] associated_data) throws GeneralSecurityException;
  byte[] decrypt(byte[] ciphertext, byte[] associated_data) throws GeneralSecurityException;
}

মনে রাখবেন আমরা এলোমেলোভাবে অ্যাক্সেস দিই না। পরিবর্তে, আমরা ব্যবহারকারীকে ইনপুট স্থানের উপাদান প্রদান করার অনুমতি দিই। এলোমেলোভাবে অ্যাক্সেসের অনুমতি না দেওয়া অবশ্যই উদ্দেশ্যমূলক। 1

Tink কখনও কখনও একটি একক আদিম জন্য একাধিক ইন্টারফেস প্রস্তাব. এটি খুব দরকারী হতে পারে, কারণ মাঝে মাঝে প্রয়োজনীয়তা ভিন্ন হয়। তবুও, এটি করা একটি মূল্যে আসে: সাধারণভাবে, একজন যত বেশি ইন্টারফেস অফার করে, আন্তঃকার্যক্ষমতা তত কম। উদাহরণস্বরূপ, কল্পনা করুন যে কেউ টিঙ্কের উপর ভিত্তি করে একটি লাইব্রেরি লিখেছেন যা ব্যবহারকারীকে একটি Aead অবজেক্টে পাস করতে হবে (অভ্যন্তরীণভাবে কিছু এনক্রিপ্ট করতে)। যদি Tink \(\mathrm{AEAD}\) প্রিমিটিভ-এ অনেকগুলি ভিন্ন ইন্টারফেস অফার করে, তবে ব্যবহারকারীর কাছে এমন একটি উদাহরণ প্রস্তুত না থাকার সম্ভাবনা বেশি যা ব্যবহারকারীর বাছাই করা কী এবং লাইব্রেরির জন্য একই সময়ে কাজ করে। তাই, আরো ইন্টারফেস যোগ করা একটি ট্রেড-অফ।


  1. AEAD সাইফারের সম্পত্তি রয়েছে যে তারা নির্বাচিত সাইফারটেক্সট আক্রমণের বিরুদ্ধে সুরক্ষিত থাকে, যেটি নিশ্চিত করা হয় শুধুমাত্র যদি ননসের কোন পুনঃব্যবহার না হয়। Tink-এর Aead ইন্টারফেসটি এমনভাবে ডিজাইন করা হয়েছে যে এটি পুনরায় ব্যবহার না হওয়াকে বাধা দেয়: ব্যবহারকারী এনক্রিপশনের জন্য ইনপুট হিসাবে একটি নন্স প্রদান করতে পারে না, পরিবর্তে, প্রতিটি এনক্রিপ্ট অপারেশনের জন্য এলোমেলোভাবে একটি নতুন নন্স তৈরি করা হয়।