欢迎来到皮皮网网首页

【潘多拉box 源码】【阿狸子源码外贸版本】【开源v8源码】java des源码

来源:战神源码网 时间:2024-11-25 03:52:30

1.java des加密后的串比原字符串长
2.JAVA和.NET使用DES对称加密的区别
3.用java实现des加密和解密
4.Java 接口数据加密和解密

java des源码

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) 互为可逆的转换过程

         *

         * @param arrB

         *            需要转换的byte数组

         * @return 转换后的字符串

         * @throws Exception

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

         */

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

         int iLen = arrB.length;

         // 每个byte用两个字符才能表示,所以字符串的潘多拉box 源码长度是数组长度的两倍

         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)

         * 互为可逆的阿狸子源码外贸版本转换过程

         *

         * @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;

         // 两个字符表示一个字节,所以字节数组长度是字符串长度除以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

         *            指定的密钥

         * @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

         *            构成该字符串的字节数组

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

         }

        }

       }

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

JAVA和.NET使用DES对称加密的区别

       JAVA和.NET的系统类库里都有封装DES对称加密的实现方式,但是对外暴露的接口却各不相同,甚至有时会让自己难以解决其中的问题,比如JAVA加密后的结果在.NET中解密不出来等,由于最近项目有跨JAVA和.NET的加解密,经过我的分析调试,终于让它们可以互相加密解密了。

       DES加密

       DES是一种对称加密(Data Encryption Standard)算法,以前我写过一篇文章:.NET中加密解密相关知识,有过简单描述。

       DES算法一般有两个关键点,第一个是加密算法,第二个是数据补位。

       åŠ å¯†ç®—法常见的有ECB模式和CBC模式:

       ECB模式:电子密本方式,这是JAVA封装的DES算法的默认模式,就是将数据按照8个字节一段进行DES加密或解密得到一段8个字节的密文或者明文,最后一段不足8个字节,则补足8个字节(注意:这里就涉及到数据补位了)进行计算,之后按照顺序将计算所得的数据连在一起即可,各段数据之间互不影响。

       CBC模式:密文分组链接方式,这是.NET封装的DES算法的默认模式,它比较麻烦,加密步骤如下:

       1、首先将数据按照8个字节一组进行分组得到D1D2......Dn(若数据不是8的整数倍,就涉及到数据补位了)

       2、第一组数据D1与向量I异或后的结果进行DES加密得到第一组密文C1(注意:这里有向量I的说法,ECB模式下没有使用向量I)

       3、第二组数据D2与第一组的加密结果C1异或以后的结果进行DES加密,得到第二组密文C2

       4、之后的数据以此类推,得到Cn

       5、按顺序连为C1C2C3......Cn即为加密结果。

       æ•°æ®è¡¥ä½ä¸€èˆ¬æœ‰NoPadding和PKCS7Padding(JAVA中是PKCS5Padding)填充方式,PKCS7Padding和PKCS5Padding实际只是协议不一样,根据相关资料说明:PKCS5Padding明确定义了加密块是8字节,PKCS7Padding加密快可以是1-之间。但是封装的DES算法默认都是8字节,所以可以认为他们一样。数据补位实际是在数据不满8字节的倍数,才补充到8字节的倍数的填充过程。

       NoPadding填充方式:算法本身不填充,比如.NET的padding提供了有None,Zeros方式,分别为不填充和填充0的方式。

       PKCS7Padding(PKCS5Padding)填充方式:为.NET和JAVA的默认填充方式,对加密数据字节长度对8取余为r,如r大于0,则补8-r个字节,字节为8-r的值;如果r等于0,则补8个字节8。比如:

       åŠ å¯†å­—符串为为AAA,则补位为AAA;加密字符串为BBBBBB,则补位为BBBBBB;加密字符串为CCCCCCCC,则补位为CCCCCCCC。

       .NET中的DES加密

       å¯¹äºŽ.NET,框架在System.Security.Cryptography命名空间下提供了DESCryptoServiceProvider作为System.Security.Cryptography.DES加密解密的包装接口,它提供了如下的4个方法:

       public override ICryptoTransform CreateDecryptor(byte[] rgbKey, byte[] rgbIV)

       public override ICryptoTransform CreateEncryptor(byte[] rgbKey, byte[] rgbIV)

       public override void GenerateIV()

       public override void GenerateKey()

       ä»Ž.NET类库封装情况,加解密需要传入一个Key和IV向量。而且Key必须为8字节的数据,否则会直接抛异常出来,当使用ECB模式下,不管传入什么IV向量,加密结果都一样。示例代码如下:

        public static string EncryptWithJava(string key, string str)

        {

        if (key.Length < 8 || string.IsNullOrEmpty(str))

        {

        throw new Exception("加密key小于8或者加密字符串为空!");

        }

        byte[] bKey = Encoding.UTF8.GetBytes(key.Substring(0, 8));

        byte[] bIV = IV;

        byte[] bStr = Encoding.UTF8.GetBytes(str);

        try

        {

        DESCryptoServiceProvider desc = new DESCryptoServiceProvider();

        desc.Padding = PaddingMode.PKCS7;//补位

        desc.Mode = CipherMode.ECB;//CipherMode.CBC

        using (MemoryStream mStream = new MemoryStream())

        {

        using (CryptoStream cStream = new CryptoStream(mStream, desc.CreateEncryptor(bKey, bIV), CryptoStreamMode.Write))

        {

        cStream.Write(bStr, 0, bStr.Length);

        cStream.FlushFinalBlock();

        StringBuilder ret = new StringBuilder();

        byte[] res = mStream.ToArray();

        foreach (byte b in res)

        {

        ret.AppendFormat("{ 0:x2}", b);

        }

        return ret.ToString();

        }

        }

        }

        catch

        {

        return string.Empty;

        }

        }

       ç”±äºŽä¸ºECB模式,因此IV这里设置什么值都是可以的,当为CBC模式下,则需要设置为其他值,比如:public static byte[] IV = { 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x },才能正常加密解密。

       JAVA中的DES加密

       JAVA的javax.crypto.Cipher包下,提供了加密解密的功能,它的静态getInstance方法,可以返回一个Cipher对象,一般有public static final Cipher getInstance(String transformation)方法,transformation为:algorithm/mode/padding,分别表示算法名称,比如DES,也可以在后面包含算法模式和填充方式,但也可以只是算法名称,如为:"DES/CBC/PKCS5Padding","DES"等。JAVA中默认的算法为ECB,默认填充方式为PKCS5Padding。Cipher的Init方法用来初始化加密对象,常见的有:

       public final void init(int opmode, Key key, AlgorithmParameterSpec params) ,

       public final void init(int opmode,Key key, SecureRandom random),用SecureRandom时,一般用于不需要IV的算法模式,示例代码如下:

       public static String encrypt2(String src) throws Exception {

        SecureRandom sr = new SecureRandom();

        DESKeySpec ks = new DESKeySpec(KEY.getBytes("UTF-8"));

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

        SecretKey sk = skf.generateSecret(ks);

        Cipher cip = Cipher.getInstance("DES/CBC/PKCS5Padding");//Cipher.getInstance("DES");

        IvParameterSpec iv2 = new IvParameterSpec(IV);

        cip.init(Cipher.ENCRYPT_MODE, sk, iv2);//IV的方式

        //cip.init(Cipher.ENCRYPT_MODE, sk, sr);//没有传递IV

        String dest = byteToHex(cip.doFinal(src.getBytes("UTF-8")));

        return dest;

        }

       å½“默认用DES,JAVA会用ECB模式,因此这里IV向量没有作用,这里,但当用CBC模式下,如果还是用SecureRandom,则每次加密的结果都会不一样,因为JAVA内部会用随机的IV来初始化Cipher对象,如示例代码,由于Cipher.getInstance("DES/CBC/PKCS5Padding")使用了CBC,因此我这里用的javax.crypto.spec.IvParameterSpec包下的IvParameterSpec来初始化向量IV:

       Private final static byte[] IV = new byte[] { 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x};

       æ€»ç»“

       å¯¹äºŽ.NET和JAVA在使用DES对称加密时,需要大家指定一样的算法和填充模式,并且JAVA在写DES加解密算法时,还需要根据创建Cipher对象的不同,正确使用IV向量。在不同系统需要互相数据时,必须要明确的是加密算法,Key和算法模式,再根据不同模式是否需要IV向量,最后是填充模式。

       æœ¬æ–‡æ˜¯ç»è¿‡è‡ªå·±ç¿»é˜…资料和反复调试代码而出来的,如有问题,请指正。

