TEXT の暗号化

Text File を暗号化するプログラムと、復号化するプログラムです。
乱数を使った簡易暗号化です。あなたも解読に挑戦してみて下さい。 (^_^;)

前田稔(Maeda Minoru)の超初心者のプログラム入門

暗号化のプログラム

  1. Text File を乱数を使って、暗号化するプログラムです。
    プログラムを実行するとファイル名を聞いてくるので Text File の名前をタイプして下さい。
    暗号化された Text File が encode.txt の名前で作成されます。
    30 ~ FF のコードを乱数で置き換えるだけなので、テキストエディタなどで開くことが出来ます。
    一見しただけでは判読出来なくなるのですが、あなたも解読に挑戦してみて下さい。 (^_^;)
  2. 乱数を使う暗号化では、乱数の発生方法が重要なファクターになるので、自前の乱数を発生する関数を作成しました。
    5041 や 13 は、擬似乱数を発生させるための値です。
        // 乱数を発生する
        unsigned short  random(int *n)
        {
            *n= *n * 5041+13;
            return (unsigned short)*n;
        }
        
  3. Shuffle() は 30 ~ FF の変換テーブルを混ぜ合わせる関数です。
    パラメータで渡された *n をキーにして、t[] をシャッフルします。
        // シャッフルする
        void  Shuffle(int t[],int *n)
        {   int     i,j;
    
            for(i=0; i<SIZE; i++)    t[i]= -1;
            for(i=0; i<SIZE; i++)
            {   for(j=random(n)%SIZE; t[j]!=-1; j=(j+1)%SIZE);
                t[j]= i;
            }
        }
        
  4. conio.h と _getch(); は、表示の確認を行うために追加したコードです。
    不要ならば削除して下さい。
        #include    <conio.h>
        printf("%s を変換して %s を作成しました\n",IN_F,OT_F);
        _getch();
        
  5. 暗号化するプログラム Encode.cpp です。
    /*★ TEXT 文章を暗号化する    前田 稔 ★*/
    #include    <stdio.h>
    #include    <conio.h>
    #define     SIZE    (0x100-0x30)
    
    char        buf[32768];
    char        IN_F[256];
    char        OT_F[256]= "encode.txt";
    unsigned    int     len;
    int         et[SIZE];       //Encode Table
    
    // 乱数を発生する
    unsigned short  random(int *n)
    {
        *n= *n * 5041+13;
        return (unsigned short)*n;
    }
    
    // シャッフルする
    void  Shuffle(int t[],int *n)
    {   int     i,j;
    
        for(i=0; i<SIZE; i++)    t[i]= -1;
        for(i=0; i<SIZE; i++)
        {   for(j=random(n)%SIZE; t[j]!=-1; j=(j+1)%SIZE);
            t[j]= i;
        }
    }
    
    // buf[] のコード(30 ~ FF) を et[] で暗号化する
    void  encode(char buf[], unsigned int len)
    {   int    i,wk;
        unsigned  char  wc;
    
        wk= len;
        for(i=0; i<wk; i++)
        {   wc= buf[i];
            if (wc>=0x30)   buf[i]= (char)(et[wc-0x30]+0x30);
        }
    }
    
    int  main()
    {   FILE    *FI,*FO;            //FILE の定義
        int      wk;
    
        wk= 123;
        Shuffle(et,&wk);             //30 ~ FF をシャッフル
    
        printf("入力ファイル名をタイプして下さい\n");
        scanf_s("%s",IN_F,256);
    
        if (fopen_s(&FI,IN_F,"rb")!=0)
        {   printf("INPUT FILE open error[%s]\n",IN_F);
            return(-1);
        }
        len= fread(buf,1,32768,FI);
        fclose(FI);
    
        encode(buf,len);            //buf[] を et[] で暗号化
    
        if (fopen_s(&FO,OT_F,"wb")!=0)
        {   printf("OUTPUT file open error[%s]\n",OT_F);
            return(-1);
        }
        fwrite(buf,1,len,FO);
        fclose(FO);
    
        printf("%s を変換して %s を作成しました\n",IN_F,OT_F);
        _getch();
        return(0);
    }
    

復号化のプログラム

  1. Encode.cpp で暗号化されたファイルを復号化するプログラムです。
    encode.txt を入力して、復号化したファイルを decode.txt の名前で保存します。
    暗号化する前のファイルと比べてみて下さい。
  2. 復号化するプログラム Decode.cpp です。
    乱数を発生する関数やシャッフルする関数は Encode.cpp と同じです。
    /*★ 暗号化した文章を復号化する    前田 稔 ★*/
    #include    <stdio.h>
    #include    <conio.h>
    #define     SIZE    (0x100-0x30)
    
    char        buf[32768];
    char        IN_F[256]= "encode.txt";
    char        OT_F[256]= "decode.txt";
    unsigned    int     len;
    int         et[SIZE];       //Encode Table
    int         dt[SIZE];       //Decode Table
    
    // 乱数を発生する
    unsigned short  random(int *n)
    {
        *n= *n * 5041+13;
        return (unsigned short)*n;
    }
    
    // シャッフルする
    void  Shuffle(int t[],int *n)
    {   int     i,j;
    
        for(i=0; i<SIZE; i++)    t[i]= -1;
        for(i=0; i<SIZE; i++)
        {   for(j=random(n)%SIZE; t[j]!=-1; j=(j+1)%SIZE);
            t[j]= i;
        }
    }
    
    // buf[] の TEXT を 復号化 する
    void  decode(char buf[], unsigned int len)
    {   int    i,wk;
        unsigned  char  wc;
    
        // Decode Table を作成する
        for(i=0; i<SIZE; i++)   dt[et[i]]= i;
        wk= len;
        for(i=0; i<wk; i++)
        {   wc= buf[i];
            if (wc>=0x30)   buf[i]= (char)dt[wc-0x30]+0x30;
        }
    }
    
    int  main()
    {   FILE    *FI,*FO;            //FILE の定義
        int      wk;
    
        wk= 123;
        Shuffle(et,&wk);             //30 ~ FF をシャッフル
    
        if (fopen_s(&FI,IN_F,"rb")!=0)
        {   printf("INPUT FILE open error[%s]\n",IN_F);
            return(-1);
        }
        len= fread(buf,1,32768,FI);
        fclose(FI);
    
        decode(buf,len);            //buf[] を Decode
    
        if (fopen_s(&FO,OT_F,"wb")!=0)
        {   printf("OUTPUT file open error[%s]\n",OT_F);
            return(-1);
        }
        fwrite(buf,1,len,FO);
        fclose(FO);
    
        printf("%s を Decode して %s に出力しました\n",IN_F,OT_F);
        _getch();
        return(0);
    }
    

超初心者のプログラム入門(C/C++)