विग्रीयर सिफर संशोधन

हाल ही में, व्यक्तिगत उद्देश्यों के लिए, जानकारी को छिपाने के लिए एक साधारण सिफर का उपयोग करना आवश्यक था। प्रारंभ में, मैं अच्छे पुराने सीज़र सिफर का उपयोग करना चाहता था, जहां प्रत्येक वर्ण को एक निश्चित संख्या में स्थान द्वारा स्थानांतरित किया जाता है (उदाहरण के लिए, जब एक स्थिति से स्थानांतरित करते हुए, हमें ARKA -> BSLB मिलता है)। हालाँकि, छोटी मात्रा में जानकारी एन्क्रिप्ट करने के मामले में और स्रोत पाठ में डुप्लिकेट अक्षर होते हैं, तो सिफर सेकंड के एक मामले में फटा जाता है (उदाहरण के लिए, हमारे मामले में, यूनिट "BARK LLC" -> "PPSL RFP")। नतीजतन, चुनाव विगेनियर सिफर पर गिर गया, जो लागू करने के लिए काफी सरल है और हैकिंग के लिए अधिक प्रतिरोधी है ...



विगेनेयर सिफर बहुपद है और विभिन्न बदलाव मूल्यों के साथ सीज़र सिफर का एक क्रम है। उदाहरण के लिए, पहला चरित्र 3 की पारी के साथ एनकोडेड है, दूसरा - 5 से, तीसरा - 8 से, आदि। शिफ्ट मानों का एक संख्यात्मक अनुक्रम एक कोड वर्ड का उपयोग करके संग्रहीत किया जाता है, जहां मूल वर्णमाला में संबंधित पत्र की स्थिति का मतलब वांछित बदलाव मूल्य होगा। इसलिए, कोड शब्द "AVERS" के लिए, हमारे पाठ का पहला वर्ण बिना किसी बदलाव के एन्क्रिप्ट किया जाएगा ("A" -0), दूसरा 2 की शिफ्ट के साथ ("B" -2) ... पांचवा - 18 की शिफ्ट ("C" -18 के साथ) ), छठा - फिर से एक बदलाव के बिना ("ए"), आदि। नतीजतन, कोड शब्द "AVERS" के लिए हमें "SAIL" -> "PVCDG" मिलता है।

सब कुछ ठीक लग रहा है, क्रिप्टोग्राफिक ताकत बढ़ गई है, बार-बार पत्र अब कोई खतरा नहीं पैदा करते हैं (BARK LLC -> ), हालांकि, एक और बिंदु सिफर सुविधाओं से संबंधित प्रतीत होता है: परिणाम हमेशा एक ही तरह के दिखेगा ("IVANOV") "IDEYUAV")। यह सुविधा विशेष रूप से छोटे संदेशों के लिए महत्वपूर्ण है और उन मामलों में जहां कोड शब्द की लंबाई पाठ में अक्सर दोहराए जाने वाले क्षणों की लंबाई के बराबर है। यदि कोड शब्द की लंबाई बढ़ाकर उत्तरार्द्ध को सफलतापूर्वक कंघी किया जा सकता है, तो उसी पाठ को एन्कोडिंग करते समय परिणाम की प्रतिलिपि प्रस्तुत करने की क्षमता के साथ यहां कुछ भी नहीं किया जा सकता है।

मुझे एक अतिरिक्त यादृच्छिक पहले चरित्र में अपने लिए एक रास्ता मिल गया, अधिक सटीक रूप से, एक संख्या जो एक दोहरी फ़ंक्शन करती है। सबसे पहले, यह स्रोत पाठ के लिए यादृच्छिक अतिरिक्त वर्णों की संख्या को इंगित करता है, और दूसरी बात, यह बाकी पाठ को एन्कोडिंग के लिए कोड शब्द की शिफ्ट है ("0" - "AVERS", "1" - "VERSA", "2 2" - "") आदि)। नतीजतन, हमें परिणाम की एक अस्थायी लंबाई मिलती है (यादृच्छिक वर्णों के जोड़ के कारण) और समान पाठों को एन्क्रिप्ट करते समय विभिन्न अनुक्रम।

रुचि रखने वालों के लिए, मैं PHP में कोड उद्धृत करता हूं:

