もじょえんじにあ……共感できる?

日常のメモ。日々これ共感。へたれでしょほてきなIT?

暗号化ではなく難読化になル?

ゆってることがわからない風

'A' を 8bit数値の0x41と考えてみる
任意の二つの8bit数のXORが0x41となる組み合わせは基本的に256組あるハズ

これで選択攻撃からはある程度防御(eが最多だとかqの次はほぼuだとか)

ルールを決めて有効文字と無効文字を定義し有効文字の間には0個以上の無効文字をはさむ。

そうするとエンコード前の文字列は有効文字に限定される……と特にアカウント名は8bitじゃ物足りないかも。unicodeに拡張するかUTF-8として無理矢理処理するかは棚上げしよう(こないだ調べたら shelve(shelf;棚 の動詞)にも棚上げするという意味があってみんな考えることは似てるんだと思った)

seedの種はdatetime.now()とする(つまりseed()するだけ)。そして有効文字をエンコードし、8bit x 2にすると毎回違うものが生成される(256通り)。その後に0文字以上の無効文字をはさむ。そして次の有効文字をエンコードするを繰りかえす。よってエンコードの結果は毎回異なるし、不定長になる。また、エンコード後の長さが偶数ばかりだとバレる確率が上がりそうなので1/2の確率でムダな1要素(8bit)を付け足す。

これをBase64あたりでエンコードしておく。これをhtpasswd方式で書き込むスクリプトを作る。複数サイトを前提なので、ID, Pass以外もちょっと足しとく。delimiterはURLを入れるかもなので:でなくスペース(' '、%20ね)にする。

#site URL ID PASSWD
google https://map.google.com/ XXXXXXXXX XXXXXXXX
yahoo https://auction.yahoo.com/ XXXXXXXXX XXXXXXXX

ちょっとしたURL変更くらいならテキストエディタで対応できる。

デコーダをどんだけ難読化できるかだなー。スクリプトにはどうしてもgo+rは付けなきゃなので pdb.set_trace() には無力だけど、ちょっとした抑止力くらいにはなる……といいな。

この方式だと別のPCで作成した行をコピペできるのでデコーダが十分難読であればエンコーダは運用管理用のサーバに置く必要がなくなるし。