本文共 3340 字,大约阅读时间需要 11 分钟。
DES对称加密,对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码),是一对称加密算法。
密钥长度56位+8位校验位,生命周期短。
(1)工作模式
ECB、CBC、PCBC、CTR、CTS、CFB、CFB8-CFB128、OFB、OFB8-OFB128. (2) 填充模式 NoPadding、PKCS5Padding、ISO10126Padding (3) 代码实现package lzf.cipher.jdk;import java.nio.charset.Charset;import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;/** * @author Java小工匠 */public class JdkDesUtils { // 获取 DES Key public static byte[] getDesKey() { try { // 1、创建密钥生成器 KeyGenerator keyGenerator = KeyGenerator.getInstance("DES"); keyGenerator.init(56); // 2、产生密钥 SecretKey secretKey = keyGenerator.generateKey(); // 3、获取密钥 byte[] key = secretKey.getEncoded(); return key; } catch (Exception e) { throw new RuntimeException(e); } } // DES 加密 public static byte[] encryptDes(byte[] data, byte[] key) { try { SecretKey secretKey = new SecretKeySpec(key, "DES"); String type = "DES"; // 加工作模式和填充方式 // type= "DES/ECB/PKCS5Padding"; Cipher cipher = Cipher.getInstance(type); cipher.init(Cipher.ENCRYPT_MODE, secretKey); byte[] rsData = cipher.doFinal(data); return rsData; } catch (Exception e) { throw new RuntimeException(e); } } //解密 public static byte[] decryptDes(byte[] data, byte[] key) { try { SecretKey secretKey = new SecretKeySpec(key, "DES"); String type = "DES"; // 加工作模式和填充方式 // type= "DES/ECB/PKCS5Padding"; Cipher cipher = Cipher.getInstance(type); cipher.init(Cipher.DECRYPT_MODE, secretKey); byte[] rsData = cipher.doFinal(data); return rsData; } catch (Exception e) { throw new RuntimeException(e); } } // 数据转16进制编码 public static String encodeHex(final byte[] data, final boolean toLowerCase) { final char[] DIGITS_LOWER = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; final char[] DIGITS_UPPER = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; final char[] toDigits = toLowerCase ? DIGITS_LOWER : DIGITS_UPPER; final int l = data.length; final char[] out = new char[l << 1]; // two characters form the hex value. for (int i = 0, j = 0; i < l; i++) { out[j++] = toDigits[(0xF0 & data[i]) >>> 4]; out[j++] = toDigits[0x0F & data[i]]; } return new String(out); } public static void main(String[] args) { byte[] data = "java小工匠".getBytes(Charset.forName("UTF-8")); byte[] key = getDesKey(); String hexKeyStr = encodeHex(key, true); System.out.println("加密密钥:" + hexKeyStr + ",length=" + hexKeyStr.length()); byte[] encryptData = encryptDes(data, key); System.out.println("加密数据:" + encodeHex(encryptData, true)); byte[] decryptData = decryptDes(encryptData, key); System.out.println("解密数据:" + new String(decryptData)); }}
如果读完觉得有收获的话,欢迎点赞、关注、加公众号【小工匠技术圈】
个人公众号,欢迎关注,查阅更多精彩历史!
转载地址:http://ftpzl.baihongyu.com/