CRC与MD5的异同

2019-11-26 15:01 来源:未知

本文意在广泛安全相关的学问,并附叁个C#兑现的文本管理工科具。

Hash

转危为安散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所验证的各类安全散列算法。能总结出五个数字新闻所对应到的,长度固定的字符串(又称新闻摘要卡塔尔国的算法。且若输入的音信分歧,它们对应到分化字符串的票房价值超高。这个算法之所以称为“安全”是依据以下两点(依照官方正规的陈说卡塔 尔(英语:State of Qatar):

HASH是基于文件的原委的数码通过逻辑运算获得的数值, 分歧的公文(即便是大同小异的文件名)获得的HASH值是不一样的, 所以HASH值就成了每叁个文书的居民身份证。

昔不最近HASH值的文本内容也是不黄金年代致的,近似的HASH值的公文的从头到尾的经过自然是完全相近(尽管文件名分裂).

HASH值还大概有文件校验的机能,约等于文件的校验码. 所以仍是可以够用来检查文件下载是不是科学(举个例子大家在下载系统镜像或任何开源软件时,官方网站都会提供文件的HASH值,让大家经过对照HASH值来决断文件是或不是被涂更正)。

文本的Hash值在下载文件的校验方面有不小的用处,Hash值是文本内容的通过二进制码进行一体系的转换生成出来的,尽管文件名发生变化,Hash的值也不会产生转移。由此在开荒的进度中平时相比较八个文本是或不是风流罗曼蒂克律都是去相比四个公文的Hash值。

 

php中CRC32的用法:

MD5

爱尔兰语全称Message-Digest Algorithm(新闻摘要算法)

在下载一下事物时,平常在有个别调整和收缩包属性里,见到md5值。而且那么些下载页面,很恐怕会在某多少个地点,写了一句,此文件的MD5值为XXXXXXXXX。这有何样作用吗?

白话白话:md5,其实正是一中算法。能够将一个字符串,或文件,或压缩包,实施md5后,就能够生成两个牢固长度为128bit的串。那个串,基本上是天下第一的。

所以,有人修过压缩包后,就能转换新的串,当时就足以拿网站提供的串和新生成的串相比,倘使分裂,那正是被人修过过了。

越来越多请查看: /

 

crc32 — 总结三个字符串的 crc32 多项式

CRC

循环冗余校验(英语:Cyclic redundancy check,通称“CRC”卡塔 尔(英语:State of Qatar)是意气风发种依照互联网数据包或微电脑文件等数码发生简短固定位数校验码的黄金时代种散列函數,重要用来检验或校验数据传输只怕封存后大概现身的失实。生成的数字在传输恐怕存款和储蓄以前计算出来何况附加到多少背后,然后选用方进行视察鲜明数据是不是发生变化。常常的话,循环冗余校验的值都以33个人的整数。由于本函数易于用二进制的计算机硬件利用、轻易举行数学解析况兼越来越专长检测传输通道烦闷引起的错误,因而获得遍布应用。此方是由W. Wesley Peterson于1961年发表

 

生成 string 参数的 32 位循环冗余校验码多项式……:

HashHelper

上边二个C#本子的工具类,首要效能是计算文件Hash,文件MD5,文件的CRC32

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

那句话从斯拉维尼亚语翻译过来的,不正确,正确的说应该是这么清楚:

以32个人循环冗余校验多项式算法,来总括三个字符串,重返一个(恐怕带符号的卡塔尔整数。

应用方式:

本条函数的功力看似于md5算法、sha1算法加密。那么些函数的应用进程中,要求多着想取回来的寸头的断然值就能够了。

关于怎可以做到检查传输的多寡是或不是完好:

参照md5的广大使用情形。

三十五个人循环冗余校验多项式:这一个是贰个数学算法,在php的源码内得以看来。你能够视作他是叁个md5算法的数字版。

平时常有人问,说CRC、MD5、SHA1都以测算叁个校验值的,到底有啥差距

相同点:

CRC、MD5、SHA1都以由此对数据实行总计,来生成叁个校验值,这个学院验值用来校验数据的完整性。

不同点:

  1. 算法分歧。CRC采取多项式除法,MD5和SHA1应用的是替换、轮转等办法;

2. 校验值的长短分歧。CRC校验位的长短跟其多项式有关联,经常为十五个人或三拾伍位;MD5是十四个字节(1二十八个人卡塔尔国;SHA1是贰十二个字节(1陆十五人卡塔尔;

3. 校验值的称为分歧。CRC日常叫做CRC值;MD5和SHA1日常叫做哈希值(Hash卡塔 尔(英语:State of Qatar)或散列值;

4. 安全性分歧。这里的安全性是指检错的工夫,即数据的失实能通过校验位检查评定出来。CRC的安全性跟多项式有不小关系,相对于MD5和SHA1要弱比很多;MD5的安全性极高,可是大致在04年的时候被山东北大学学的王小云破解了;SHA1的安全性最高。

  1. 频率区别,CRC的计量作用超级高;MD5和SHA1异常慢。

6. 用处分化。CRC经常作为通讯数据的校验;MD5和SHA1用于安全(Security卡塔尔领域,举例文件校验、数字签字等。

TAG标签:
版权声明:本文由32450新蒲京网站发布于葡萄游戏厅_棋牌游戏,转载请注明出处:CRC与MD5的异同