Vigenere暗号の変更

最近、個人的な目的のために、情報を隠すために単純な暗号を使用する必要がありました。 最初は、古き良きシーザー暗号を使用したかったので、各文字は固定数の位置だけシフトされた別の文字に置き換えられました(たとえば、1つの位置だけシフトすると、ARKA-> BSLBになります)。 ただし、少量の情報を暗号化する場合、およびソーステキストに重複する文字がある場合、暗号は数秒で解読されます(たとえば、「BARK LLC」→「VPSL RFP」単位のシフト)。 その結果、選択はVigenere暗号決まりました 。これは実装が非常に簡単で、ハッキングに対してより耐性があります...







Vigenère暗号は多アルファベットであり、異なるシフト値を持つシーザー暗号のシーケンスです。 たとえば、最初の文字は3、2番目-5、3番目-8、などのシフトでエンコードされます。 シフト値の数値シーケンスは、コードワードを使用して保存されます。元のアルファベットの対応する文字の位置は、目的のシフト値を意味します。 したがって、コードワード "AVERS"の場合、テキストの最初の文字はシフトなしで暗号化され( "A" -0)、2番目はシフト2( "B" -2)で... 5番目-シフト18( "C" -18 )、6番目-再びシフトなし(「A」)など。 その結果、コードワード「AVERS」の場合、「SAIL」->「PVCDG」が得られます。



すべてが正常であるように見え、暗号強度が増加し、繰り返される文字はもはや危険をもたらしません(BARK LLC->)、しかし、暗号機能に関連する別のポイントが表示されます:エンコード時に結果は常に同じに見えます「アイデア」。 この機能は、小さなメッセージや、コードワードの長さがテキストで頻繁に繰り返される瞬間の長さに等しい場合に特に重要です。 コードワードの長さを長くすることで後者とうまく戦うことができる場合、同じテキストをエンコードするときの結果の再現性については何もできません。



追加のランダムな最初のキャラクター、より正確には、二重の機能を果たす数字で自分自身のための道を見つけました。 第一に、ソーステキストへのランダムな追加文字の数を示し、第二に、残りのテキストをエンコードするためのコードワードのシフトです(「0」-「AVERS」、「1」-「VERSA」、「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はい、コードは最適ではありませんが、私見では、この形式では、一部を理解し、ニーズに合わせて修正するのが簡単になります。



All Articles