(cache) 簡単にファイルチェックサム(MD5)ユーティリティを作る方法

簡単にファイルチェックサム(MD5)ユーティリティを作る方法


ファイルのチェックサム値はファイルの指紋のようなものです。

任意のファイルチェックサム値に合わせてファイルを作ることは非常に高度。さらに
意図的な内容を持たせつつ、オリジナルとサイズも一致させた上で同一のチェックサム値になるように改ざんすることが
できるとすればフィクションの世界ぐらいです。
そのため署名・認証・検査やセキュリティソフト、暗号化ソフトなど広くチェックサムは使われています。

ファイルのチェックサム値を計算するためのユーティリティは.NET Frameworkではだれもが作成できます。
巨大なVisual Studioのインストールは無用です。

easyMD5.zip : size 2.34 KB (2,404 Byte)
80:42:06:DB:7D:DF:63:34:4B:B6:C5:07:7B:17:0C:C0

easyMD5.zipのチェックサム値
zipファイルをダウンロードし、そのサイズおよび
計算したチェックサム値が合わないのであれば…
そのファイルは破損しているか、…最悪の場合、
第三者(ウィルス等)による改ざんもありえます…
…というよりも、
大概、原因はアップロード側の単純ミス。
この簡易ツールは、アップロードする人には
ファイル点検にもなります。




easyMD5.zip内にはProgram.csとcsc_compile.batの2つのファイルあります。
※非管理者権限でDLしたzip内のバッチファイル(.bat)が展開できない場合、zipの[プロパティ]-[ブロックを解除]。
もちろん、これらのファイルはメモ帳で編集することができます。

csc_compile.batの内容を単純にすれば次のとおりです。
%windir%\Microsoft.NET\Framework\v2.0.50727\csc.exe /target:winexe /out:%1.v20.exe %1
@pause
csc.exeはVisual C#のコンパイラです。
.NET Frameworkの各バージョン毎のcsc.exeはそれぞれ存在します。各オプションについては、csc.exe /help を参照。
v2.0はVista&Win7で、v3.5はWin7で最初から組み込まれています。無い場合はWindows Updateなどで導入できます。
Program.csはv2.0(v2.0.50727),v3.5のどちらでもコンパイルできるようにしてあります。

Windows 7上でのコンパイルの様子↓(クリックで最初から再生) XPでもVistaでも作業はまったく同じです
csc_shortcut
csc_compile.batにProgram.csをドラッグ&ドロップすることでProgram.cs.v20.exeが作成できます。
ご自身がご自身の環境で作ったプログラムになるので、とうぜん名称変更は自由です。



easyMD5.zip内の2つのファイルの詳細です。
Program.cs (クリックで表示します)
//file-name: Program.cs

using System;
using System.Text;
using System.IO;
using System.Windows.Forms;

namespace easyMD5
{
    class Program
    {
        private static byte[] _GetBytes(FileStream fs, int len)
        {
            System.Security.Cryptography.HashAlgorithm alg=null;
            try
            {
                //MD5以外にはSHA1,SHA256,SHA384,SHA512
                alg = System.Security.Cryptography.MD5.Create();
                Byte[] buf=new Byte[len];
                fs.Read(buf,0,len);
                return alg.ComputeHash(buf,0,len);
            }
            catch (Exception e) { MessageBox.Show(e.Message); }
            finally {if(alg!=null)alg.Clear();}
            return null;
        }

        private static string _BytesToHexString(byte[] bytes, char separator)
        {
            System.Text.StringBuilder sb=new System.Text.StringBuilder();
            
            for(int i=0;i<bytes.Length;i++)
            {
                sb.Append(String.Format("{0:X2}",bytes[i]));
                if(i<(bytes.Length-1))
                    sb.Append(separator);
            }
            return sb.ToString();
        }

        private static string GetMD5(string path)
        {
            if (!File.Exists(path))
                return null;
            FileStream fs = null;
            try
            {
                fs = new FileStream(path, FileMode.Open, FileAccess.Read);
                Byte[] bs = _GetBytes(fs, (int)(fs.Length));
                return _BytesToHexString(bs, ':');
            }
            catch (Exception e){ MessageBox.Show(e.Message); }
            finally {if (fs!=null)fs.Close();}
            return null;
        }
        
