𝗖𝗕𝗖 𝗕𝗶𝘁 𝗙𝗹𝗶𝗽𝗽𝗶𝗻𝗴 𝘀𝗽𝗮𝘀𝗵ṭīkaraṇ
एन्क्रिप्शनचा अर्थ असा नाही की तुमचा डेटा फेरफार (tampering) पासून सुरक्षित आहे.
अनेक डेव्हलपर्स ही चूक करतात. त्यांना वाटते की जर एखादा अटॅकर डेटा वाचू शकत नसेल, तर तो बदलूही शकणार नाही. हे चुकीचे आहे. क्रिप्टोग्राफीमध्ये गोपनीयता (secrecy) आणि अखंडता (integrity) या दोन वेगवेगळ्या गोष्टी मानल्या जातात.
CBC Bit Flipping अटॅक हे सिद्ध करतो. तुमचा सिक्रेट की (secret key) न जाणताही अटॅकर तुमचा डेटा बदलू शकतो.
हे कसे कार्य करते ते पाहूया:
AES डेटा एका मोठ्या तुकड्यात एन्क्रिप्ट करत नाही. ते डेटाचे १६-बाइट ब्लॉक्समध्ये विभाजन करते. CBC मोडमध्ये, हे ब्लॉक्स एकमेकांशी साखळीप्रमाणे (chain) जोडलेले असतात. पहिल्या ब्लॉकचे एन्क्रिप्टेड आउटपुट दुसऱ्या ब्लॉकच्या प्लेनटेक्स्टमध्ये (plaintext) मिसळले जाते.
ही साखळी डिक्रिप्शन दरम्यान एक कमकुवतता निर्माण करते. ब्लॉक २ चा मूळ मजकूर मिळवण्यासाठी, सर्व्हर त्याचे डिक्रिप्शन करतो आणि त्याला ब्लॉक १ च्या सायफरटेक्स्टसोबत (ciphertext) एकत्रित करतो.
अटॅकर याचा फायदा घेऊ शकतो:
- अटॅकर तुमचा एन्क्रिप्टेड ट्रॅफिक इंटरसेप्ट करतो.
- त्यांना की माहित नसते, त्यामुळे डेटा अर्थहीन (gibberish) दिसतो.
- ते ब्लॉक १ च्या सायफरटेक्स्टमधील विशिष्ट बिट्स बदलतात.
- ते हा बदललेला डेटा तुमच्या सर्व्हरला पाठवतात.
- जेव्हा सर्व्हर त्याचे डिक्रिप्शन करतो, तेव्हा ब्लॉक १ मधील बदलामुळे ब्लॉक २ साठीचे गणित बदलले जाते.
अटॅकरला संदेश वाचण्याची गरज नसते. ते फक्त अंतिम निकाल बदलण्यासाठी बिट्स फ्लिप करतात.
सेशन्ससाठी एन्क्रिप्टेड कुकीज वापरणाऱ्या एका जुन्या वेब ॲपचा विचार करा. एका कुकीमध्ये असे असू शकते: userid=994;role=user;
अटॅकर ही कुकी इंटरसेप्ट करतो आणि सायफरटेक्स्टमधील बिट्स फ्लिप करतो. सर्व्हर एक रिक्वेस्ट स्वीकारेपर्यंत ते अनेक रिक्वेस्ट पाठवतात. सर्व्हर फक्त डेटा डिक्रिप्ट होतो की नाही हे तपासतो, म्हणून तो बदललेला मजकूर प्रोसेस करतो. अचानक, डिक्रिप्ट झालेली स्ट्रिंग अशी दिसते: userid=994;role=admi;
आता अटॅकरला ॲडमिन ॲक्सेस मिळतो. त्यांनी कधीही की किंवा मूळ कुकी वाचली नाही.
एन्क्रिप्शनमुळे अखंडतेची (integrity) खात्री मिळते असे मानणे ही चूक आहे.
- कॉन्फिडेंशियलिटी (Confidentiality) लोकांना डेटा वाचण्यापासून रोखते.
- इंटिग्रिटी (Integrity) लोकांना डेटा बदलण्यापासून रोखते.
हे सुधारण्यासाठी, AES-GCM सारखे ऑथेंटिकेटेड एन्क्रिप्शन (Authenticated Encryption) वापरा. ते एक क्रिप्टोग्राफिक टॅग तयार करते. हा टॅग एका सीलप्रमाणे (seal) काम करतो. जर अटॅकरने एक बिट जरी बदलला, तर तो सील तुटतो. सर्व्हर त्वरित डेटा नाकारतो.
जर तुम्हाला CBC वापरावेच लागणार असेल, तर Encrypt-then-MAC आर्किटेक्चर वापरा. सायफरटेक्स्टसाठी एक ऑथेंटिकेशन कोड तयार करा आणि डिक्रिप्शन सुरू करण्यापूर्वी त्याची पडताळणी करा.
गुप्त डेटा म्हणजे नेहमीच विश्वासार्ह डेटा असा होत नाही. निर्णय घेण्यासाठी डेटा वापरण्यापूर्वी तो बदललेला नाही याची खात्री नेहमी करा.
CBC Bit-Flipping स्पष्टीकरण: केवळ एन्क्रिप्शनमुळे अखंडता (Integrity) सुनिश्चित होत नाही का?
एन्क्रिप्शनला अनेकदा सुरक्षेसाठी एक रामबाण उपाय मानले जाते. जर तुम्ही तुमचा डेटा एन्क्रिप्ट केला, तर तो सुरक्षित असतो, बरोबर? तसे नेहमीच नसते. एन्क्रिप्शन गोपनीयता (confidentiality) प्रदान करते (हे सुनिश्चित करते की केवळ अधिकृत व्यक्तीच डेटा वाचू शकतात), परंतु ते अंगभूतपणे अखंडता (integrity) प्रदान करत नाही (हे सुनिश्चित करणे की डेटाशी छेडछाड केलेली नाही).
येथेच CBC Bit-Flipping हल्ला महत्त्वाचा ठरतो.
CBC मोड म्हणजे काय?
Cipher Block Chaining (CBC) मोडमध्ये, प्रत्येक प्लेनटेक्स्ट ब्लॉक एन्क्रिप्ट करण्यापूर्वी मागील सायफरटेक्स्ट ब्लॉकसोबत XOR केला जातो. यामुळे ब्लॉक्समध्ये एक अवलंबित्व (dependency) तयार होते, याचा अर्थ असा की एका ब्लॉकमधील बदल पुढच्या ब्लॉकच्या डिक्रिप्शनवर परिणाम करतो.
एन्क्रिप्शनचे सूत्र खालीलप्रमाणे आहे:
C[i] = E(K, P[i] ⊕ C[i-1])
आणि डिक्रिप्शनसाठी:
P[i] = D(K, C[i]) ⊕ C[i-1]
येथे:
P[i]हा प्लेनटेक्स्ट ब्लॉक आहे.C[i]हा सायफरटेक्स्ट ब्लॉक आहे.Eहे एन्क्रिप्शन फंक्शन आहे.Dहे डिक्रिप्शन फंक्शन आहे.Kही की (key) आहे.⊕ही XOR क्रिया आहे.
त्रुटी (Vulnerability): Bit-Flipping
यातील त्रुटी डिक्रिप्शन सूत्रात आहे: P[i] = D(K, C[i]) ⊕ C[i-1].
लक्षात घ्या की प्लेनटेक्स्ट ब्लॉक P[i] हा मागील सायफरटेक्स्ट ब्लॉक C[i-1] वर अवलंबून असतो. जर एखाद्या हल्लेखोराने C[i-1] मधील एखादा बिट बदलला, तर त्याचा थेट परिणाम P[i] च्या डिक्रिप्टेड व्हॅल्यूवर होईल.
विशेषतः, जर एखाद्या हल्लेखोराने C[i-1] मधील $n$-वा बिट बदलला (flip केला), तर P[i] मधील $n$-वा बिट देखील बदलला जाईल.
एक उदाहरण हल्ला
कल्पना करा की एक वेब ॲप्लिकेशन युजर रोल (user roles) एका एन्क्रिप्टेड कुकीमध्ये साठवते:
user_id=123;role=guest
हल्लेखोराला role=guest बदलून role=admin करायचे आहे.
- हल्लेखोर सायफरटेक्स्ट इंटरसेप्ट करतो.
- तो कोणता ब्लॉक
role=guestस्ट्रिंग bevatतो हे ओळखतो. - त्याला माहित आहे की मागील सायफरटेक्स्ट ब्लॉक मधील बिट बदलल्यास सध्याच्या प्लेनटेक्स्ट ब्लॉक मधील संबंधित बिट बदलेल.
- तो
guestलाadminमध्ये रूपांतरित करण्यासाठी मागील सायफरटेक्स्ट ब्लॉकवर बिट-फ्लिप करतो.
जरी हल्लेखोराला एन्क्रिप्शन की माहित नसली, तरी तो आपला उद्देश साध्य करण्यासाठी डेटाची फेरफार करू शकतो.
हे असे का घडते?
हल्लेखोराला तो बदलत असलेल्या ब्लॉकच्या (C[i-1]) अखंडतेची (integrity) काळजी नसते. C[i-1] मध्ये बदल केल्यामुळे डिक्रिप्शन दरम्यान P[i-1] पूर्णपणे कचरा (random data) बनेल. तथापि, हल्लेखोराचा उद्देश P[i] मध्ये फेरफार करणे हा असतो, जो बिट बदलल्यानंतरही व्यवस्थित डिक्रिप्ट होईल.
Bit-Flipping हल्ले कसे रोखले जाऊ शकतात?
हे रोखण्यासाठी, तुम्हाला गोपनीयता आणि अखंडता दोन्ही सुनिश्चित करणे आवश्यक आहे.
1. MAC (Message Authentication Code) वापरा
MAC ही एक छोटी माहिती आहे जी संदेशाचे प्रमाणीकरण करण्यासाठी वापरली जाते. सायफरटेक्स्टला MAC जोडून, प्राप्तकर्ता (receiver) सायफरटेक्स्टमध्ये काही बदल झाले आहेत का हे तपासू शकतो.
Ciphertext + MAC
जर सायफरटेक्स्टमधील एकही बिट बदलला, तर MAC जुळणार नाही आणि प्राप्तकर्त्याला समजेल की डेटा विश्वासार्ह नाही.
2. AEAD (Authenticated Encryption with Associated Data) वापरा
AES-GCM (Galois/Counter Mode) सारखे आधुनिक एन्क्रिप्शन मोड एन्क्रिप्शन आणि प्रमाणीकरण एकाच टप्प्यात प्रदान करण्यासाठी डिझाइन केलेले आहेत. यांना AEAD मोड म्हटले जाते.
जर तुम्ही AES-GCM वापरले, तर सायफरटेक्स्टमधील कोणताही बिट बदलण्याचा प्रयत्न केल्यास डिक्रिप्शन प्रक्रिया अयशस्वी होईल, ज्यामुळे हल्ला पूर्णपणे रोखला जाईल.
निष्कर्ष
एन्क्रिप्शन हा अखंडतेचा (integrity) पर्याय नाही. जर तुम्ही CBC मोड वापरत असाल, तर नेहमी तुमच्या डेटाची अखंडता तपासण्यासाठी MAC किंवा AES-GCM सारख्या AEAD मोडचा वापर करा.