【java源码1004java源码】【源码在线使用教程】【exagear动态翻译源码】Java DES算法源码_java实现des算法

时间:2024-12-29 09:44:32 编辑:h5 2048源码 来源:mysql odbc 源码

1.如何用Java进行3DES加密解密
2.如何使用JAVA实现对字符串的DES加密和解密
3.java des加密后的算a实算法串比原字符串长

Java DES算法源码_java实现des算法

如何用Java进行3DES加密解密

       è¿™é‡Œæ˜¯ä¾‹å­ï¼Œç›´æŽ¥æ‹¿æ¥ç”¨å°±å¯ä»¥äº†ã€‚

       package com.nnff.des;

       import java.security.Security;

       import javax.crypto.Cipher;

       import javax.crypto.SecretKey;

       import javax.crypto.spec.SecretKeySpec;

       /*字符串 DESede(3DES) 加密

        * ECB模式/使用PKCS7方式填充不足位,目前给的密钥是位

        * 3DES(即Triple DES)是DES向AES过渡的加密算法(年,NIST将3-DES指定为过渡的

        * 加密标准),是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加

        * 密算法,其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的

        * 密钥,P代表明文,C代表密表,这样,

        * 3DES加密过程为:C=Ek3(Dk2(Ek1(P)))

        * 3DES解密过程为:P=Dk1((EK2(Dk3(C)))

        * */

       public class ThreeDes {

        /**

        * @param args在java中调用sun公司提供的3DES加密解密算法时,需要使

        * 用到$JAVA_HOME/jre/lib/目录下如下的4个jar包:

        *jce.jar

        *security/US_export_policy.jar

        *security/local_policy.jar

        *ext/sunjce_provider.jar

        */

        private static final String Algorithm = "DESede"; //定义加密算法,可用 DES,DESede,Blowfish

        //keybyte为加密密钥,长度为字节

        //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) {

        // TODO: handle exception

        e1.printStackTrace();

        }catch(javax.crypto.NoSuchPaddingException e2){

        e2.printStackTrace();

        }catch(java.lang.Exception e3){

        e3.printStackTrace();

        }

        return null;

        }

        //keybyte为加密密钥,长度为字节

        //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) {

        // TODO: handle exception

        e1.printStackTrace();

        }catch(javax.crypto.NoSuchPaddingException e2){

        e2.printStackTrace();

        }catch(java.lang.Exception e3){

        e3.printStackTrace();

        }

        return null;

        }

        //转换成十六进制字符串

        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();

        }

        public static void main(String[] args) {

        // TODO Auto-generated method stub

        //添加新安全算法,如果用JCE就要把它添加进去

        Security.addProvider(new com.sun.crypto.provider.SunJCE());

        final byte[] keyBytes = { 0x, 0x, 0x4F, 0x,

        (byte)0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x,

        (byte)0xCB,

        (byte)0xDD, 0x, 0x, 0x, 0x, 0x,

        (byte)0x, 0x, 0x, 0x,

        (byte)0xE2

        }; //字节的密钥

        String szSrc = "This is a 3DES test. 测试";

        System.out.println("加密前的字符串:" + szSrc);

        byte[] encoded = encryptMode(keyBytes,szSrc.getBytes());

        System.out.println("加密后的字符串:" + new String(encoded));

        byte[] srcBytes = decryptMode(keyBytes,encoded);

        System.out.println("解密后的字符串:" + (new String(srcBytes)));

        }

       }

如何使用JAVA实现对字符串的DES加密和解密

       /

**

        * ECB模式的des加密,以base的编码输出

        * @param message

        * @param key

        * @return

        * @throws Exception

        */

         public static String desEncrypt(String message, String key)throws Exception{

           // DES/ECB CBC CFB OFB /PKCS5Padding  NoPadding  åŠ å¯†/模式/填充

           Cipher cipher = Cipher.getInstance("DES");//默认就是 DES/ECB/PKCS5Padding

           DESKeySpec desKeySpec = new DESKeySpec(key.getBytes());

           SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");

           SecretKey secretKey = keyFactory.generateSecret(desKeySpec);

           cipher.init(1, secretKey);

          return new BASEEncoder().encode(cipher.doFinal(message.getBytes("UTF-8")));

         }

         /

**

          * ECB模式的des解密

          * @param message

          * @param key

          * @return

          * @throws Exception

          */

         public static String desDecrypt(String message, String key)throws Exception{

           Cipher cipher = Cipher.getInstance("DES");

           DESKeySpec desKeySpec = new DESKeySpec(key.getBytes());

           SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");

           SecretKey secretKey = keyFactory.generateSecret(desKeySpec);

           cipher.init(2, secretKey);

           return new String(cipher.doFinal(Base.decode(message)), "UTF-8");

         }

       ä½ è‡ªå·±å†™main方法测试一下,应该是没问题的

java des加密后的串比原字符串长

       DESPlus.java

       /