        private static string GetFileSizeString(string path)
        {
            FileInfo fi = new FileInfo(path);
            long lsize = fi.Length;
            double d;
            string r=lsize.ToString("N0") + " Byte";
            if (lsize<1024)
            	return r;
            else if (1024<=lsize && lsize<(1024*1024))
            {//KB
            	d = Math.Floor(((double)lsize / 1024.0) * 100.0) / 100.0;
	            return d.ToString("N2") + " KB" + " (" + r + ")";
            }
            //MB
            d = Math.Floor(((double)lsize / (1024.0 * 1024.0)) * 100.0) / 100.0;
            return d.ToString("N2") + " MB" + " (" + r + ")";
        }

        [STAThread]
        static void Main(string[] args)
        {
            String s;
            String s_title="easyMD5 ファイルチェックサム";

            if (args.Length == 1 && File.Exists(args[0]))
            {
                s = Path.GetFileName(args[0]) + " : size " + GetFileSizeString(args[0]) + "\n" + 
                    GetMD5(args[0]) +
                    "\n\n" +Path.GetDirectoryName(args[0]);
                s_title = "easyMD5 : [OK]でクリップボードへ";
                DialogResult r;
                r = MessageBox.Show(s, s_title, 
                        MessageBoxButtons.OKCancel, 
                        MessageBoxIcon.Information, 
                        MessageBoxDefaultButton.Button2);
                if (r == DialogResult.OK)//[OK]ボタンでクリップボード
                    Clipboard.SetText(s, TextDataFormat.UnicodeText);
                return;
            }
            
            if (args.Length == 0)
                s = "usage:\n" +
                        " easyMD5 [file path]\n\n" +
                        "プログラムアイコンにファイルをドラッグ&ドロップでも起動\n" +
                        "SendToフォルダにショートカットを作成する事で使い勝手も良くなります";
            else
                s = "このツールは複数ファイルやフォルダには対応していません";
            MessageBox.Show(s, s_title);
        }
    }
}
以上の内容を丸ごとコピーしメモ帳などでProgram.csと名前をつけ保存します。
C#の解説ページにする気はないのでコードの解説は省きます。気になる箇所はご自身でお調べください。

csc_compile.bat (クリックで表示します)
@if exist %windir%\Microsoft.NET\Framework\v2.0.50727\csc.exe goto dotNET_V20
@if exist %windir%\Microsoft.NET\Framework\v3.5\csc.exe goto dotNET_V35

@echo .NET Framework 2.0(v2.0.50727)もしくは3.5(v3.5)が無いのでコンパイルできません
@dir /AD %windir%\Microsoft.NET\Framework
@goto END

:dotNET_V20
%windir%\Microsoft.NET\Framework\v2.0.50727\csc.exe /target:winexe /optimize+ /out:%1.v20.exe %1
@goto END

:dotNET_V35
%windir%\Microsoft.NET\Framework\v3.5\csc.exe /target:winexe /optimize+ /out:%1.v35.exe %1
@goto END

:END
@pause
以上の内容を丸ごとコピーしメモ帳などでcsc_compile.batと名前をつけ保存します。
バッチファイルの解説ページにする気はないのでコードの解説は省きます。気になる箇所はご自身でお調べください。

.NET Framework 3.5で作りたいならば、1行目を除外するだけです。
ただし、v3.5はXP,Vista環境によっては、あらかじめWindows Updateなどで追加導入する必要があります。
v4.0は試してませんが、v4.0はWin7も追加導入が必要になります。
このソースではv2.0もv3.5も(たぶんv4.0も)差などありません。




このツールは自分が作成したファイルの証明に使うことができます。
ファイルをweb上で公開している方は、自分が作成したファイルの点検に使えます。

簡単なソースコードなので利用法はさまざまです。
作り直せば自動点検ツールや暗号化ツール、Base64変換ツールにすることも可能です。
個人的な写真/画像のチェックサム値をなんらかのパスワードにする単純な用途もあります。
なにより一番は、自分で理解し作ったプログラムは安心ができるということです。


2011 settyo top page