プログラミング

Brainf*ckで暗号を作ってみる【C++】

brainfuck

はじめに

2回続けてBrainfuckの記事を書くとは私も思ってもみなかったのですが,ふとやりたくなったのでやってみました,という記事です.

なにをやりたくなったかというと「Brainfuck使えばイイ感じの暗号文が作れるのでは???」というもの.

暗号文については詳しくないです.

「イミテーションゲーム」を見て,アラン・チューリングかっけー,とかエニグマ暗号って名前かっこいい,とかそんな知識です.

でも意外と,やってみたら面白そうということでやってみました.

先駆者もいないんじゃないかな??

脆弱だから誰もやっていないんだと思うけど...笑

 

Brainfuck

この説明いるのかな...

簡単に言えば,8つの命令で成り立つチューリング完全な,難読プログラミング言語です.

詳しくは他の記事を見てくれると嬉しいです笑

  1. 【C++】難解プログラミング言語を作ろう!【brainf*ckベース】
  2. まるで暗号.今更ながら難読プログラミング言語Brainf*ckを解読してみる

この暗号みたいなBrainfuckを暗号文として使おうという企画?です.(日本語がややこしい)

先に紹介した,私の記事の1つ目で,Brainfuckのインタプリタを作成したんですが,これをデコーダとして使います.

エンコーダの実装の前に

これがこの記事の核です.

やりたいことは,「1.オリジナルの平文を受け取る」「2.暗号化(エンコード)」です.

encode_brainfuck

これだけ,といえばこれだけです.

もちろん,暗号化したものは復元(デコード)できなければ意味ないのですが,今回はBrainfuckベースのインタプリタがあるので,そちらは既に手元にあるわけですね.

暗号化のフロー

C++でコーディングしますが,まずは暗号化のフローを簡単に考えてみます.

  1. 平文読み込み
  2. 平文をASCIIコードに変換
  3. ASCIIコードを元にBrainfuckコードを生成
  4. ファイル出力

というシンプル4ステップです.

多分3のコード生成をいかにそれっぽくやるかが問題ですね.

というのも,例えば「A」をBrainfuckのコードに落とした時,ASCIIコードは「65」なので,"+"を65個と"."一つを出力すれば,OKなわけです.

でも,これって面白くないですよね.

暗号文なのに,ポインタ移動の">"を加えて3種類しかないので,見た目のインパクトも欠けます.

ということで,せめてループ("["と"]")を使いこなしたいところです.

さらに,Brainfuckでは命令以外はコメントとしてみなされるので,たくさんノイズも加えられます

これで,良い感じの暗号がつくれそうです!!

実装してみる

大きく分けて,エンコード部分ノイズ部分,そしてその他の雑処理含む全体のコードです.

それぞれ見ていきます.

ノイズ部分

これは特に,難しいこともありません.

ただ,命令と同じ文字はノイズとして加えられないので,そういったノイズが生成された場合は弾いて他のものに置き換える必要があります.

今回は,そういったものは改行コードとしました.

あ,ちなみに各命令はマクロで前もって定義しています.

エンコード部分

エンコード部分は,基本軸としてはASCIIコード分だけ"+"を書く方針ですが,ループを使うために少し工夫を加えます.

今回は,ループカウンタを10としたループのみに固定し,ループできそうなものはループさせる方針としました.

こうすることで,ASCIIコードを10で割った商と余りを使えば簡単にコーディングできそうです.

で,実装してみるとこんな感じ.

そして,これに適当にノイズをちりばめてください.笑

あとはメイン関数だけです.




最終的なコード

注:命令のマクロ定義は違うヘッダファイルで管理しているのを前提としたコードです.(詳しくはGithubのコードを見てね)

動作確認

早速動かしてみましょう.

今回は命令を以下のようにセットします.

オリジナルテキストは,

です.

コンパイルして変換してみましょう!

変換し終わったものを見てみましょう!

 

なんということでしょう.

ひと昔のウェブサイトを覗いたら文字化けしてた,という時の感情がこみ上げてきます.

え...

これ,本当に戻せるのかしら...

 

うおおおおおおお!!!

少し感動しました.

ちょっとそれっぽくできたので,私は嬉しいです.

これ意外と,解読難しくない

うーん,でも8つの命令しかないから,総当たりで負けるかな.

今,命令は1文字ですけど,これが複数文字の組み合わせになれば,結構難しい暗号になるかもしれませんね...

(分からんけど)

さいごに

はい,今回はBrainfuckで暗号文を作ってみようという企画でした!

意外とイイ感じな気がします!

ちなみにコードはGithubに全てあるので遊んでみてください.

HiroshiARAKI/esolang_interpreter: Let’s make your Esolang!

もちろん,Brainfuckのコードの生成できますよ!


スポンサードリンク