CommentsTweetブログの書き溜めがなくなり、久方ぶりに書くことになりました山本です。今回は、暗号化(難読化)です。いっても、複雑な暗号化は私の数学的知識では出来そうにありませんので、とても簡単なものを考えております。難読化を行おうと思ったかというと、あるユーザの操作情報をCookieに入れるのですが、その中身を見て気付かれたくなかったり、簡単に加工されたくなかったりといった事が理由でした。Cookieを使わずに、Ajaxか何かでサーバと通信してが一番確実なのですが、そこまでする程の情報でもない場合のケースです。分かる人がソース見れば、復号化も出来るわけですから単純にいえば、足切りですね。暗号化さて簡単な暗号に、カエサル暗号というものがあります。値を左右にシフトする暗号です。もとの値が「D」であった場合、左に3シフトすると、「A」となります。wikiからの引用ですが、以下のように変更されます。ALDまず、これベースにしていきましょう。カエサル暗号では、アルファベットしか使用しないので、シフトが簡単ですが、日本語を使うとなると少々面倒になります。Base64にしてしまいましょう。offs));}console.log(newWord.join(''));右に10シフトした結果です。?As@>>UPAAo?As@>>YA>ys:?As@AA5C簡単に難読化が出来ました。ブラウザ上では分かりませんがAAとo?の間に一箇所抜けが出ています。これは、y:121に10を加算すると131となり、ASCIIの範囲を超えてしまうからですね。ASCIIの範囲を超える場合、循環するように調整を行う必要があります。復号化の際に問題が出そうな気がする制御文字、0~31と127ですが、これも除外します。方法としてはその文字のコードから32引いて、その数字を(127-32+1)で割り、そこから余りを出し、32を加算することで可能でしょう。32以下の制御文字が入っていた場合、問題が発生しますが、そもそも制御文字を暗号化する必要があるとは思えないので無視します。asciiExclude));}調整すると、制御文字が出ないようになりました。?As@>>UPAA$o?As@>>YA>ys:?As@AA5Cシフト数を調整するベースは出来たので、複雑にしていきます。固定の数値分シフトするのは少々面白くないので、シフトする数を可変としましょう。いえ、ランダムでは復号化出来ないので何かしらの法則性を設ける必要があります。asciiExclude));}少々安易ですが、文字それぞれに、左から数えて何文字目かを二乗して、それに同じ値を三乗して10で割った数を足し、四捨五入した数だけシフトするようにしました。12計算式にするとそれ程複雑ではありません。約数等の条件でn乗になるようにすれば更に分かりにくくなるのではと思います。ダミーを混ぜる現在、シフトはしていますが本物のデータのみとなっています。ここにダミーも混ぜるようにすると強度が増しますね。段階的に進めていきましょう。一つおきに、簡単にダミーが入るように調整します。ダミーなので、ランダムの値を入れておきます。asciiLimit)));}ダミーが入るようになりました。of:LE1[JYui&!jfB3回目:5l8?n(BMJvZn&Z:3KXri$LF\UM@tdA/^5<HX$C9Op!5s’OT*o4:<EH[XY5i5!2fXダミーがランダムだと、差分でどの値がダミーであるかが判別出来てしまいます。ランダムは避けたほうが良いでしょう。0)));}一個前の文字のコードに、同じコードの3乗を足してみました。UA@Ud</g5<H<$D9Up<5z'<T<oA:UE<[gYUiU!#f_並び替えるさて、ダミーを足すところまでやりました。一文字おきというのは少々安易です。正しい文字がバラけて、かつダミーの数、順番に波を設けます。知識では良いアイディアがないので以下のように、ある程度簡単に振り分けを行います。123456789864213579そして、各文字の間にダミー文字を入れていきます。入れる個数については、ひとつ前の文字のコードから、末尾一桁の数だけ入れていきます。result.join('');}fgoiju~Wb[\:;vM(K7d(TUK__56lW9:tRF7PnHI3/0`ai#s(@A#xFFrs(xF:;vM(K7d(ZBC'(i#s89r____56lWnJK7(i&'NRF7PnUKL9L9&$%J(i#sUVMtCId56lW$%J(i#spq$'(Ps(K7d(}opEF-K7Zd2dUYZUZ<As(#<!"D%はい、難読化してみました。原型をとどめていませんせんね。今までおこなってきたものを逆順にするだけです。バラして、要らないの消す?のは簡単でした。次に、シフトした値を戻して終わりになる予定なんですが。値を戻すことが出来なくなりました。暗号化した際には、逆から計算すばいいから大丈夫だろうぐらいしか考えて居なかったのでよくよく考えてみると、余りはあるのですが商の値が存在しないので逆算が出来ない。コードを総当りすれば出来るのでそれでやってみます。w2.join('').b64decode();}一応これで復号化出来るようになりました。方法としてはかなり不本意ですが。復号化するというのが、結構面倒ですね。今回も、暗号化した文字列内に商を保持しておけば総当りしなくも良かったわけですが、それをどこに含ませるのか。いざ自分で作ってみると考えなくてはいけないことが多そうです。システムソリューション事業部」が運営しています。システムソリューション事業部ではWebシステム全般をつくっていますが、なかでも動画サイトの構築やSNS構築が得意です。当社で執筆した文章、制作したプログラムなどの著作権は、株式会社アジャストに帰属します。当社に著作権がない著作物については各著作者に帰属します。最近の投稿JSONデータで一覧を作ってみるLaravelのテンプレートエンジンをTwigにしてみるfish-shellを触ってみよう仮想通貨の価格を機械学習する。