美文网首页
java 各加密算法示例(上)

java 各加密算法示例(上)

作者: wyc0859 | 来源:发表于2021-05-02 13:40 被阅读0次

    BASE64、MD、SHA都常用3种算法

    1、jdk(不推荐)
    2、commonsCodec (其实就是用JDK,但简化了操作)【推荐】
    3、Bouncy Castle (对JDK的补充,丰富了一些功能)

    Base64的3种算法

    import java.io.IOException;
    import org.apache.tomcat.util.codec.binary.Base64;
    import sun.misc.BASE64Decoder;
    import sun.misc.BASE64Encoder;
    import org.junit.jupiter.api.Test;
    
    public class optest {
        private static String src = "ruhuashop.com";  
        @Test
        public void index() {
            System.out.println("开始");
            jdkBase64();
            System.out.println("-------------------------------");
            commonsCodesBase64();
            System.out.println("-------------------------------");
            bouncyCastleBase64();
        }
    
        public void jdkBase64() {
            try {
                BASE64Encoder encoder = new BASE64Encoder();
                String encode = encoder.encode(src.getBytes());
                System.out.println("encode : " + encode);
                BASE64Decoder decoder = new BASE64Decoder();
                System.out.println("decode : " + new String(decoder.decodeBuffer(encode)));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        public void commonsCodesBase64() {
            byte[] encodeBytes = Base64.encodeBase64(src.getBytes());
            System.out.println("encode : " + new String(encodeBytes));
            byte[] decodeBytes = Base64.decodeBase64(encodeBytes);
            System.out.println("decode : " + new String(decodeBytes));
        } 
        public void bouncyCastleBase64() {
            byte[] encodeBytes = org.bouncycastle.util.encoders.Base64.encode(src.getBytes());
            System.out.println("encode : " + new String(encodeBytes));
            byte[] decodeBytes = org.bouncycastle.util.encoders.Base64.decode(encodeBytes);
            System.out.println("decode : " + new String(decodeBytes));
        }
    }
    

    bouncyCastle需maven引入:

     <dependency>
                <groupId>org.bouncycastle</groupId>
                <artifactId>bcprov-jdk15on</artifactId>
                <version>1.49</version> 
            </dependency>
    

    MD算法; MD2、MD4、MD5

    import org.apache.commons.codec.digest.DigestUtils;
    import org.bouncycastle.crypto.Digest;
    import org.bouncycastle.crypto.digests.MD4Digest;
    import org.bouncycastle.crypto.digests.MD5Digest;
    import org.bouncycastle.jce.provider.BouncyCastleProvider;
    import org.junit.jupiter.api.Test;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.security.Security;
    
    import org.apache.commons.codec.binary.Hex;
    
    public class optest2 {
        private static String src = "ruhuashop.com"; 
        @Test
        public void index() {
            System.out.println("开始");
            jdkMD5();
            System.out.println("-------------------------------");
            jdkMD2();
            System.out.println("-------------------------------");
            bcMD5();
            System.out.println("-------------------------------");
            bcMD4();
            System.out.println("-------------------------------");
            ccMD5();
            System.out.println("-------------------------------");
            ccMD2();
        }
    
        public void jdkMD5() {
            try {
                MessageDigest md = MessageDigest.getInstance("MD5");
                byte[] md5Bytes = md.digest(src.getBytes());
                System.out.println("JDK MD5 : " + Hex.encodeHexString(md5Bytes));
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
        }
        public static void jdkMD2() {
            try {
                MessageDigest md = MessageDigest.getInstance("MD2");
                byte[] md2Bytes = md.digest(src.getBytes());
                System.out.println("JDK MD2 : " + Hex.encodeHexString(md2Bytes));
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
        }
    
        public void bcMD5() {
            Digest digest = new MD5Digest();
            digest.update(src.getBytes(), 0, src.getBytes().length);
            byte[] md5Bytes = new byte[digest.getDigestSize()];
            digest.doFinal(md5Bytes, 0);
            System.out.println("BC MD5 : " + org.bouncycastle.util.encoders.Hex.toHexString(md5Bytes));
        }
        // 复制上面的bc md5方法改为md4也是可以运行的;另一种bc md4方法
        public void bcMD4() {
            try {
                Security.addProvider(new BouncyCastleProvider());
                MessageDigest md = MessageDigest.getInstance("MD4");
                byte[] md5Bytes = md.digest(src.getBytes());
                System.out.println("BC MD4 : " + Hex.encodeHexString(md5Bytes));
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
        }
    
        //import org.apache.commons.codec.digest.DigestUtils;
        public void ccMD5() {
            System.out.println("CC MD5 : " + DigestUtils.md5Hex(src.getBytes()));
        }
        public void ccMD2() {
            System.out.println("CC MD2 : " + DigestUtils.md2Hex(src.getBytes()));
        }
    }
    

    commons.codec需maven引入:

    <dependency>
                <groupId>org.apache.directory.studio</groupId>
                <artifactId>org.apache.commons.codec</artifactId>
                <version>1.8</version>
    </dependency>
    

    SHA的3种算法

    package com.example.sha;
    
    import org.apache.commons.codec.binary.Hex;
    import org.apache.commons.codec.digest.DigestUtils;
    import org.bouncycastle.crypto.Digest; 
    import org.bouncycastle.crypto.digests.SHA1Digest;
    import org.bouncycastle.crypto.digests.SHA224Digest; 
    import org.junit.jupiter.api.Test;
    
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException; 
    
    public class optest3 {
        private static String src = "ruhuashop.com";
    
    
        @Test
        public void index() {
            System.out.println("开始");
            jdkSHA1();
            System.out.println("-------------------------------");
            bcSHA1();
            System.out.println("-------------------------------");
            bcSHA224();
            System.out.println("-------------------------------");
            ccSHA1();
        }
    
        public void jdkSHA1() {
            try {
                MessageDigest md = MessageDigest.getInstance("SHA");
                md.update(src.getBytes());
                System.out.println("jdk sha-1 : " + Hex.encodeHexString(md.digest()));
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
        }
    
        public void bcSHA1() {
            Digest digest = new SHA1Digest();
            digest.update(src.getBytes(), 0, src.getBytes().length);
            byte[] sha1Bytes = new byte[digest.getDigestSize()];
            digest.doFinal(sha1Bytes, 0);
            System.out.println("bc sha-1 : " + org.bouncycastle.util.encoders.Hex.toHexString(sha1Bytes));
        }
    
        public static void bcSHA224() {
            Digest digest = new SHA224Digest();
            digest.update(src.getBytes(), 0, src.getBytes().length);
            byte[] sha224Bytes = new byte[digest.getDigestSize()];
            digest.doFinal(sha224Bytes, 0);
            System.out.println("bc sha-224 : " + org.bouncycastle.util.encoders.Hex.toHexString(sha224Bytes));
        }
    
        public static void ccSHA1() {
            System.out.println("cc sha1 - 1 :" + DigestUtils.sha1Hex(src.getBytes()));
            System.out.println("cc sha1 - 2 :" + DigestUtils.sha1Hex(src));
            System.out.println("cc sha256 :" + DigestUtils.sha256Hex(src));
        }
    }
    

    HMAC 含有密钥的散列函数算法; 融合MD、SHA

    只能由JDK或BC实现

        @Test
        public void index() {
            jdkHmacMD5();
            bcHmacMD5();
        }
    
        public static void jdkHmacMD5() {
            try {
                KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5");
                //初始化KeyGenerator
                SecretKey secretKey = keyGenerator.generateKey();//产生密钥
                // byte[] key = secretKey.getEncoded();//获得随机密钥
                byte[] key = Hex.decodeHex(new char[]{'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a'});//固定密钥
                SecretKey restoreSecretKey = new SecretKeySpec(key, "HmacMD5");   //还原密钥
                Mac mac = Mac.getInstance(restoreSecretKey.getAlgorithm());   //实例化MAC
                mac.init(restoreSecretKey);    // 初始化Mac
                byte[] hmacMD5Bytes = mac.doFinal(src.getBytes());//执行摘要
                System.out.println("jdk hmacMD5 : " + Hex.encodeHexString(hmacMD5Bytes));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public static void bcHmacMD5() {
            HMac hmac = new HMac(new MD5Digest());
            hmac.init(new KeyParameter(org.bouncycastle.util.encoders.Hex.decode("aaaaaaaaaa")));
            hmac.update(src.getBytes(), 0, src.getBytes().length);
            byte[] hmacMD5Bytes = new byte[hmac.getMacSize()];//执行摘要
            hmac.doFinal(hmacMD5Bytes, 0);
            System.out.println("bc hmacMD5 : " + org.bouncycastle.util.encoders.Hex.toHexString(hmacMD5Bytes));
        }
    

    其他加密算法:

    不常用的,如RipeMD、Tiger、Whirlpool、GOST3411 只能用Bouncy Castle实现

    相关文章

      网友评论

          本文标题:java 各加密算法示例(上)

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