首页 > 代码库 > java des加解密
java des加解密
package com.des.test; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; import javax.crypto.spec.IvParameterSpec; public class DES { /** * * * * @return DES算法密钥 */ public static byte[] generateKey() { try { // DES算法要求有一个可信任的随机数源 SecureRandom sr = new SecureRandom(); // 生成一个DES算法的KeyGenerator对象 KeyGenerator kg = KeyGenerator.getInstance("DES"); kg.init(sr); // 生成密钥 SecretKey secretKey = kg.generateKey(); // 获取密钥数据 byte[] key = secretKey.getEncoded(); return key; } catch (NoSuchAlgorithmException e) { System.err.println("DES算法,生成密钥出错!"); e.printStackTrace(); } return null; } /** * * 加密函数 * * * * @param data * * 加密数据 * * @param key * * 密钥 * * @return 前往加密后的数据 */ public static byte[] encrypt(byte[] data, byte[] key) { try { // DES算法要求有一个可信任的随机数源 SecureRandom sr = new SecureRandom(); // 从原始密钥数据树立DESKeySpec对象 DESKeySpec dks = new DESKeySpec(key); // 树立一个密匙工厂,然后用它把DESKeySpec转换成 // 一个SecretKey对象 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); SecretKey secretKey = keyFactory.generateSecret(dks); // using DES in ECB mode Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); // 用密匙原始化Cipher对象 cipher.init(Cipher.ENCRYPT_MODE, secretKey, sr); // 执行加密操作 byte encryptedData[] = cipher.doFinal(data); return encryptedData; } catch (Exception e) { System.err.println("DES算法,加密数据出错!"); e.printStackTrace(); } return null; } /** * * 解密函数 * * * * @param data * * 解密数据 * * @param key * * 密钥 * * @return 前往解密后的数据 */ public static byte[] decrypt(byte[] data, byte[] key) { try { // DES算法要求有一个可信任的随机数源 SecureRandom sr = new SecureRandom(); // byte rawKeyData[] = /* 用某种方法获取原始密匙数据 */; // 从原始密匙数据树立一个DESKeySpec对象 DESKeySpec dks = new DESKeySpec(key); // 树立一个密匙工厂,然后用它把DESKeySpec对象转换成 // 一个SecretKey对象 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); SecretKey secretKey = keyFactory.generateSecret(dks); // using DES in ECB mode Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); // 用密匙原始化Cipher对象 cipher.init(Cipher.DECRYPT_MODE, secretKey, sr); // 正式执行解密操作 byte decryptedData[] = cipher.doFinal(data); return decryptedData; } catch (Exception e) { System.err.println("DES算法,解密出错。"); e.printStackTrace(); } return null; } /** * * 加密函数 * * * * @param data * * 加密数据 * * @param key * * 密钥 * * @return 前往加密后的数据 */ public static byte[] CBCEncrypt(byte[] data, byte[] key, byte[] iv) { try { // 从原始密钥数据树立DESKeySpec对象 DESKeySpec dks = new DESKeySpec(key); // 树立一个密匙工厂,然后用它把DESKeySpec转换成 // 一个SecretKey对象 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); SecretKey secretKey = keyFactory.generateSecret(dks); // Cipher对象实践完成加密操作 Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); // 若采用NoPadding方式,data长度必需是8的倍数 // Cipher cipher = Cipher.getInstance("DES/CBC/NoPadding"); // 用密匙原始化Cipher对象 IvParameterSpec param = new IvParameterSpec(iv); cipher.init(Cipher.ENCRYPT_MODE, secretKey, param); // 执行加密操作 byte encryptedData[] = cipher.doFinal(data); return encryptedData; } catch (Exception e) { System.err.println("DES算法,加密数据出错!"); e.printStackTrace(); } return null; } /** * * 解密函数 * * * * @param data * * 解密数据 * * @param key * * 密钥 * * @return 前往解密后的数据 */ public static byte[] CBCDecrypt(byte[] data, byte[] key, byte[] iv) { try { // 从原始密匙数据树立一个DESKeySpec对象 DESKeySpec dks = new DESKeySpec(key); // 树立一个密匙工厂,然后用它把DESKeySpec对象转换成 // 一个SecretKey对象 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); SecretKey secretKey = keyFactory.generateSecret(dks); // using DES in CBC mode Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); // 若采用NoPadding方式,data长度必需是8的倍数 // Cipher cipher = Cipher.getInstance("DES/CBC/NoPadding"); // 用密匙原始化Cipher对象 IvParameterSpec param = new IvParameterSpec(iv); cipher.init(Cipher.DECRYPT_MODE, secretKey, param); // 正式执行解密操作 byte decryptedData[] = cipher.doFinal(data); return decryptedData; } catch (Exception e) { System.err.println("DES算法,解密出错。"); e.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) { try { byte[] key = "12345678".getBytes(); byte[] iv = "11111111".getBytes(); byte[] data = http://www.mamicode.com/DES.encrypt("hello world!".getBytes(), key);>
DES的几种填补方式:DES是对64位数据的加密算法,如数据位数缺乏64位的倍数,须要填充,补充到64位的倍数。
NoPadding
API或算法自身不对数据执行处理,加密数据由加密两边商定填补算法。比如若对字符串数据执行加解密,可以补充\0或许空格,然后trim
PKCS5Padding
加密前:数据字节长度对8取余,余数为m,若m>0,则补足8-m个字节,字节数值为8-m,即差多个字节就补多个字节,字节数值即为补充的字节数,若为0则补充8个字节的8
解密后:取开头一个字节,值为m,则从数据尾部删除m个字节,剩余数据即为加密前的原文
由于DES是一种block cipher,一个block要8个字节,所以要加密的东西要分红8字节的整数倍,缺乏的就填充。
PKCS5Padding这种填充,填的字节代表所填字节的总数:
比如差三个字节的话填为 @@@@@333
差7个字节就填为 @7777777
没有差就填 88888888
java des加解密
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。