0
点赞
收藏
分享

微信扫一扫

摘要算法(MD5、SHA、CRC)

小_北_爸 2022-02-22 阅读 60

文章目录

MD5

  • MD5用的是哈希函数,典型的应用是对一段信息产生信息摘要,以防止被酸钙
  • 无论多长的输入,MD5算法都会输出一个128位的一个串(通常用16进制表示位32个字符)

代码实现

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位的消息摘要

代码实现

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()));
    }
}

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

举报

相关推荐

0 条评论