function vizhener_encode($text,$kod) // ,   { $kod=strtoupper($kod); $string=strtoupper($text); $enc = array(); $dec = array(); $str="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; for($i=0;$i<strlen($str);$i++) { for($j=0;$j<strlen($str);$j++) { $ij=$i+$j; if($ij>=strlen($str)) { $ij=$ij-strlen($str); } $enc[$str{$i}][$str{$j}]=$str{$ij}; $dec[$str{$i}][$str{$ij}]=$str{$j}; } } $pos=0; $result=""; $string=eregi_replace(" ","_",$string); for($i=0;$i<strlen($string);$i++) { if(!eregi($string{$i},$str)) { $result=$result.$string{$i}; } else { $result=$result.$enc[$kod{$pos}][$string{$i}]; $pos=$pos+1; if($pos>=strlen($kod)) { $pos=$pos-strlen($kod); } } } return $result; } function vizhener_encode_mod($text,$kod) // ,   { $kod=strtoupper($kod); $string=strtoupper($text); $enc = array(); $dec = array(); $str="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; $add=mt_rand(1,9); $string=$string; for($i=1;$i<=$add;$i++) { $string=$string.$str{mt_rand(0,strlen($str))}; } for($i=0;$i<strlen($str);$i++) { for($j=0;$j<strlen($str);$j++) { $ij=$i+$j; if($ij>=strlen($str)) { $ij=$ij-strlen($str); } $enc[$str{$i}][$str{$j}]=$str{$ij}; $dec[$str{$i}][$str{$ij}]=$str{$j}; } } $pos=0; $result=""; $string=eregi_replace(" ","_",$string); $pos=$pos+$add; while($pos>=strlen($kod)) { $pos=$pos-strlen($kod); } if($pos<0) { $pos=$pos+strlen($kod); } for($i=0;$i<strlen($string);$i++) { if(!eregi($string{$i},$str)) { $result=$result.$string{$i}; } else { $result=$result.$enc[$kod{$pos}][$string{$i}]; $pos=$pos+1; if($pos>=strlen($kod)) { $pos=$pos-strlen($kod); } } } $result=$enc[$kod{0}][$add].$result; return $result; } function vizhener_decode($text,$kod) // ,   { $kod=strtoupper($kod); $string=strtoupper($text); $enc = array(); $dec = array(); $str="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; for($i=0;$i<strlen($str);$i++) { for($j=0;$j<strlen($str);$j++) { $ij=$i+$j; if($ij>=strlen($str)) { $ij=$ij-strlen($str); } $enc[$str{$i}][$str{$j}]=$str{$ij}; $dec[$str{$i}][$str{$ij}]=$str{$j}; } } $pos=0; $result=""; $string=eregi_replace(" ","_",$string); for($i=0;$i<strlen($string);$i++) { if(!eregi($string{$i},$str)) { $result=$result.$string{$i}; } else { $result=$result.$dec[$kod{$pos}][$string{$i}]; $pos=$pos+1; if($pos>=strlen($kod)) { $pos=$pos-strlen($kod); } } } return $result; } function vizhener_decode_mod($text,$kod) // ,   { $kod=strtoupper($kod); $string=strtoupper($text); $enc = array(); $dec = array(); $str="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; for($i=0;$i<strlen($str);$i++) { for($j=0;$j<strlen($str);$j++) { $ij=$i+$j; if($ij>=strlen($str)) { $ij=$ij-strlen($str); } $enc[$str{$i}][$str{$j}]=$str{$ij}; $dec[$str{$i}][$str{$ij}]=$str{$j}; } } $pos=0; $result=""; $string=eregi_replace(" ","_",$string); $add=$dec[$kod{0}][$string{0}]; $pos=$pos+$add; while($pos>=strlen($kod)) { $pos=$pos-strlen($kod); } if($pos<0) { $pos=$pos+strlen($kod); } for($i=1;$i<(strlen($string)-$add);$i++) { if(!eregi($string{$i},$str)) { $result=$result.$string{$i}; } else { $result=$result.$dec[$kod{$pos}][$string{$i}]; $pos=$pos+1; if($pos>=strlen($kod)) { $pos=$pos-strlen($kod); } } } return $result; } 


PS हाँ, कोड इष्टतम नहीं है, लेकिन, IMHO, इस रूप में इसे समझने और अपनी आवश्यकताओं को पूरा करने के लिए इसे संशोधित करना आसान होगा।

Source: https://habr.com/ru/post/In109904/


All Articles