加解密---对称加密算法
1、概述:
1.1 加密秘钥=解密秘钥
1.2 属于初等加密算法
2、对称加密算法:
1.1 DES
Data Encryption Standard 数据加密标准
package com.exiuge.mytest; import org.bouncycastle.util.encoders.Hex; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; import java.security.Key; public class JdkDES { private static String src="hello,rose"; public static void main(String[] args){ enDeCode(src); } public static void enDeCode(String src){ try { //生成key KeyGenerator keyGenerator=KeyGenerator.getInstance("DES"); keyGenerator.init(56); SecretKey secretKey =keyGenerator.generateKey(); byte[] bytesKey=secretKey.getEncoded(); //key转换 DESKeySpec desKeySpec=new DESKeySpec(bytesKey); SecretKeyFactory secretKeyFactory=SecretKeyFactory.getInstance("DES"); Key convertKey =secretKeyFactory.generateSecret(desKeySpec); //加密 Cipher cipher=Cipher.getInstance("DES/ECB/PKCS5padding"); cipher.init(Cipher.ENCRYPT_MODE,convertKey); byte[] desBytes=cipher.doFinal(src.getBytes()); System.out.println(Hex.toHexString(desBytes)); System.out.println(new String(desBytes,"utf-8")); //解密 cipher.init(Cipher.DECRYPT_MODE,convertKey); byte[] srcBytes=cipher.doFinal(desBytes); System.out.println(new String(srcBytes)); }catch (Exception e){ e.printStackTrace(); } } }
package com.exiuge.mytest; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.util.encoders.Hex; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; import java.security.Key; import java.security.Security; public class BCDES { private static String src="hello,rose"; public static void main(String[] args){ enDeCode(src); } public static void enDeCode(String src){ try { Security.addProvider(new BouncyCastleProvider()); //生成key KeyGenerator keyGenerator=KeyGenerator.getInstance("DES","BC"); keyGenerator.init(56); SecretKey secretKey =keyGenerator.generateKey(); byte[] bytesKey=secretKey.getEncoded(); //key转换 DESKeySpec desKeySpec=new DESKeySpec(bytesKey); SecretKeyFactory secretKeyFactory=SecretKeyFactory.getInstance("DES"); Key convertKey =secretKeyFactory.generateSecret(desKeySpec); //加密 Cipher cipher=Cipher.getInstance("DES/ECB/PKCS5padding"); cipher.init(Cipher.ENCRYPT_MODE,convertKey); byte[] desBytes=cipher.doFinal(src.getBytes()); System.out.println(Hex.toHexString(desBytes)); System.out.println(new String(desBytes,"utf-8")); //解密 cipher.init(Cipher.DECRYPT_MODE,convertKey); byte[] srcBytes=cipher.doFinal(desBytes); System.out.println(new String(srcBytes)); }catch (Exception e){ e.printStackTrace(); } } }
1.2 3DES(Triple DES、DESede)
package com.exiuge.mytest; import org.bouncycastle.util.encoders.Hex; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESedeKeySpec; import java.security.Key; import java.security.SecureRandom; public class Jdk3DES { private static String src="hello,rose"; public static void main(String[] args){ enDeCode(src); } public static void enDeCode(String src){ try { //生成key KeyGenerator keyGenerator=KeyGenerator.getInstance("DESede"); //keyGenerator.init(168); //生成一个默认长度的秘钥 keyGenerator.init(new SecureRandom()); SecretKey secretKey =keyGenerator.generateKey(); byte[] bytesKey=secretKey.getEncoded(); //key转换 DESedeKeySpec desKeySpec=new DESedeKeySpec(bytesKey); SecretKeyFactory secretKeyFactory=SecretKeyFactory.getInstance("DESede"); Key convertKey =secretKeyFactory.generateSecret(desKeySpec); //加密 Cipher cipher=Cipher.getInstance("DESede/ECB/PKCS5padding"); cipher.init(Cipher.ENCRYPT_MODE,convertKey); byte[] desBytes=cipher.doFinal(src.getBytes()); System.out.println(Hex.toHexString(desBytes)); //解密 cipher.init(Cipher.DECRYPT_MODE,convertKey); byte[] srcBytes=cipher.doFinal(desBytes); System.out.println(new String(srcBytes)); }catch (Exception e){ e.printStackTrace(); } } }
1.3 AES
AES运行效率比DES高、目前还未被破解;
常用于 移动通信系统的加密 、基于SSH协议的软件(SSH Client、secureCRT);
package com.exiuge.mytest; import org.apache.commons.codec.binary.Base64; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import java.security.Key; import java.security.SecureRandom; public class JdkAES { private static String src="hello,rose"; public static void main(String[] args){ enDeCode(src); } public static void enDeCode(String src){ try { //生成key KeyGenerator keyGenerator=KeyGenerator.getInstance("AES"); keyGenerator.init(new SecureRandom()); SecretKey secretKey =keyGenerator.generateKey(); byte[] keyEncoded=secretKey.getEncoded(); //转换key Key convertKey =new SecretKeySpec(keyEncoded,"AES"); //加密 Cipher cipher=Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE,convertKey); byte[] desBytes=cipher.doFinal(src.getBytes()); System.out.println(Base64.encodeBase64String(desBytes)); //解密 cipher.init(Cipher.DECRYPT_MODE,convertKey); byte[] srcBytes=cipher.doFinal(desBytes); System.out.println(new String(srcBytes)); }catch (Exception e){ e.printStackTrace(); } } }
1.4 PBE(Password Based Encryption)
基于口令加密
package com.exiuge.mytest; import org.bouncycastle.util.encoders.Base64; import javax.crypto.Cipher; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.PBEKeySpec; import javax.crypto.spec.PBEParameterSpec; import java.security.Key; import java.security.SecureRandom; public class JdkPBE { private static String src="hello,rose"; public static void main(String[] args){ enDeCode(src); } public static void enDeCode(String src){ try { //初始化盐(随机数) SecureRandom secureRandom=new SecureRandom(); byte[] saltBytes=secureRandom.generateSeed(8); //口令 String pwd="123456"; PBEKeySpec pbeKeySpec=new PBEKeySpec(pwd.toCharArray()); SecretKeyFactory secretKeyFactory=SecretKeyFactory.getInstance("PBEWITHMD5andDES");
//秘钥 Key key =secretKeyFactory.generateSecret(pbeKeySpec); //加密 PBEParameterSpec pbeParameterSpec=new PBEParameterSpec(saltBytes,100); Cipher cipher=Cipher.getInstance("PBEWITHMD5andDES"); cipher.init(Cipher.ENCRYPT_MODE,key,pbeParameterSpec); byte[] desBytes=cipher.doFinal(src.getBytes()); System.out.println(Base64.toBase64String(desBytes)); //解密 cipher.init(Cipher.DECRYPT_MODE,key,pbeParameterSpec); byte[] srcBytes=cipher.doFinal(desBytes); System.out.println(new String(srcBytes)); }catch (Exception e){ e.printStackTrace(); } } }
1.5 IDEA
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)