Hash MD 5 CRCの知識

22452 ワード

まず関連知識を普及させる
Hash
セキュアハッシュアルゴリズム(英語:Secure Hash Algorithm、略称SHA)は、暗号ハッシュ関数ファミリーであり、FIPSによって認証された5つのセキュアハッシュアルゴリズムである.1つのデジタルメッセージに対応する、長さが固定された文字列(メッセージ要約とも呼ばれる)を計算できるアルゴリズム.また、入力されたメッセージが異なる場合、異なる文字列に対応する確率が高い.これらのアルゴリズムを「セキュリティ」と呼ぶのは、以下の2つの点に基づいています(公式基準の説明に従います).
HASHは、ファイルの内容のデータから論理演算で得られる数値であり、異なるファイル(同じファイル名であっても)で得られるHASH値が異なるため、HASH値はファイルごとの身分証明書となる.
異なるHASH値のファイルの内容も異なる、同じHASH値のファイルの内容は完全に同じである(ファイル名が異なる場合でも).
HASH値にはファイルのチェック機能もあり、ファイルのチェックコードに相当する.また、ファイルのダウンロードが正しいかどうかを確認するためにも使用できます(例えば、システムミラーや他のオープンソースソフトウェアをダウンロードすると、公式サイトでファイルのHASH値が提供されます.HASH値を比較することで、ファイルが変更されたかどうかを判断しましょう).
ファイルのHash値はダウンロードファイルの検証に大きな用途があり,Hash値はファイル内容のバイナリコードによる一連の変換により生成され,ファイル名が変化してもHashの値は変化しない.そのため、開発の過程で一般的に2つのファイルが同じかどうかを比較するのは、2つのファイルのHash値を比較することです.
 
MD5
英語フルネームMessage-Digest Algorithm(メッセージ要約アルゴリズム)
ダウンロードすると、圧縮パッケージのプロパティでmd 5値がよく見られます.また、このダウンロードページは、ある場所で、このファイルのMD 5値がXXXXXXXXXXである可能性が高いと書かれています.これは何の役に立つのでしょうか.
白話白話:md 5は、実はアルゴリズムです.文字列、ファイル、または圧縮パケットをmd 5に実行すると、128 bitの固定長の列を生成できます.この串は、基本的に唯一です.
だから、圧縮パッケージを修理した人がいると、新しいシリアルが生成されます.このとき、サイトが提供したシリアルと新しく生成したシリアルを比較することができます.違いがあれば、修理されたことがあります.
詳細は以下を参照してください.https://zh.wikipedia.org/wiki/MD5/http://www.weixuehao.com/archives/474
 
CRC
サイクル冗長検査(英語:Cyclic redundancy check、通称「CRC」)は、ネットワークパケットやコンピュータファイルなどのデータから短い固定ビット数検査コードを生成するハッシュ関数であり、主にデータ転送や保存後に発生する可能性のあるエラーを検出または検査するために使用される.生成された数字は、送信または格納の前に計算され、データの後に付加され、受信者は、データが変化したかどうかを確認する.一般に、サイクル冗長検査の値は32ビットの整数である.本関数はバイナリのコンピュータハードウェアで使いやすく,数学的解析が容易で,特に伝送路干渉によるエラーの検出が得意であるため,広く応用されている.こちらはW.Wesley Petersonが1961年に発表した
 
HashHelper
次のC#バージョンのツールクラスです.主な機能は、ファイルHash、ファイルMD 5、ファイルCRC 32を計算することです.
using System;
using System.IO;
using System.Text;

