प्रिमिटिव और इंटरफ़ेस

इसके बाद, हम अनौपचारिक तौर पर, लेकिन फिर औपचारिक तौर पर दो अहम हिस्सा Tink, Primitive, और इंटरफ़ेस में इस्तेमाल की जाने वाली भाषा.

प्रिमिटिव

प्रिमिटिव एक गणितीय ऑब्जेक्ट होता है, जो सभी एल्गोरिदम के हिसाब से होता है सुरक्षित तरीके से कोई काम करता है. उदाहरण के लिए, 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\), नॉन्स साइज़ \(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}\).

क्रिप्टोग्राफ़िक एल्गोरिदम:

A (सिमेट्रिक) क्रिप्टोग्राफ़िक एल्गोरिदम एक टपल है

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

जिसमें सभी फ़ंक्शन की खाली जगह एक ही हो. कॉन्टेंट बनाने क्रिप्टोग्राफ़िक एल्गोरिदम का type, टपल \((({\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 प्रिमिटिव उन सभी क्रिप्टोग्राफ़िक एल्गोरिदम का सेट होता है जो इन प्रॉपर्टी को पूरा करता है. दूसरे शब्दों में, व्यावहारिक तौर पर, जब हम हम इसे प्रॉपर्टी के आधार पर तय करते हैं. हम इनकी सूची नहीं देते, एल्गोरिदम, जैसा कि परिभाषा से पता चलता है.

इंटरफ़ेस

Tink में मौजूद इंटरफ़ेस आपको प्रिमिटिव के तौर पर ऐक्सेस देता है. का इस्तेमाल करें. उदाहरण के लिए, Java में AEAD इंटरफ़ेस पर विचार करें:

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

ध्यान दें कि हम किसी भी विकल्प को इस्तेमाल करने की अनुमति नहीं देते. इसके बजाय, हम उपयोगकर्ता को ये काम करने की अनुमति देते हैं इनपुट स्पेस के एलिमेंट उपलब्ध कराएं. रैंडमनेस तक पहुंच न देना यह है खास मकसद से बनाया गया कोर्स.1

Tink कभी-कभी एक प्रिमिटिव के लिए कई इंटरफ़ेस ऑफ़र करता है. यह बहुत काम का हो सकता है, क्योंकि कभी-कभी ज़रूरी शर्तें अलग-अलग होती हैं. फिर भी, ऐसा करके ज़्यादा कीमत पर उपलब्ध होता है: आम तौर पर, एक इंटरफ़ेस में जितने ज़्यादा इंटरफ़ेस ऑफ़र किए जाते हैं, उतना ही कम एक-दूसरे के साथ काम करना कितना आसान है. उदाहरण के लिए, कि कोई व्यक्ति Tink पर आधारित एक लाइब्रेरी लिखता है, जिसके लिए उपयोगकर्ता को Aead ऑब्जेक्ट (किसी चीज़ को अंदरूनी तौर पर एन्क्रिप्ट (सुरक्षित) करने के लिए). अगर Tink ऑफ़र में कई ऑफ़र देता है, तो इंटरफ़ेस अलग-अलग \(\mathrm{AEAD}\) होता है, लेकिन इसकी संभावना ज़्यादा है उपयोगकर्ता को के पास कोई ऐसा इंस्टेंस तैयार नहीं है जो उपयोगकर्ता की चुनी गई कुंजी के साथ काम करता हो और लाइब्रेरी में एक साथ रखा जा सकता है. इसलिए, ज़्यादा इंटरफ़ेस जोड़ना आसान नहीं है.


  1. AEAD साइफ़र में उनकी प्रॉपर्टी सुरक्षित होती है चुने गए साइफ़रटेक्स्ट हमलों के ख़िलाफ़ है. इसकी गारंटी सिर्फ़ तब मिलती है, जब नॉन्स का दोबारा इस्तेमाल न हो. Tink में मौजूद Aead इंटरफ़ेस को इस तरह से डिज़ाइन किया गया है कि नॉन्स को दोबारा इस्तेमाल करने से रोकता है: उपयोगकर्ता एन्क्रिप्ट (सुरक्षित) करने के लिए इनपुट के तौर पर नॉन्स नहीं दे सकता, इसके बजाय, एन्क्रिप्ट (सुरक्षित) करने की हर कार्रवाई के लिए, एक नया नॉन्स रैंडम तरीके से जनरेट होता है.