摘要算法(MD5、SHA、CRC)

文章目录

MD5

  • MD5用的是哈希函数,典型的应用是对一段信息产生信息摘要,以防止被篡改
  • 无论多长的输入,MD5算法都会输出一个128位的一个串(通常用16进制表示为32个字符)
  • 我们大致的了解一下MD5的算法流程
    • MD5算法将输入的信息进行分组,每组512位(64字节),顺序处理完所有分组后输出128位结果
    • 在每一组消息的处理中,都要进行4轮,每轮16步
    • (1)进行数据填充整理:将要加密的二进制数据对512取模,得到的结果如果不足448位则进行补足,补足方式是第一位填充1,后面全部填充0
    • (2)记录数据长度:经过第一步数据整理后数据的位数可以表示为N*512+448,再向后追加64位用于存储数据长度(以字节为单位),填充后,数据的位数将变为(N+1)*512,如果消息的长度大于2^64,则只使用其低64位进行填充
    • (3)数据处理:MD5的实现需要每512字节就进行一次处理,后一次处理的输入为前一次处理的输出,因此,在循环处理开始前,需要4个链接变量作为输入,它们分别是:int A=0x67452301,B=0xefcdab89,C=0x98badcfe,D=0x10325476
    • (4)进行N轮循环处理,将最后结果输出:这一步是每轮数据的处理算法,每一轮处理也要循环64次,这64次循环又分为4组(每16次循环为1组),每组循环使用不同的逻辑处理函数,处理完成后,将输出作为下一轮循环的输入
      • 具体运算使用到了4个逻辑函数F、G、H、I,分别对应4轮运算(每轮再进行16次操作),每轮循环都很相似,首先将四个链接变量复制到另外四个变量中:A到a,B到b,C到c,D到d
      • 第一轮的16次操作中,每次操作对a、b、c和d中的其中三个做一次非线性函数运算,然后将所得结果加上第四个变量,一个子分组和一个常数。
      • 再将所得的结果向右环移一个不定的数,再加上a,b,c或d中之一,最后再用该结果取代a、b、c或d中之一
    • (5)输出结果:当全部信息处理完成后,将A、B、C、D分别加上a、b、c、d。然后用下一分组数据继续运行算法,最后输出的是A、B、C和D的级联,当全部分组的数据都处理完成后,将结果级联,即得到MD5处理的结果

java代码MD5加密

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;

