加解密和编码
加解密
一、对称加密
- 定义:加密和解密使用同一个密钥。
- 特点:加密和解密速度快,适合对大量数据进行加密;但密钥管理较为困难,因为需要在通信双方之间安全地共享密钥。
- 常见算法:
- AES(Advanced Encryption Standard):高级加密标准,支持 128、192 和 256 位密钥长度,是一种高效且安全的对称加密算法。
- DES(Data Encryption Standard):数据加密标准,密钥长度为 56 位,由于密钥长度较短,安全性较低,已不再推荐用于高安全性场合。
- SM4:是中国的国家密码算法标准之一,属于分组密码算法,密钥长度为 128 位。
二、非对称加密
- 定义:加密和解密使用不同的密钥,通常包括一个公钥和一个私钥。
- 特点:安全性高,因为私钥不需要在网络上传输;但加密和解密速度较慢,不适合对大量数据进行加密。
- 常见算法:
- RSA(Rivest–Shamir–Adleman):一种广泛使用的非对称加密算法,支持数据加密和数字签名,密钥长度通常为 1024、2048 或 4096 位。
- SM2:是中国的国家密码算法标准之一,基于椭圆曲线密码学,提供数字签名和密钥交换功能。
三、消息摘要算法
- 定义:将任意长度的数据转换为固定长度的哈希值,不可逆。
- 特点:哈希值具有唯一性,可用于数据完整性校验、密码存储等。
- 常见算法:
- MD5(Message Digest Algorithm 5):生成 128 位(16 字节)的哈希值,常用于文件校验、密码存储等,但已被认为不再足够安全。
- SHA-1(Secure Hash Algorithm 1):生成 160 位(20 字节)的哈希值,比 MD5 更安全,但已被认为不再足够安全。
- SHA-256:生成 256 位(32 字节)的哈希值,是 SHA-2 系列中的一种,被广泛认为是安全的哈希算法。
- SM3:是中国的国家密码算法标准之一,生成 256 位的哈希值,用于数据完整性校验和数字签名。
四、国密算法
- 定义:国密算法是中国国家密码管理局制定的一系列密码算法标准,包括对称加密、非对称加密和消息摘要算法。
- 特点:国密算法具有较高的安全性和自主可控性,适用于对数据安全要求较高的场景,如金融、政务等领域。
- 常见算法:
- SM2:非对称加密算法,基于椭圆曲线密码学,提供数字签名和密钥交换功能。
- SM3:消息摘要算法,生成 256 位的哈希值,用于数据完整性校验和数字签名。
- SM4:对称加密算法,密钥长度为 128 位,用于数据加密和解密。
编码
1. 文本编码格式
文本编码用于表示字符数据,常见格式包括:
- ASCII:最早的字符编码标准,使用7位表示128个字符。
- Unicode:支持全球字符集的编码标准,常见实现有:
- UTF-8:变长编码,兼容ASCII。
- UTF-16:使用2或4字节表示字符。
- UTF-32:固定4字节表示字符。
- ISO/IEC 8859:一系列单字节编码标准,如ISO-8859-1(Latin-1)。
- GB2312/GBK/GB18030:中文字符编码标准。
- Shift_JIS:日文字符编码。
- EUC-KR:韩文字符编码。
2. 数据编码格式
用于结构化数据的编码,常见格式包括:
- JSON:轻量级的数据交换格式。
- XML:可扩展标记语言,用于结构化数据。
- YAML:人类可读的数据序列化格式。
- CSV:逗号分隔值格式,用于表格数据。
- Protocol Buffers:谷歌开发的高效二进制编码格式。
- MessagePack:二进制序列化格式。
- BSON:JSON的二进制扩展格式。
6. 其他编码格式
- Base64:将二进制数据编码为ASCII字符。
import cn.hutool.core.codec.Base64;
// Base64 编码
String original = "Hello, Hutool!";
String encoded = Base64.encode(original);
System.out.println("Base64 编码结果: " + encoded);
// Base64 解码
String decoded = Base64.decodeStr(encoded);
System.out.println("Base64 解码结果: " + decoded);
- Hex:十六进制编码。
import cn.hutool.core.util.HexUtil;
// Hex 编码
String original = "Hello, Hutool!";
String encoded = HexUtil.encodeHexStr(original);
System.out.println("Hex 编码结果: " + encoded);
// Hex 解码
String decoded = HexUtil.decodeHexStr(encoded);
System.out.println("Hex 解码结果: " + decoded);
- URL 编码
import cn.hutool.core.util.URLUtil;
// URL 编码
String original = "https://example.com/search?q=Hutool 工具";
String encoded = URLUtil.encode(original);
System.out.println("URL 编码结果: " + encoded);
// URL 解码
String decoded = URLUtil.decode(encoded);
System.out.println("URL 解码结果: " + decoded);
- Unicode 编码
import cn.hutool.core.util.EscapeUtil;
// Unicode 编码
String original = "Hello, Hutool!";
String encoded = EscapeUtil.escape(original);
System.out.println("Unicode 编码结果: " + encoded);
// Unicode 解码
String decoded = EscapeUtil.unescape(encoded);
System.out.println("Unicode 解码结果: " + decoded);
日夜颠倒头发少 ,单纯好骗恋爱脑 ,会背九九乘法表 ,下雨只会往家跑 ,搭讪只会说你好 ---- 2050781802@qq.com