ANGO



MS−DOSから利用するいいかげんなアルゴリズムの暗号化・複号化ツールです。
暗号化するとファイルサイズが大きくなります(^_^;)

ソースのダウンロード

※)サンプルの作成はVC++5.0で行いました。
※2)サンプルは標準Cライブラリーを用いています。




解説
(全体の流れ)

  1. コマンドライン引数によって処理を場合分けする。
  2. エンコードの場合の処理
  3. デコードの場合の処理




(詳細)
1.コマンドライン引数によって場合分けする。

まずは、コマンドライン引数のチェックをします。
第一引数は入力ファイル名、第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 ()を呼び出して使用法を表示してから終了します。
2.エンコードの場合の処理
エンコード処理は関数encode()の中で行っています。(ango_change.cpp)

暗号化の中心である暗号化テーブル用のメモリ領域を確保します。
//	暗号化テーブル用のメモリを取得
	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);
		}
	}

後は終了処理を行うだけです。(メモリ領域の開放、ファイルのクローズなど)
3.エンコードの場合の処理
デコードの場合もエンコードと同じようにして関数decode()で処理しています。(ango_change.cpp)

エンコードの場合と違うところはファイルから暗号化テーブルを読み込むところだけです。
	//	入力ファイルの先端から暗号化テーブルを読み込む
	for (i = 0; i < 256; i++)	{
		buf = fgetc (in_file);
		table[buf] = i;
	}



間違いを発見した方、質問をしたい方はこちらへお願いします。


トップページへ

Gポイントポイ活 Amazon Yahoo 楽天

無料ホームページ 楽天モバイル[UNLIMITが今なら1円] 海外格安航空券 海外旅行保険が無料!