/// <summary>
///                 
/// <example>       MD5 :
/// <code>
///   String hashMd5=HashHelper.GetMD5("MyFile.txt");
/// </code>
/// </example>
/// <example>       CRC32 :
/// <code>
///   String hashCrc32 = HashHelper.GetCRC32("MyFile.txt");
/// </code>
/// </example>
/// <example>       SHA1 :
/// <code>
///   String hashSha1 =HashHelper.GetSHA1("MyFile.txt");
/// </code>
/// </example>
/// </summary>
public class HashHelper
{
    /// <summary>
    ///         MD5 
    /// </summary>
    /// <param name="fileName">           </param>
    /// <returns>         </returns>
    public static String GetMD5(String fileName)
    {
        String hashMD5 = String.Empty;
        //        ,           ,      
        if (File.Exists(fileName))
        {
            using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))
            {
                //     MD5 
                System.Security.Cryptography.MD5 calculator = System.Security.Cryptography.MD5.Create();
                Byte[] buffer = calculator.ComputeHash(fs);
                calculator.Clear();
                //                  
                StringBuilder stringBuilder = new StringBuilder();
                for (int i = 0; i < buffer.Length; i++)
                {
                    stringBuilder.Append(buffer[i].ToString("x2"));
                }
                hashMD5 = stringBuilder.ToString();
            }//     
        }//    
        return hashMD5;
    }//ComputeMD5

    /// <summary>
    ///         CRC32 
    /// </summary>
    /// <param name="fileName">           </param>
    /// <returns>         </returns>
    public static String GetCRC32(String fileName)
    {
        String hashCRC32 = String.Empty;
        //        ,           ,      
        if (File.Exists(fileName))
        {
            using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))
            {
                //     CSC32 
                Crc32 calculator = new Crc32();
                Byte[] buffer = calculator.ComputeHash(fs);
                calculator.Clear();
                //                  
                StringBuilder stringBuilder = new StringBuilder();
                for (int i = 0; i < buffer.Length; i++)
                {
                    stringBuilder.Append(buffer[i].ToString("x2"));
                }
                hashCRC32 = stringBuilder.ToString();
            }//     
        }
        return hashCRC32;
    }//ComputeCRC32


    /// <summary>
    ///      SHA1
    /// </summary>
    /// <param name="fileName"></param>
    /// <returns></returns>
    public static String GetSHA1(String fileName)
    {
        String hashSHA1 = String.Empty;
        //        ,           ,      
        if (File.Exists(fileName))
        {
            using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
            {
                //     SHA1 
                System.Security.Cryptography.SHA1 calculator = System.Security.Cryptography.SHA1.Create();
                Byte[] buffer = calculator.ComputeHash(fileStream);
                calculator.Clear();
                //                  
                StringBuilder stringBuilder = new StringBuilder();
                for (int bufferIdx = 0; bufferIdx < buffer.Length; bufferIdx++)
                {
                    stringBuilder.Append(buffer[bufferIdx].ToString("x2"));
                }
                hashSHA1 = stringBuilder.ToString();

            }//     
        }
        else
        {
            Console.Error.WriteLine("{0}     !", fileName);
        }
        return hashSHA1;
    }//end GetSHA1
}

/// <summary>
///    CRC32      
/// </summary>
public class Crc32 : System.Security.Cryptography.HashAlgorithm
{
    public const UInt32 DefaultPolynomial = 0xedb88320;
    public const UInt32 DefaultSeed = 0xffffffff;
    private UInt32 hash;
    private UInt32 seed;
    private UInt32[] table;
    private static UInt32[] defaultTable;
    public Crc32()
    {
        table = InitializeTable(DefaultPolynomial);
        seed = DefaultSeed;
        Initialize();
    }
    public Crc32(UInt32 polynomial, UInt32 seed)
    {
        table = InitializeTable(polynomial);
        this.seed = seed;
        Initialize();
    }
    public override void Initialize()
    {
        hash = seed;
    }
    protected override void HashCore(byte[] buffer, int start, int length)
    {
        hash = CalculateHash(table, hash, buffer, start, length);
    }
    protected override byte[] HashFinal()
    {
        byte[] hashBuffer = UInt32ToBigEndianBytes(~hash);
        this.HashValue = hashBuffer;
        return hashBuffer;
    }
    public static UInt32 Compute(byte[] buffer)
    {
        return ~CalculateHash(InitializeTable(DefaultPolynomial), DefaultSeed, buffer, 0, buffer.Length);
    }
    public static UInt32 Compute(UInt32 seed, byte[] buffer)
    {
        return ~CalculateHash(InitializeTable(DefaultPolynomial), seed, buffer, 0, buffer.Length);
    }
    public static UInt32 Compute(UInt32 polynomial, UInt32 seed, byte[] buffer)
    {
        return ~CalculateHash(InitializeTable(polynomial), seed, buffer, 0, buffer.Length);
    }
    private static UInt32[] InitializeTable(UInt32 polynomial)
    {
        if (polynomial == DefaultPolynomial && defaultTable != null)
        {
            return defaultTable;
        }
        UInt32[] createTable = new UInt32[256];
        for (int i = 0; i < 256; i++)
        {
            UInt32 entry = (UInt32)i;
            for (int j = 0; j < 8; j++)
            {
                if ((entry & 1) == 1)
                    entry = (entry >> 1) ^ polynomial;
                else
                    entry = entry >> 1;
            }
            createTable[i] = entry;
        }
        if (polynomial == DefaultPolynomial)
        {
            defaultTable = createTable;
        }
        return createTable;
    }
    private static UInt32 CalculateHash(UInt32[] table, UInt32 seed, byte[] buffer, int start, int size)
    {
        UInt32 crc = seed;
        for (int i = start; i < size; i++)
        {
            unchecked
            {
                crc = (crc >> 8) ^ table[buffer[i] ^ crc & 0xff];
            }
        }
        return crc;
    }
    private byte[] UInt32ToBigEndianBytes(UInt32 x)
    {
        return new byte[] { (byte)((x >> 24) & 0xff), (byte)((x >> 16) & 0xff), (byte)((x >> 8) & 0xff), (byte)(x & 0xff) };
    }
}//end class: Crc32