• 技术文章 >Java >java教程

    如何使用java 3DES加解密

    php中世界最好的语言php中世界最好的语言2018-06-04 13:36:43原创1623
    这次给大家带来如何使用java 3DES加解密,使用java 3DES加解密的注意事项有哪些,下面就是实战案例,一起来看一下。

    <pre name="code" class="java">Java写的加密解密算法及调用范例
    
    1、.JAVA算法范例
    
    package Common.JUtility;
    
     
    
    import javax.crypto.*;
    
    import javax.crypto.spec.SecretKeySpec;
    
    import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
    
     
    
    public class EncryptUtils {
    
     
    
        /// <summary>
    
        /// 3des解码
    
        /// </summary>
    
        /// <param name="value">待解密字符串</param>
    
        /// <param name="key">原始密钥字符串</param>
    
        /// <returns></returns>
    
        public static String Decrypt3DES(String value, String key) throws Exception {
    
            byte[] b = decryptMode(GetKeyBytes(key), Base64.decode(value));
    
            return new String(b);
    
        }
    
     
    
        /// <summary>
    
        /// 3des加密
    
        /// </summary>
    
        /// <param name="value">待加密字符串</param>
    
        /// <param name="strKey">原始密钥字符串</param>
    
        /// <returns></returns>
    
        public static String Encrypt3DES(String value, String key) throws Exception {
    
            String str = byte2Base64(encryptMode(GetKeyBytes(key), value.getBytes()));
    
            return str;
    
        }
    
     
    
        //计算24位长的密码byte值,首先对原始密钥做MD5算hash值,再用前8位数据对应补全后8位
    
        public static byte[] GetKeyBytes(String strKey) throws Exception {
    
            if (null == strKey || strKey.length() < 1)
    
                throw new Exception("key is null or empty!");
    
     
    
            java.security.MessageDigest alg = java.security.MessageDigest.getInstance("MD5");
    
            alg.update(strKey.getBytes());
    
            byte[] bkey = alg.digest();
    
            System.out.println("md5key.length=" + bkey.length);
    
            System.out.println("md5key=" + byte2hex(bkey));
    
            int start = bkey.length;
    
            byte[] bkey24 = new byte[24];
    
            for (int i = 0; i < start; i++) {
    
                bkey24[i] = bkey[i];
    
            }
    
            for (int i = start; i < 24; i++) {//为了与.net16位key兼容
    
                bkey24[i] = bkey[i - start];
    
            }
    
     
    
            System.out.println("byte24key.length=" + bkey24.length);
    
            System.out.println("byte24key=" + byte2hex(bkey24));
    
            return bkey24;
    
        }
    
     
    
        private static final String Algorithm = "DESede"; //定义 加密算法,可用 DES,DESede,Blowfish       
    
     
    
        //keybyte为加密密钥,长度为24字节
    
        //src为被加密的数据缓冲区(源)  
    
        public static byte[] encryptMode(byte[] keybyte, byte[] src) {
    
            try {
    
                //生成密钥
    
                SecretKey deskey = new SecretKeySpec(keybyte, Algorithm); //加密 
    
                Cipher c1 = Cipher.getInstance(Algorithm);
    
                c1.init(Cipher.ENCRYPT_MODE, deskey);
    
                return c1.doFinal(src);
    
           } catch (java.security.NoSuchAlgorithmException e1) {
    
                e1.printStackTrace();
    
            } catch (javax.crypto.NoSuchPaddingException e2) {
    
                e2.printStackTrace();
    
            } catch (java.lang.Exception e3) {
    
                e3.printStackTrace();
    
            }
    
            return null;
    
        }
    
     
    
        //keybyte为加密密钥,长度为24字节  
    
        //src为加密后的缓冲区
    
        public static byte[] decryptMode(byte[] keybyte, byte[] src) {
    
            try { //生成密钥   
    
                SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);
    
                //解密     
    
                Cipher c1 = Cipher.getInstance(Algorithm);
    
                c1.init(Cipher.DECRYPT_MODE, deskey);
    
                return c1.doFinal(src);
    
            } catch (java.security.NoSuchAlgorithmException e1) {
    
                e1.printStackTrace();
    
            } catch (javax.crypto.NoSuchPaddingException e2) {
    
                e2.printStackTrace();
    
            } catch (java.lang.Exception e3) {
    
                e3.printStackTrace();
    
            }
    
            return null;
    
        }
    
     
    
        //转换成base64编码
    
        public static String byte2Base64(byte[] b) {
    
            return Base64.encode(b);
    
        }
    
     
    
        //转换成十六进制字符串  
    
        public static String byte2hex(byte[] b) {
    
            String hs = "";
    
            String stmp = "";
    
            for (int n = 0; n < b.length; n++) {
    
                stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
    
                if (stmp.length() == 1)
    
                    hs = hs + "0" + stmp;
    
                else
    
                    hs = hs + stmp;
    
                if (n < b.length - 1)
    
                    hs = hs + ":";
    
            }
    
            return hs.toUpperCase();
    
        }
    
    }
    
     
    
    2、JAVA 算法调用范例
    
    package test.com;
    
     
    
    import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
    
    import Common.JUtility.EncryptUtils;//用原始密钥经MD5转换和补位后的新密钥来做3DES加密解密
    
     
    
    public class Test3DES {
    
       
    
        public static void main(String[] args) {
    
            String key = "abcd1234";
    
            String password = "password";
    
            System.out.println("key=" + key + ",password=" + password);
    
            System.out.println();
    
            System.out.println("----------示例开始:使用java写的算法加密解密-----------");
    
           try {
    
                String encrypt = "";
    
                String decrypt = "";
    
               byte[] bkey = EncryptUtils.GetKeyBytes(key);
    
                encrypt = EncryptUtils.byte2Base64(EncryptUtils.encryptMode(bkey, password.getBytes()));
    
                System.out.println("用预转换密钥算加密结果=" + encrypt);
    
                System.out.println("加密后base64表示=" + EncryptUtils.byte2hex(Base64.decode(encrypt)));
    
                System.out.println("调用原始密钥算加密结果=" + EncryptUtils.Encrypt3DES(password, key));
    
     
    
               try {
    
                    decrypt = new String(EncryptUtils.decryptMode(bkey, Base64.decode(encrypt)));
    
                    System.out.println("用预转换密钥算解密结果=" + decrypt);
    
                    System.out.println("调用原始密钥算解密结果=" + EncryptUtils.Decrypt3DES(encrypt, key));
    
                } catch (Exception ex) {
    
                    System.out.println("Exception:" + ex.getMessage());
    
                }
    
            } catch (Exception ex) {
    
                System.out.println("Exception:" + ex.getMessage());
    
            }
    
            System.out.println("----------示例结束:使用java写的算法加密解密-----------");
    
        }
    
    }
    
     
    
    3、(7)的运算结果
    
    key=abcd1234,password=password
    
     
    
    ----------示例开始:使用java写的算法加密解密-----------
    
    md5key.length=16
    
    md5key=E1:9D:5C:D5:AF:03:78:DA:05:F6:3F:89:1C:74:67:AF
    
    byte24key.length=24
    
    byte24key=E1:9D:5C:D5:AF:03:78:DA:05:F6:3F:89:1C:74:67:AF:E1:9D:5C:D5:AF:03:78:DA
    
    用预转换密钥算加密结果=ftwPzxFH4WpzT4Orq8uSLQ==
    
     
    
    加密后base64表示=7E:DC:0F:CF:11:47:E1:6A:73:4F:83:AB:AB:CB:92:2D
    
    md5key.length=16
    
    md5key=E1:9D:5C:D5:AF:03:78:DA:05:F6:3F:89:1C:74:67:AF
    
    byte24key.length=24
    
    byte24key=E1:9D:5C:D5:AF:03:78:DA:05:F6:3F:89:1C:74:67:AF:E1:9D:5C:D5:AF:03:78:DA
    
    调用原始密钥算加密结果=ftwPzxFH4WpzT4Orq8uSLQ==
    
     
    
    用预转换密钥算解密结果=password
    
    md5key.length=16
    
    md5key=E1:9D:5C:D5:AF:03:78:DA:05:F6:3F:89:1C:74:67:AF
    
    byte24key.length=24
    
    byte24key=E1:9D:5C:D5:AF:03:78:DA:05:F6:3F:89:1C:74:67:AF:E1:9D:5C:D5:AF:03:78:DA
    
    调用原始密钥算解密结果=password
    
    ----------示例结束:使用java写的算法加密解密-----------

    相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

    推荐阅读:

    移动端WEB开发中click,touch,tap事件使用详解

    REM相对单位使用案例分享

    以上就是如何使用java 3DES加解密的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:3DES java 解密
    上一篇:Java编码规范(常用重点) 下一篇:Java的五个条件语句练习题
    Web大前端开发直播班

    相关文章推荐

    • 完全掌握Java单例模式• JAVA详细解析之IO流、File、字节流以及字符流• 图文详解!java中锁的整理总结• JAVA学习IO操作之字节流和字符流(总结分享)• JAVA面向对象之继承、构造方法、重写和重载(总结分享)

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网