用java实现des加密和解密

       ä¸€ä¸ªç”¨DES来加密、解密的类

       /java/1/.html

       import java.security.*;

       import javax.crypto.Cipher;

       import javax.crypto.SecretKey;

       import javax.crypto.SecretKeyFactory;

       import javax.crypto.spec.DESKeySpec;

       /**

       * 字符串工具集合

       * @author Liudong

       */

       public class StringUtils {

       private static final String PASSWORD_CRYPT_KEY = "__jDlog_";

       private final static String DES = "DES";

       /**

       * 加密

       * @param src 数据源

       * @param key 密钥,长度必须是8的倍数

       * @return 返回加密后的数据

       * @throws Exception

       */

       public static byte[] encrypt(byte[] src, byte[] key)throws Exception {

       //DES算法要求有一个可信任的随机数源

       SecureRandom sr = new SecureRandom();

       // 从原始密匙数据创建DESKeySpec对象

       DESKeySpec dks = new DESKeySpec(key);

       // 创建一个密匙工厂,然后用它把DESKeySpec转换成

       // 一个SecretKey对象

       SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);

       SecretKey securekey = keyFactory.generateSecret(dks);

       // Cipher对象实际完成加密操作

       Cipher cipher = Cipher.getInstance(DES);

       // 用密匙初始化Cipher对象

       cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);

       // 现在,获取数据并加密

       // 正式执行加密操作

       return cipher.doFinal(src);

       }

       /**

       * 解密

       * @param src 数据源

       * @param key 密钥,长度必须是8的倍数

       * @return 返回解密后的原始数据

       * @throws Exception

       */

       public static byte[] decrypt(byte[] src, byte[] key)throws Exception {

       // DES算法要求有一个可信任的随机数源

       SecureRandom sr = new SecureRandom();

       // 从原始密匙数据创建一个DESKeySpec对象

       DESKeySpec dks = new DESKeySpec(key);

       // 创建一个密匙工厂,然后用它把DESKeySpec对象转换成

       // 一个SecretKey对象

       SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);

       SecretKey securekey = keyFactory.generateSecret(dks);

       // Cipher对象实际完成解密操作

       Cipher cipher = Cipher.getInstance(DES);

       // 用密匙初始化Cipher对象

       cipher.init(Cipher.DECRYPT_MODE, securekey, sr);

       // 现在,获取数据并解密

       // 正式执行解密操作

       return cipher.doFinal(src);

       }

       /**

       * 密码解密

       * @param data

       * @return

       * @throws Exception

       */

       public final static String decrypt(String data){

       try {

       return new String(decrypt(hex2byte(data.getBytes()),

       PASSWORD_CRYPT_KEY.getBytes()));

       }catch(Exception e) {

       }

       return null;

       }

       /**

       * 密码加密

       * @param password

       * @return

       * @throws Exception

       */

       public final static String encrypt(String password){

       try {

       return byte2hex(encrypt(password.getBytes(),PASSWORD_CRYPT_KEY.getBytes())); }catch(Exception e) {

       }

       return null;

       }

       æ¯”较长, 转了一部分.

Java 接口数据加密和解密

       提供一个基于注解实现接口加密解密工具源码,旨在方便在软件项目中对数据进行加密与解密。该工具支持多种加密方式,开源v8源码包括Base、DES、3DES、AES与RSA,电脑获取安卓源码以及MD5加密。

       使用方法:只需在需要加密解密的接口上添加相应的注解即可实现功能。

       此加密解密组件仅适用于SpringBoot项目。

       步骤如下:

       1. 从gitee.com/zhao_jian_jun...拉取代码至本地。机构派发仓指标源码

       2. 使用meavn的install将项目打包为.jar文件。

       3. 将加解密依赖引入至项目中。

       4. 在配置文件中说明使用的加密方式的秘钥。RSA为非对称加密,需提供两个秘钥。变量名如下:

       5. 对请求相应结果加密,使用@ZjjEncryptResponse注解并指定加密方式。

       6. 前端接收到的为加密后的数据。

       7. 对请求参数进行解密,使用@ZjjDecryptRequest注解。