美文网首页
MD5算法原理实现以及常用方法汇总

MD5算法原理实现以及常用方法汇总

作者: 程序员阿远 | 来源:发表于2022-06-13 21:04 被阅读0次
    image.png

    MD5加密简介

    哈希算法又称散列算法,是将任何数据转换成固定长度的算法的统称。 从本质上讲,MD5也是一种哈希算法,其输出是生成128位的输出结果。 如果输入两个不同的明文,就会输出两个不同的输出值,并且根据输出值,不能得到原始的明文,这个过程是不可逆的。

    MD5加密原理

    MD5算法对512位报文的输入信息进行处理,每个报文被分成16个32位报文。 经过一系列处理后,算法的输出由4个32位的数据包组成,这些数据包能联生成一个128位的哈希值。

    在MD5算法中,信息的填写方式是这样的:消息后面跟着一个1,然后是无数个0,直到512字节的剩余数等于448 (n*512) + 448。 为什么剩下的是448,因为剩下的512-448是64位,表示填充前的消息长度。 加上剩下的64位,(n+1)乘以512,也就是512的整数倍。

    然后循环通过link变量获得结果。 MD5包含四个32位整数参数,称为链接变量:A=0x01234567, B= 0x89ABCdef, C= 0xFeDCba98, D=0x76543210。 一旦设置好四个链接变量,算法就开始了四轮循环。 具体的内部计算是关于数学的。如果你感兴趣,你可以自己理解。这里没有更多的解释。

    MD5加密常用方法

     /**  
         * 用MD5算法进行加密  
         * @param str 需要加密的字符串  
         * @return MD5加密后的结果  
         * @throws UnsupportedEncodingException 
         */    
    public static String encodeMD5String(String str) {    
            return getMD5(str);
        }
    复制代码
    
     /**
         * MD5编码方法, 该方法存在漏洞,特殊情况下编码后的字符串只有31位长度
         * @param str
         * @param method
         * @return
         * @throws UnsupportedEncodingException
         */
    private static String encode(String str, String method) throws UnsupportedEncodingException {    
            MessageDigest md = null;    
            String dstr = null;    
            try {    
                md = MessageDigest.getInstance(method);    
                md.update(str.getBytes("UTF-8"));    
                dstr = new BigInteger(1, md.digest()).toString(16);    
            } catch (NoSuchAlgorithmException e) {    
                e.printStackTrace();    
            }    
            return dstr;    
        }
    复制代码
    
    /**
         * MD5编码方法
         * @param message
         * @return
         */
        public static String getMD5(String message) {  
            MessageDigest messageDigest = null;  
            StringBuffer md5StrBuff = new StringBuffer();  
            try {  
                messageDigest = MessageDigest.getInstance("MD5");  
                messageDigest.reset();  
                messageDigest.update(message.getBytes("UTF-8"));  
    
                byte[] byteArray = messageDigest.digest();  
                for (int i = 0; i < byteArray.length; i++)   
                {  
                    if (Integer.toHexString(0xFF & byteArray[i]).length() == 1)  
                        md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i]));  
                    else  
                        md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));  
                }  
            } catch (Exception e) {  
                throw new RuntimeException();  
            }  
            return md5StrBuff.toString().toUpperCase();//字母大写  
        } 
    复制代码
    
     /**
         * 加密
         * @param content
         * @return
         */
        public static String encrypt(String content) {
            String password = "12345678dd";
            byte[] encryptResult = encrypt(content, password);  
            String encryptResultStr = parseByte2HexStr(encryptResult);  
            return encryptResultStr;
        }
    复制代码
    
    /**
         * 加密
         * @param content
         * @param password
         * @return
         */
        public static String encryptStr(String content, String password) {
            byte[] encryptResult = encrypt(content, password);  
            return parseByte2HexStr(encryptResult);
        }
    复制代码
    
    /**
         * 解密
         * @param encryptResultStr
         * @return
         * @throws UnsupportedEncodingException
         */
        public static String decrypt(String encryptResultStr) throws UnsupportedEncodingException {
            String password = "12345678dd";
             byte[] decryptFrom = parseHexStr2Byte(encryptResultStr);  
             byte[] decryptResult = decrypt(decryptFrom, password);  
             // 解密内容进行解码  
             String result = new String(decryptResult, UTF8);  
             return result;
        }
    复制代码
    
    /**
         * 解密
         * @param encryptStr
         * @param password
         * @return
         * @throws UnsupportedEncodingException
         */
        public static String decryptStr(String encryptStr, String password) throws UnsupportedEncodingException {
            byte[] decryptFrom = parseHexStr2Byte(encryptStr);
            byte[] decryptResult = decrypt(decryptFrom, password);
            // 解密内容进行解码
            return new String(decryptResult, UTF8);
        }
    

    相关文章

      网友评论

          本文标题:MD5算法原理实现以及常用方法汇总

          本文链接:https://www.haomeiwen.com/subject/fvqamrtx.html