enc-logo

zip とか rar とか 7z とか圧縮機能で暗号化もできますが、そういうのだとこのファイルは zip だね とわかってしまいます
拡張子を消したとしてもファイルの最初の部分から判断できます

どんなデータのファイルかもわからない状態で自分だけ復元できるようなものを作ってみたいなーと思いました
圧縮とか考えると数学とか複雑な知識が必要になるので、単純な方法だけどやり方がわからないと復元方法がわからないようなものにしたいです
例えば zip だとパスワード入れるところがでてきて、ここに正解の文字が入れば復元できるので文字列を探せばいいだけってなります
それすらもわからないような、本当にこのファイルって「復元したもの」が存在するデータなのかなと思うようなのがいいです


どうすればいいんだろうと考えてみると、やっぱりデータだしバイナリ的な処理が必要だと思います
単純に 0 と 1 を全部反転とか?
何のファイルかもわからないようないい感じになりますけど、反転ってけっこう簡単に思いつきますし、思いついてしまえば困るところもなく復元できてしまいます

5 つずつ 0 か 1 かを持ってきて、 "00000" なら "01010" で "00100" なら "10111" みたいに適当な対応付けをして全部変換というのもできそうです
復元がすごく難しそうですけど、自分で対応表を作るって面倒ですし、いざ復元というときに覚えておくのも大変です
変換するツール側で固定の値だと、ツールさえ見つけてしまえばソースから対応表がわかるので 0 と 1 を全部反転させたのと変わらないことになってしまいます
ツールが値をランダムで変えてしまうと復元ができなくなりますので、ずっと一緒になってないとだめですし

0 と 1 を反転の方法で、「反転する、反転しない、反転する、反転する」のようなルールを作って "1010" だと "0001" という風にするのはどうかな…
でもファイルサイズ分の反転するかしないかの情報作るのって大変そう
ルールを共通にしたら上のと同じ問題が起きるしー

そうだ、反転するしないを 0 か 1 で暗号化するときに入力して足りない部分は入力した部分をループか折り返しで繰り返せばいい感じになりそう!

"1011" は 「反転する、しない、する、する」 とします
1 が反転して、0 が反転しないってことです
これで、データが 10 の長さだと "1011101110" と単純に繰り返すか "1011110110" と折り返して繰り返すかにします
これもソース見てしまえばどっちなのかわかりますし、わざわざ複雑な折り返しにして速度を落とす必要もなさそうなので単純に折り返しにします

反転するしないを分岐って毎回やってると if 文だから遅いのかな・・・と思ってたら、

あれ、これって XOR ???

と閃きました

XOR っていうと 2 つのビットを見て同じなら 0 で違ったら 1 にするものです
反転しない 0 のときは、データが 0 なら 1、データが 1 なら 0 でそのままになります
反転する 1 のときは、データが 0 なら 1 、データが 0 なら 1 で反転します
XOR と一緒です


ということは XOR するだけでお手軽に作れる!!

作ってみたもの

2 進数か 16 進数で反転するしないを入力します
01 を覚えておける自信がある人は少ないと思うので好きな色のカラーコードとかでいいかも

入力できたら青色のところにファイルをドロップしてください
複数対応してますよー

するとバックグラウンドで変換処理が行われます
終わったら自動でダウンロードされます

対応は Chrome だけで あとは未確認です
Edge や Firefox なら多分大丈夫じゃないかと思いますけど


○復元方法
決まった場所を反転させているだけなので、同じ 2 進数か 16 進数を指定して暗号化済みファイルをもう一度ドロップすれば元通りのファイルがとりだせます


○感想
XOR 暗号化って昔ゲームのセーブデータとかで聞いたことあるけどこういうことだったのかなー

作られたファイルをみて、どんなデータかわからないですしもし仮にこのツールで作ったとわかっても反転ルールがわからないと戻せないパスワードのようなものになっているのでとりあえず満足です