//MD5加密
public class MD5 {
    public static void main(String[] args) {
        try {
            //MessageDigest 为应用程序提供信息摘要算法
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            String secret = "dean";
            byte[] secret_bytes = secret.getBytes(StandardCharsets.UTF_8);
            byte[] digest = md5.digest(secret_bytes);
            StringBuilder res = new StringBuilder();
            //将字节转换为16进制
            for (byte b : digest) {
                String row = Integer.toHexString(b & 0xff);
                if (row.length() == 1) {
                    row = "0" + row;
                }
                res.append(row);
            }
            System.out.println("加密后密文:"+res);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

输出如下:
在这里插入图片描述

SHA1

  • SHA1被称为安全哈希算法,SHA1比MD5更复杂,所以也更加安全
  • 对于长度小于2^64位的消息,SHA1会产生160位的消息摘要
  • SHA1的哈希算法流程
    • (1)将512位的明文划分位16个子明文分组,每个子明文分组为32位
    • (2)申请5个32位的链接变量(和MD5类似),记为A、B、C、D、E
    • (3)16份子明文分组扩展位80份
    • (4)80份子明文分组进行4轮运算
    • (5)链接变量与初始链接变量进行求和运算
    • (6)链接变量作为下一个明文分组的输入重复进行以上操作
    • (7)最后,5个链接变量中的数据就是SHA1的摘要
      代码实现
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;

public class SHA {
    public static void main(String[] args) {
        try {
            MessageDigest sha1 = MessageDigest.getInstance("SHA1");
            String secret = "dean";
            byte[] secret_bytes = secret.getBytes(StandardCharsets.UTF_8);
            //加密
            byte[] digest = sha1.digest(secret_bytes);
            System.out.println("共"+digest.length+"字节");
            //将密文解析为16进制
            StringBuilder res = new StringBuilder();
            for (byte b : digest) {
                String row = Integer.toHexString(b & 0xff);
                if (row.length() == 1) {
                    row = "0" + row;
                }
                res.append(row);
            }
            System.out.println("加密后密文:"+res);

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

输出如下:
在这里插入图片描述

CRC

  • 全称是循环冗余校验
  • 特色是检错能力极强,开销小
  • 具体计算举个例子说明:
    在这里插入图片描述
    这个式子表达的是用CRC4计算二进制序列10110011的校验码
    CRC4其实是个多项式G(x)=X^4+ X^3+1,可以看做是 1*2^4+1*2^3+0*2^2+0*2^1+1*2^0,取系数则为11001
    因为五位多项式可以生成四位校验码,所以二进制序列后加了四个0,最终异或得到的0100即校验码
    用0100替换原始二进制序列中的四个0得到的新帧101100110100会被发给接收端,接收端用新帧再除11001来验证余数是否为0,若为0,则说明没有出现差错,否则出现了差错

java中提供了CRC32的工具进行加密校验

import java.nio.charset.StandardCharsets;
import java.util.zip.CRC32;

public class CRC {
    public static void main(String[] args) {
        CRC32 crc32 = new CRC32();
        String secret = "dean";
        //加密
        crc32.update(secret.getBytes(StandardCharsets.UTF_8));
        System.out.println(Long.toHexString(crc32.getValue()));
    }
}

加密后结果如下
在这里插入图片描述

三种区别

  • 以上三种加密算法都是通过对数据计算,来生成一个校验值,然后用该校验值来完成对数据完整性的校验
  • 不同之处在于:
    • 算法不同:CRC采用的是多项式除法、MD5和SHA1使用的是替换、轮转等方法
    • 校验长度不同,CRC的校验位长度与其多项式相关,一般为16位或32位,MD5一般是32个字节或16个字节(其实是截取32字节中的16字节),SHA1是20个字节
    • 校验值的称呼不同,CRC一般叫做CRC值;MD5和SHA1一般叫做哈希值或散列值
    • 安全性不同,这里的安全性指的是检错的能力,CRC的安全性和多项式相关,相对于MD5和SHA1要弱很多,MD5的安全性较高,SHA1的安全性最高
    • 效率不同,CRC的计算效率很高,MD5和SHA1比较慢
    • 用途不同,CRC一般用作通信数据的校验,MD5和SHA1用于安全领域,比如文件校验,数字签名等
    • ps:CRC意在检测数据是否被意外更改,通常用于网络和存储设备,该算法的目的不是为了防止故意篡改,而是要捕捉网络错误和磁盘写入错误等事故,所以该算法的重点在于速度,而不是安全性
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
crc32这几种算法的区别是什么?这些算法中哪个算法的速度更快? SHA256、MD5CRC32都是常见的摘要算法,用于计算数据的哈希值。它们在功能和应用上有一些区别。 SHA256是Secure Hash Algorithm 256-bit的缩写,它是一种安全性更高的哈希算法SHA256产生的哈希值长度为256位,更长的哈希值使得碰撞(两个不同的输入产生相同的哈希值)的可能性更低,因此它更适合用于验证文件的完整性和安全性。然而,由于其更复杂的计算过程,SHA256的速度相对较慢。 MD5是Message Digest Algorithm 5的缩写,它是一种较早的哈希算法MD5产生的哈希值长度为128位,相对于SHA256来说较短。虽然MD5在速度方面比SHA256快,但是由于其较短的哈希值长度以及已知的安全漏洞,它已被认为是不安全的,不建议用于安全性要求较高的场景。 CRC32是Cyclic Redundancy Check的缩写,它是一种用于错误检测的校验算法。与SHA256和MD5不同,CRC32不是为了安全性而设计的。它主要用于检测数据传输中的错误,并且计算速度非常快。然而,CRC32的哈希值长度只有32位,因此不能用于数据完整性的验证。 综上所述,SHA256在安全性方面更好,但速度较慢;MD5在速度方面较快,但安全性较差;而CRC32主要用于错误检测,并且速度非常快。选择哪种算法取决于具体的应用需求,如果需要较高的安全性,应选择SHA256;如果对安全性要求不高但需要快速计算哈希值,可以选择MD5;如果仅需简单的错误检测,并且追求最快的速度,则可以选择CRC32。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值