**

        * @author    李国庆

        * @company   leemenz (C) copyright

        * @time      Nov 1,   :: AM

        * @version   1.0.0.0

        * @package   com.des

        */

       package com.des;

       import java.security.*;

       import javax.crypto.*;

       public class DESPlus {

        private static String strDefaultKey = "national";

        private Cipher encryptCipher = null;

        private Cipher decryptCipher = null;

        /

**

         * 将byte数组转换为表示进制值的字符串, 如:byte[]{ 8,法源}转换为:, 和public static byte[]

         * hexStr2ByteArr(String strIn) 互为可逆的算a实算法java源码1004java源码转换过程

         *

         * @param arrB

         *            需要转换的byte数组

         * @return 转换后的字符串

         * @throws Exception

         *             本方法不处理任何异常,所有异常全部抛出

         */

        public static String byteArr2HexStr(byte[] arrB) throws Exception {

         int iLen = arrB.length;

         // 每个byte用两个字符才能表示,法源所以字符串的算a实算法源码在线使用教程长度是数组长度的两倍

         StringBuffer sb = new StringBuffer(iLen * 2);

         for (int i = 0; i < iLen; i++) {

          int intTmp = arrB[i];

          // 把负数转换为正数

          while (intTmp < 0) {

           intTmp = intTmp + ;

          }

          // 小于0F的数需要在前面补0

          if (intTmp < ) {

           sb.append("0");

          }

          sb.append(Integer.toString(intTmp, ));

         }

         return sb.toString();

        }

        /

**

         * 将表示进制值的字符串转换为byte数组, 和public static String byteArr2HexStr(byte[] arrB)

         * 互为可逆的法源exagear动态翻译源码转换过程

         *

         * @param strIn

         *            需要转换的字符串

         * @return 转换后的byte数组

         * @throws Exception

         *             本方法不处理任何异常,所有异常全部抛出

         * @author <a href="mailto:leo@.com">LiGuoQing</a>

         */

        public static byte[] hexStr2ByteArr(String strIn) throws Exception {

         byte[] arrB = strIn.getBytes();

         int iLen = arrB.length;

         // 两个字符表示一个字节,算a实算法所以字节数组长度是法源字符串长度除以2

         byte[] arrOut = new byte[iLen / 2];

         for (int i = 0; i < iLen; i = i + 2) {

          String strTmp = new String(arrB, i, 2);

          arrOut[i / 2] = (byte) Integer.parseInt(strTmp, );

         }

         return arrOut;

        }

        /

**

         * 默认构造方法,使用默认密钥

         *

         * @throws Exception

         */

        public DESPlus() throws Exception {

         this(strDefaultKey);

        }

        /

**

         * 指定密钥构造方法

         *

         * @param strKey

         *            指定的算a实算法密钥

         * @throws Exception

         */

        public DESPlus(String strKey) throws Exception {

         Security.addProvider(new com.sun.crypto.provider.SunJCE());

         Key key = getKey(strKey.getBytes());

         encryptCipher = Cipher.getInstance("DES");

         encryptCipher.init(Cipher.ENCRYPT_MODE, key);

         decryptCipher = Cipher.getInstance("DES");

         decryptCipher.init(Cipher.DECRYPT_MODE, key);

        }

        /

**

         * 加密字节数组

         *

         * @param arrB

         *            需加密的字节数组

         * @return 加密后的字节数组

         * @throws Exception

         */

        public byte[] encrypt(byte[] arrB) throws Exception {

         return encryptCipher.doFinal(arrB);

        }

        /

**

         * 加密字符串

         *

         * @param strIn

         *            需加密的字符串

         * @return 加密后的字符串

         * @throws Exception

         */

        public String encrypt(String strIn) throws Exception {

         return byteArr2HexStr(encrypt(strIn.getBytes()));

        }

        /

**

         * 解密字节数组

         *

         * @param arrB

         *            需解密的字节数组

         * @return 解密后的字节数组

         * @throws Exception

         */

        public byte[] decrypt(byte[] arrB) throws Exception {

         return decryptCipher.doFinal(arrB);

        }

        /

**

         * 解密字符串

         *

         * @param strIn

         *            需解密的字符串

         * @return 解密后的字符串

         * @throws Exception

         */

        public String decrypt(String strIn) throws Exception {

         return new String(decrypt(hexStr2ByteArr(strIn)));

        }

        /

**

         * 从指定字符串生成密钥,密钥所需的法源字节数组长度为8位 不足8位时后面补0,超出8位只取前8位

         *

         * @param arrBTmp

         *            构成该字符串的算a实算法字节数组

         * @return 生成的密钥

         * @throws java.lang.Exception

         */

        private Key getKey(byte[] arrBTmp) throws Exception {

         // 创建一个空的8位字节数组(默认值为0)

         byte[] arrB = new byte[8];

         // 将原始字节数组转换为8位

         for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {

          arrB[i] = arrBTmp[i];

         }

         // 生成密钥

         Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES");

         return key;

        }

       }

       测试程序  Test.java

       /

**

        * @author    李国庆

        * @company   leemenz (C) copyright

        * @time      Nov 1,   :: AM

        * @version   1.0.0.0

        * @package   com.des

        */

       package com.des;

       /

**

        * @author Administrator

       

*

        */

       public class Test {

        /

**

         * @param args

         */

        public static void main(String[] args) {

         // TODO Auto-generated method stub

         try {

          String test = "Hellow Word!";

          //DESPlus des = new DESPlus();//默认密钥

          DESPlus des = new DESPlus("leemenz");//自定义密钥

          System.out.println("加密前的字符:"+test);

          System.out.println("加密后的字符:"+des.encrypt(test));

          System.out.println("解密后的字符:"+des.decrypt(des.encrypt(test)));

         } catch (Exception e) {

          // TODO: handle exception

          e.printStackTrace();

         }

        }

       }

       看看 对你有帮助的 不一定加密长度一样的