java实现MD5加密算法和SHA-1加密算法比较

MD5和SHA-1加密算法实现:
步骤一:首先定义一个算法接口类

/**
 * 
 */
package com.client;

public interface IMessageDigest {

    /**
     * 生成摘要
     * @param src
     * @return
     */
    public String genMessageDigest(byte[] src) throws Exception;
    /**
     * 摘要的较验
     * @param src
     * @param dest
     * @return
     */
    public boolean validateMessageDigest(byte[] src,String dest) throws Exception;

}

步骤二:定义一个通用转十六进制工具类

package com.client;

import java.security.KeyPair;
import java.security.KeyPairGenerator;

public class ToolsUtil {
       /**
     * Converts a byte array to hex string.
     * 
     * @param b -
     *            the input byte array
     * @return hex string representation of b.
     */

    public static String toHexString(byte[] b) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < b.length; i++) {
            sb.append(ToolsUtil.HEX_CHARS.charAt(b[i] >>> 4 & 0x0F));
            sb.append(ToolsUtil.HEX_CHARS.charAt(b[i] & 0x0F));
        }
        return sb.toString();
    }

    /**
     * Converts a hex string into a byte array.
     * 
     * @param s -
     *            string to be converted
     * @return byte array converted from s
     */
    public static byte[] toByteArray(String s) {
        if(s.length() % 2 != 0 ) return new byte[s.length()/2];
        byte[] buf = new byte[s.length() / 2];
        int j = 0;
        for (int i = 0; i < buf.length; i++) {
            buf[i] = (byte) ((Character.digit(s.charAt(j++), 16) << 4) | Character
                    .digit(s.charAt(j++), 16));
        }
        return buf;
    }

    private static final String HEX_CHARS = "0123456789abcdef";





    /**
     * 生成密钥对
     * @param algname
     * @return
     * @throws Exception
     */
    KeyPair genPairKey(String algname,int length)throws Exception {

        KeyPairGenerator kp = KeyPairGenerator.getInstance(algname);
        kp.initialize(length);

        KeyPair keys= kp.genKeyPair();
        return keys;

    }

}

步骤三:定义一个加密算法通用接口实现抽象类

package com.client;

import java.security.MessageDigest;

public abstract class AbstractMessageDigestImpl implements IMessageDigest {

    public abstract String getAlgname();

    public String genMessageDigest(byte[] src) throws Exception {
        MessageDigest md = MessageDigest.getInstance(getAlgname());
        return ToolsUtil.toHexString(md.digest(src));
    }

    public boolean validateMessageDigest(byte[] src, String dest)
            throws Exception {
        String mdes = genMessageDigest(src);
        return MessageDigest.isEqual(ToolsUtil.toByteArray(mdes),
                ToolsUtil.toByteArray(dest));
    }

}

步骤四:MD5算法实现

package com.client;


public class MD5MessageDigestImple extends AbstractMessageDigestImpl {

    private static final String algname="MD5";


    public static void main(String[] args){
        MD5MessageDigestImple it = new MD5MessageDigestImple();

        byte[] cltxt = "123abc中国".getBytes();
        String mtxt = null;
        boolean re;
        try{
            mtxt = it.genMessageDigest(cltxt);
            re=it.validateMessageDigest(cltxt, mtxt);
            System.out.println(re);
        }catch(Exception e){
            e.printStackTrace();
        }
    }




    @Override
    public String getAlgname() {
        // TODO Auto-generated method stub
        return "MD5";
    }

}

步骤六:SHA-1算法实现

/**
 * 
 */
package com.client;


public class SHAMessageDigestImpl extends AbstractMessageDigestImpl {

    private final String algname ="SHA-1"; 
    /* (non-Javadoc)
     */

    @Override
    public String getAlgname() {
        return "SHA-1";
    }


    public static void main(String[] args){
        SHAMessageDigestImpl it = new SHAMessageDigestImpl();

        byte[] cltxt = "123abc中国".getBytes();
        String mtxt = null;
        boolean re;
        try{
            mtxt = it.genMessageDigest(cltxt);
            System.out.println(mtxt.length());
            re=it.validateMessageDigest(cltxt, mtxt);
            System.out.println(re);
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

步骤七:main方法验证MD5和SHA-1加密算法

/**
 * 
 */
package com.test;

//import com.client.MD5BaseAlgorithms;
import com.client.MD5MessageDigestImple;
import com.client.SHAMessageDigestImpl;

public class TestMain {

    /**
     * @param args
     * @throws Exception 
     */
    public static void main(String[] args) throws Exception {

        MD5MessageDigestImple md5MessageDigestImple = new MD5MessageDigestImple() ;

        System.out.println("md5加密算法:" + md5MessageDigestImple.genMessageDigest("asdfasdf".getBytes()));

        SHAMessageDigestImpl shaMessageDigestImpl = new SHAMessageDigestImpl() ;

        System.out.println("SHA-1加密算法:" + shaMessageDigestImpl.genMessageDigest("asdfasdf".getBytes()));
    }
}

步骤八:查看比较MD5和SHA-1加密算法所得到的结果,MD5加密算法得到32位密串, SHA-1加密算法得到40位密串。

md5加密算法:6a204bd89f3c8348afd5c77c717a097a
SHA-1加密算法:92429d82a41e930486c6de5ebda9602d55c39986

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值