বৃহস্পতিবার, ২৭ অক্টোবর, ২০১৬

পাইথন দিয়ে জিপির সিক্রেট অফার ডিকোড করে ফেলা

একদিন জিপির কাছ থেকে এমন একটা মেসেজ পেলাম


কি এইটা? সিক্রেট মেসেজ? কোন সিক্রেট অফার নয়ত? সারা বছর অনলিমিটেড ইন্টারনেট? অন্তত মাসখানেক? নাহ অত খুশি হয়ে সম্ভবত লাভ নেই। কোন সমস্যাতেই হয়ত এমন মেসেজ চলে এসেছে। ইগনোর করতে যাচ্ছিলাম। তখন ভাবলাম যাই হোক ডিকোড করার চেষ্টা করা যাক। ক্রিপ্টোগ্রাফি অল্প সল্প কিছু শিখেছিলাম। ( দারুণ একটা বই ) দেখা যাক কাজে লাগানো যায় কিনা। কিভাবে করা যায় ডিকোড?


দেখা যাচ্ছে টেক্সট টাতে হাবিজাবি কিছু সংখ্যা আর & # ; ফরম্যাটটা এমন &#<চার অঙ্কের সংখ্যা>; সংখ্যাগুলা ২৪০০-২৫০০ মধ্যে। এক জায়গায় দেখা যাচ্ছে MB আরেক জায়গায় .88 আবার *7728*2*2#। ৮৮ পয়সায় বিশাল পরিমাণ ডেটা পাওয়া যাওয়ার বিশাল সম্ভাবনা। এখানে কিছু ইংলিশ ক্যারেক্টার ঠিকঠাক। কিন্তু বাকিগুলা এনক্রিপ্টেট! মানে দাঁড়ায় ইউনিকোড ক্যারেক্টারগুলা এনক্রিপ্টেট। ; দিয়ে নিশ্চয় ক্যারেক্টারগুলা আলাদা করা হয়েছে। ইউনিকোড ক্যারেক্টারের বদলে অর্ডিনাল আইসা পরে নাই ত? পাইথন নোটবুক খুলে শুরু করলাম



তাই মনে হচ্ছে। 'ক' এর ইউনিকোড ভ্যালু ২৪৫৩। তাহলে এইবেলা আর ক্রিপ্টোগ্রাফির জ্ঞানবুদ্ধি কাজে লাগানো গেল না 🙁 মেসেজটা একটা ফাইলে পেস্ট করে পিসিতে নিয়ে আসলাম। তারপর



এখন &#‌‌[code];  প্যাটার্নটাকে ইউনিকোড ক্যারেক্টার দিয়ে রিপ্লেস করে দিলেই হল। এখন ; দিয়ে split করে দেয়া যায়। তারপরে প্রত্যেকটার শেষের চারটা ক্যারেক্টার নিয়ে যে ইউনিকোড ক্যারেক্টার পাওয়া যায় সেগুলা নিয়ে আবার যোগ করে দিলেই হয়। কিন্তু সেক্ষেত্রে নন-ইউনিকোডগুলার জন্য ঝামেলা হয়ে যয়। আরো সুন্দর সলিউশন পেলে ভাল হয়।

হ্যাঁ। regex। regex দিয়ে রিপ্লেস করা যায়। এখানে প্যাটার্নটা হবে &#\d{4}; প্রত্যেকটা প্যাটার্নকে রিপ্লেস করতে হবে। ডক ঘেটে এই কাজের জন্য সুন্দর একটা ফাংশন পেয়ে গেলাম। re.sub() । এটা প্যাটার্ন রিপ্লেস করার জন্য একটা ফাংশন নেয়। তাহলে সেটা ডিফাইন করে ফেলা যাক



এইবেলা re.sub() কল করে ফেললেই হল