【加密】对称加密算法
前言
之前对非对称加密作了介绍(请大力点击),现对对称加密作个简单介绍。
对称加密算法
能通过相同的密钥对报文进行加密、解密的算法,叫对称加密算法。
比如,客户端,将一段报文通过密钥加密成密文,发送密文给服务端,服务端收到密文,通过相同的密钥解密,还原报文。
常用的对称加密算法:DES
特点:
- 通过相同的密钥对报文进行加密、解密。所以,需要保证密钥的保密。
- 计算速度快。所以,经常与计算速度慢的
非对称加密算法
一起使用,形成混合加密(后续博文描述)。
为什么要有密钥
我们有加密算法,为什么要有密钥?
答:加密算法只是一种算法(可视作一套逻辑),通常为大家所知,比如DES。如果一段报文,通过大家熟知的逻辑加密,那么其他人也能通过相应的逻辑解密,这样意义不大。所以就有密钥,相当于算法的密码,算法逻辑加上密钥公共将报文加密成密文,相应的,需通过算法逻辑和密钥才能正确解密。
危险
最常见的破解加密算法的手段是枚举攻击。由于大家都知道算法的逻辑,通过枚举密钥的所有可能性尝试解码。所以,密钥的位数决定了枚举攻击的难度,密钥位数越多,越难枚举出所有的可能性破解,当然,我们加解密的计算速度也有相应的影响。随着现代计算机计算速度提升,密钥的位数也在提升。
简单的例子
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.util.Base64;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import org.junit.Test;
public class DESUtils {
/**
* 加密
* @param data 加密的数据
* @param key 密钥
* @return 加密后的数据
*/
public static byte[] encrypt(byte[] data, byte[] key) {
try {
DESKeySpec desKeySpec = new DESKeySpec(key);
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secretKey = secretKeyFactory.generateSecret(desKeySpec);
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
return cipher.doFinal(data);
} catch (InvalidKeyException e) {
throw new RuntimeException("无效的Key值");
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("无DES算法");
} catch (InvalidKeySpecException e) {
throw new RuntimeException("无效的KeySpec");
} catch (NoSuchPaddingException e) {
throw new RuntimeException("无Padding");
} catch (IllegalBlockSizeException e) {
throw new RuntimeException(e);
} catch (BadPaddingException e) {
throw new RuntimeException(e);
}
}
/**
* 解密
* @param data 解密前的数据
* @param key 密钥
* @return 解密后的数据
*/
public static byte[] decrypt(byte[] data, byte[] key) {
try {
DESKeySpec desKeySpec = new DESKeySpec(key);
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secretKey = secretKeyFactory.generateSecret(desKeySpec);
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
return cipher.doFinal(data);
} catch (InvalidKeyException e) {
throw new RuntimeException("无效的Key值");
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("无DES算法");
} catch (InvalidKeySpecException e) {
throw new RuntimeException("无效的KeySpec");
} catch (NoSuchPaddingException e) {
throw new RuntimeException("无Padding");
} catch (IllegalBlockSizeException e) {
throw new RuntimeException(e);
} catch (BadPaddingException e) {
throw new RuntimeException(e);
}
}
@Test
public void encryptTest() {
System.out.println(Base64.getEncoder().encodeToString(DESUtils.encrypt("hello".getBytes(), "12345678".getBytes())));
}
@Test
public void decryptTest() {
System.out.println(new String(DESUtils.decrypt(Base64.getDecoder().decode("uhbGoCVxJa8="), "12345678".getBytes())));
}
}
作者:Nick Huang 博客:http://www.cnblogs.com/nick-huang/
本博客为学习、笔记之用,以笔记形式记录学习的知识与感悟。学习过程中可能参考各种资料,如觉文中表述过分引用,请务必告知,以便迅速处理。如有错漏,不吝赐教。
如果本文对您有用,点赞或评论哦;如果您喜欢我的文章,请点击关注我哦~
本博客为学习、笔记之用,以笔记形式记录学习的知识与感悟。学习过程中可能参考各种资料,如觉文中表述过分引用,请务必告知,以便迅速处理。如有错漏,不吝赐教。
如果本文对您有用,点赞或评论哦;如果您喜欢我的文章,请点击关注我哦~
分类:
编码与加密
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
2015-10-22 【JSON】Jackson初学,及常用的例子