TEXT の複合化

暗号化して書き出された UTF-8 のファイルを複合化します。

前田稔の超初心者のプログラム入門

プログラムの説明

  1. 暗号化して書き出された UTF-8 のファイルを入力して複合化するプログラムです。
    暗号化された Text File が "C:\TMP\encode.txt" の名前で書き出されています。
    暗号化は TEXT の暗号化 を参照して下さい。
    30 ~ FF のコードを乱数で置き換えるだけなので、保証の限りではありません。(^_^;)
  2. 複合化には暗号化に使用した m_et[] が必要です。
    乱数を使う暗号化では、乱数の発生方法が重要なファクターになるので、自前の乱数を発生する関数を作成しました。
    5041 や 13 は、擬似乱数を発生させるための値です。
        // 乱数を発生する
        public static uint random(uint n)
        { return (n * 5041 + 13); }
    
  3. Shuffle() は 30 ~ FF の変換テーブルを混ぜ合わせる関数です。
    パラメータで渡された val をキーにして、m_et[] にシャッフルして格納します。
    val の値によって m_et[] の値が決まり、val はパスワードを使って設定します。
        // 30(48)~ FF(255)の変換テーブルを作成
        public static void shuffle(uint val)
        {
            uint i, j;
            for (i=0; i<208; i++) m_et[i] = 0;
            for (i=0, j=val; i<208; i++)
            {
                for(j=random(j)%208; m_et[j]!=0; j=(j+1)%208) ;
                m_et[j] = (byte)(i+48);
            }
        }
    
  4. 複合化する decode() 関数です。
    キャラクター配列で渡された暗号化された文字列を複合化します。
    char chr を byte* byt でポイントして d_cvt() 関数を呼び出します。
    d_cvt() では 48 以上のコードを m_dt[] テーブルを参照して置き換えます。
    C# では char は2バイトで構成されます。
        // Decode
        public static void decode(char[] msg)
        {
            char    chr;
            byte*   byt;
    
            byt = (byte*)&chr;
            for(int i=0; i<msg.GetLength(0); i++)
            {   chr = msg[i];
                d_cvt(byt);
                msg[i] = chr;
            }
        }
            
        // decode byte 変換
        public static void d_cvt(byte* pt)
        {
            for (int i=0; i<sizeof(char); i++)
            {
                if (*(pt+i)>=48)    *(pt+i) = m_dt[*(pt+i)-48];
            }
        }
    
  5. Main() 関数では、ポインターを使うので unsafe を設定して下さい。
    m_et が暗号化するテーブルで、m_dt が複合化する m_et の逆テーブルです。
    m_dt を作成するには m_et が必要なので、先に m_et を作成しています。
    string に対して byte* は使えないようなので char[] に変換して decode() に渡します。
    元の文字列が印字されていることを確認して下さい。
    using System;
    using System.IO;    // for File, StreamReader
    using System.Text;  // for Encoding
    
    unsafe class console
    {
        static byte[] m_et = new byte[208];
        static byte[] m_dt = new byte[208];
    
        public static void Main()
        {
            StreamReader reader;
            uint   val = 123;
            shuffle(val);
            for(int i=0; i<208; i++)    m_dt[m_et[i]-48] = (byte)(i+48);
    
            string  str;
            reader = new StreamReader("C:\\TMP\\encode.txt", Encoding.UTF8);
            str = reader.ReadToEnd();
            reader.Close();
    
            char[] msg = str.ToCharArray();
            decode(msg);
            Console.WriteLine(msg);
            Console.ReadLine();
        }
    

[Previous Chapter ↑] TEXT の暗号化

超初心者のプログラム入門(C# Frame Work)