初学者が黛灰の文章解読を試みた話

黛灰さんのコミュニティにある010011みたいな、2進数のカッコイイやつを解読するプログラムを書いたので何かに使えるかもしれないし取っておくためのページです。

はじめに

すでにつよつよの解読班によって解読され、解読方法もコメントにあったのでありがたく参考にさせて頂いてます。思い付きでグーグル先生と遊んだ履歴です。
あと本当に文字コードもプログラミングもできません。Wikipwdiaの概要は読み込んだつもりですが、記載には誤りが含まれます、たぶん。

どうやってやるん

まず、文字って数値でできてるんですね。例えばACSIIコードという数値と文字を互換するコードに従えば、「MAYUYU」は「77 65 59 55 59 55」になります。
この変換器である文字コードにはいろいろ種類があって、Aという文字コードで文字から数値にされたものを、Bという文字コードで文字に変換すると文字化けが起こったりします。今回の解読はこの変換器を組み合わせることで行います。

文字コードを変換してみよ~

単純に変換だけの話なのでWeb上に存在する変換サイトで実行できます。この方法最初に気づいた人すごくない?(この段落は以下すべて、コメントに記載のことをやってみただけです。)

01011010 01010100 01010101 00110100 01001110 01101010 01100111 00110001 01011010 01010100 01010101 00110100 01001101 01010111 01001001 00110000 01011010 01010100 01001101 00110100 01001101 01010111 01000110 01101100 01011010 01010100 01001101 00110100 01001101 01010100 01101011 00110001 01011010 01010100 01001101 00110100 01001101 01101010 01100111 00110101 01011010 01010100 01001101 00110100 01001101 01010111 01000110 01101001 01011010 01010100 01010101 00110100 01001110 01101010 01100111 00110001 01011010 01010100 01010101 00110100 01001101 01010111 01001001 00110000 01011010 01010100 01001101 00110100 01001101 01010111 01000110 01101101 01011010 01010100 01010110 01101000 01001110 01000100 01101011 00110010 01011010 01010100 01010101 00110100 01001101 01010111 01001001 00110000 01011010 01010100 01001101 00110100 01001101 01010111 01000110 01101000 01011010 01010100 01001101 00110100 01001101 01010111 01000110 01101100 01011010 01010100 01001101 00110100 01001101 01010100 01101000 01101001

まずはASCIIコードで文字列に変換します。

ZTU4Njg1ZTU4MWI0ZTM4MWFlZTM4MTk1ZTM4Mjg5ZTM4MWFiZTU4Njg1ZTU4MWI0ZTM4MWFmZTVhNDk2ZTU4MWI0ZTM4MWFhZTM4MWFlZTM4MThi

続いてこれをBase64でデコードします。つまり文字から数値に変換します。
ここでは入力形式をBASE64、出力形式をプレーンTEXT)

e58685e581b4e381aee38195e38289e381abe58685e581b4e381afe5a496e581b4e381aae381aee3818b

utf-8で文字列に変換します。
(先ほどのサイトで入力形式をHEX、出力形式をプレーンTEXT)

内側のさらに内側は外側なのか

実装

Javaで実装しました。(エンコードの部分よくわかってないのでもっと簡単に書けると思う。わからんけど)

import java.io.*;
import java.util.Base64;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

public class ”クラス名”{
    public static void main(String args[]){
        try{
            Charset charset = StandardCharsets.UTF_8;
            File file = new File("テキストファイル");
            FileReader filereader = new FileReader(file);
            BufferedReader br = new BufferedReader(filereader);
            String str = br.readLine();
            String[] words = str.split(" ");
            String str1 = new String();
            for(String s : words){
                int Iosin = Integer.parseInt(s,2);  //2進数の文字列から10進数のintに変換
            //    String hex = Integer.toHexString(Iosin);
            //    System.out.print(hex);
                  str1 = str1 + String.valueOf((char)Iosin);  //char型にしてASCII文字に
            }
            byte[] a = Base64.getDecoder().decode(str1);    //base64でデコード
            String de1 = new String(a, charset);    //utf-8でエンコード(16進数が出力される(??))
            //16進数の列になってるので区切ってutf-8でエンコード
            int n = de1.length() / 2;
            byte[] b = new byte[n];
            for (int i = 0, j = 0; i < n; j += 2)
                b[i++] = (byte)Integer.parseInt(de1.substring(j, j + 2), 16);
            String s = new String(b, charset);
            System.out.println(s);
            br.close();
        }catch(FileNotFoundException e){
            System.out.println(e);
        }catch(IOException e){
            System.out.println(e);
        }
    }
}

Stringの引数にCharsetいれるやつ、感動した。これをわすれないために投稿しているまである。

以上です

文字コードについては文字化けうぜ~~ぐらいにしか思ってなかったけどこんなカッコよく使えるならかっこいいな~~て思った。base64のことめちゃくちゃ調べたけど圧縮できるってことしかわからなかった。いつかわかりたい。まあなにより

これでいつでも(同じ手法で暗号化された)暗号が複合できるね!!!

コメントを残す

メールアドレスが公開されることはありません。