MS−DOSから利用するいいかげんなアルゴリズムの暗号化・複号化ツールです。
暗号化するとファイルサイズが大きくなります(^_^;)
ソースのダウンロード
※)サンプルの作成はVC++5.0で行いました。
※2)サンプルは標準Cライブラリーを用いています。
解説
(全体の流れ)
まずは、コマンドライン引数のチェックをします。2.エンコードの場合の処理
第一引数は入力ファイル名、第2引数は出力ファイル名、最後の引数がモードをあらわしています。(ango_main.cpp)
// main 関数 int main (int argc, char *argv[]) { if (argc != 4) { // 引数は必ず3つ必要 usage (); // 使い方を表示する return 1; } if (!strcmp (argv[3], "-e")) { // 3つ目の引数が'-e'のとき if (!encode (argv[1], argv[2])) { // エンコード処理 return 0; } } else if (!strcmp (argv[3], "-d")) { // 3つ目の引数が'-d'の時 if (!decode (argv[1], argv[2])) { // デコード処理 return 0; } } else { // それ以外のとき usage (); // 使い方を表示 return 1; } return 1; }
第3引数が"-e"の時ならエンコード処理を行い、"-d"のときならでコード処理を行います。
それ以外の場合(引数の数が合わない、モードをあらわす引数が間違っているなど)のときは関数usage ()を呼び出して使用法を表示してから終了します。
エンコード処理は関数encode()の中で行っています。(ango_change.cpp)3.エンコードの場合の処理
暗号化の中心である暗号化テーブル用のメモリ領域を確保します。
// 暗号化テーブル用のメモリを取得 table = (unsigned char*) calloc (256, sizeof(unsigned char)); if (!table) { // エラー処理 printf ("初期化に失敗しました!\n"); getchar (); return 0; }
確保したメモリ領域に0から255までのランダムな順列を作成します。
for (i = 0; i < 256; i++) { table[i] = i; } for (i = 0; i < 256; i++) { buf = table[i]; number = rand () % 256; table[i] = table[number]; table[number] = buf; }
関数の引数として指定された入出力用のファイルをオープンし、出力ファイルの先頭に先ほど作った暗号化テーブルを出力します。(デコードで使用します。)
// ファイルのオープン in_file = fopen (infile, "rb"); out_file = fopen (outfile, "wb"); // ファイルのオープンがどちらか一方でも失敗した場合 if (!in_file && !out_file) { printf ("ファイルのオープンに失敗しました!\n"); getchar (); fclose (in_file); // 一応ファイルを閉じる fclose (out_file); // 上に同じ return 0; } // 暗号化テーブルを出力ファイルの頭に出力する for (i = 0; i < 256; i++) { fputc ((int)table[i], out_file); }
入力から1バイトづつ読み込み、それを暗号化テーブルを参照しながら、出力ファイルに書き込みます。
// 実際のデータの暗号化 byte = 0; while ((buf2 = fgetc(in_file)) != EOF) { fputc ((int)table[buf2], out_file); byte++; if (byte % 1024 == 0) { printf ("%12dキロバイト処理済>\r", byte/1024); } }
後は終了処理を行うだけです。(メモリ領域の開放、ファイルのクローズなど)
デコードの場合もエンコードと同じようにして関数decode()で処理しています。(ango_change.cpp)
エンコードの場合と違うところはファイルから暗号化テーブルを読み込むところだけです。
// 入力ファイルの先端から暗号化テーブルを読み込む for (i = 0; i < 256; i++) { buf = fgetc (in_file); table[buf] = i; }
間違いを発見した方、質問をしたい方はこちらへお願いします。