【Java小工匠聊密码学】--对称加密--DES
1、 DES算法 DES对称加密,对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码),是一对称加密算法。 2、DES算法特点 密钥长度56位+8位校验位,生命周期短。 3、DES算法实现 3.1 DES的JDK实现 (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)); } } 如果读完觉得有收获的话,欢迎点赞、关注、加公众号【小工匠技术圈】 个人公众号,欢迎关注,查阅更多精彩历史! image