ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

MD5加密算法

2022-02-28 20:02:24  阅读:152  来源: 互联网

标签:进制 0000 String 16 num byte 加密算法 MD5


方式一:容易懂

public class MD5Util {

    private MD5Util() {
    }

    public static String md5(String sourceStr) {

        Objects.requireNonNull(sourceStr);
        StringBuilder builder = new StringBuilder();
        try {
            MessageDigest messageDigest = MessageDigest.getInstance("MD5");
            messageDigest.update(sourceStr.getBytes());
            byte[] bytes = messageDigest.digest();
            for (byte aByte : bytes) {
                builder.append(byteToHex(aByte));
            }
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return builder.toString().toUpperCase();
    }

    private static final char[] array = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};

    private static String byteToHex(byte aByte) {
        int num = aByte;
        //将负数转换为正数。采用16进制无符号数表示。
        //-128~127    0~255
        if (num < 0) {
            num += 256;
        }
        //每个字节8bit,16进制数字占4bit
        //所以一个字节表示两个16进制数
        //将前四个位取出来为一个16进制数
        int low = num / 16;
        //将后四位取出来转换为16进制数
        int high = num % 16;
        return array[low] + "" + array[high];
    }
}

方式二:xue微难懂

public class MD5Util {
    public static String MD5(String strs) {
        /*
         * 加密需要使用JDK中提供的类
         */
        StringBuffer sb = new StringBuffer();
        try {
            MessageDigest digest = MessageDigest.getInstance("MD5");
            byte[] bs = digest.digest(strs.getBytes());
            /*
             * 加密后的数据是-128 到 127 之间的数字,这个数字也不安全。 取出每个数组的某些二进制位进行某些运算,得到一个新的加密结果
             *
             * 0000 0011 0000 0100 0010 0000 0110 0001 &0000 0000 0000 0000 0000
             * 0000 1111 1111 --------------------------------------------- 0000
             * 0000 0000 0000 0000 0000 0110 0001
             *
             * 把取出的数据转成十六进制数
             */
            for (byte b : bs) {
                //将负数转化为正数,就是+255
                int x = b & 255;
                //将转换后的整数变为16进制无符号数字的字符串形式
                String s = Integer.toHexString(x);
                //如果x<16说明16进制数不够进位,又因为每字节会转换成2位16进制数,所以高位要补0
                if (x < 16) {
                    sb.append("0");
                }
                sb.append(s);
            }

        } catch (Exception e) {
            System.out.println("加密失败");
        }
        return sb.toString();
    }

    //测试
    public static void main(String[] args) {
        String s = MD5Util.MD5("qqw11111111111123456");
        System.out.println(s);
    }
}

 

标签:进制,0000,String,16,num,byte,加密算法,MD5
来源: https://www.cnblogs.com/shpen/p/15947222.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有