文章目录
- 非对称加密
- 对称加密:
- Des 加密
- 3 DES 加密
- Des 加密java Api
- AES 加密算法
- AES 加密过程
- AES 密钥拓展
非对称加密
非对称加密算法需要两个密钥:公开密钥(publickey:简称公钥)和私有密钥(privatekey:简称私钥)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
对称加密:
采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。
- 示例
我们现在有一个原文3要发送给B,设置密钥为108,3* 108 = 324,将324作为密文发送给B。B拿到密文324后,使用324/108= 3得到原文 - 常见加密算法
DES : Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。
AES : Advanced Encryption Standard,高级加密标准.在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。 - 特点
加密速度快,可以加密大文件
密文可逆,一旦密钥文件泄漏,就会导致数据暴露。加密后编码表找不到对应字符,出现乱码
一般结合Base64使用
Des 加密
b站视频教程链接
DES算法是属于对称密码算法中的分组加密算法。
- 算法步骤
- IP置换
按照一定的规则,将原来的64位二进制位重新排序。
- 轮函数——E扩展置换
将32 位输⼊扩展为48位输出
可以理解为 将每部分的第一个和最后一个数取出交换后放到,原来数的前(后)面 - 轮函数–S盒压缩处理
经过扩展的48位明文和48位密钥进行异或运算后,再使用8个S盒压缩处理得到32位数据。将48位输入等分为8块,每块6位输入压缩为4位输出。
- 轮函数——P盒置换
与ip置换相同,根据p盒置换表进行置换
S盒置换再经过P盒置换。⾄此,⼀次轮函数操作完毕。 - 密钥生成
密钥为64位,除去8位校验位,剩余56位参与运算。
按照交换规则,⽣成16个48位的轮密钥。
3 DES 加密
DES是一个经典的对称加密算法,但也缺陷明显,即56位的密钥安全性不足,已被证实可以在短时间内破解。为解决此问题,出现了3DES,也称Triple DES,3DES为DES向AES过渡的加密算法,它使用3条56位的密钥对数据进行三次加密。为了兼容普通的DES,3DES并没有直接使用 加密->加密->加密 的方式,而是采用了加密->解密->加密 的方式。
Des 加密java Api
加密过程
@Test
public void testEnDes() throws Exception{
//原文
String input="加密测试";
//定义密钥
String key="12345678";
//加密方式
String Des="DES";
//创建加密对象
Cipher cipher = Cipher.getInstance(Des);
//创建加密规则
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), Des);
//加密初始化
cipher.init(Cipher.ENCRYPT_MODE,secretKeySpec);
byte[] bytes = cipher.doFinal(input.getBytes(StandardCharsets.UTF_8));
String encode = Base64.encode(bytes);
log.info("解密前的内容为:{}",input);
log.info("加密后的内容为:{}",encode);
}
解密过程
@Test
public void testDeDes() throws Exception{
//原文
String input="fvlQhBYI8Ev8KJFCWAHY9A==";
//定义密钥
String key="12345678";
//加密方式
String Des="DES";
//创建加密对象
Cipher cipher = Cipher.getInstance(Des);
//创建加密规则
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), Des);
//加密初始化
cipher.init(Cipher.DECRYPT_MODE,secretKeySpec);
byte[] bytes = cipher.doFinal(Base64.decode(input));
log.info("解密前的内容为:{}",input);
log.info("解密后的内容为:{}",new String(bytes));
//制定加密算法
//String password=
}
AES 加密算法
AES 属于 分组加密 算法
明⽂⻓度固定为128位
密钥⻓度可以是128、192、256位
- 输入字节的顺序
AES 加密过程
b站教程
- 初始变换(Initial round)
- 字节代换(SubBytes)
- ⾏移位(ShiftRows)
第几行向左移动几位(第0行移动0位,第1行1位……)
- 列混合(MixColumn)
左乘一个给定的4*4 矩阵
- 轮密钥加(AddRoundKey)
AES 密钥拓展
-
如果i不是4的倍数,那么第i列由如下等式确定:W[i]=W[i-4]⨁W[i-1] w[i] 为4*4 矩阵的第i列
-
如果i是4的倍数,那么第i列由如下等式确定:W[i]=W[i-4]⨁T(W[i-1])
函数T由3部分组成:字循环、字节代换和轮常量异或。- 字循环 将1个字中的4个字节循环左移1个字节。即将输⼊字[b0, b1, b2, b3]变换成
[b1,b2,b3,b0]。 - 字节代换 对字循环的结果使⽤S盒进⾏字节代换。
- 轮常量异或 将前两步的结果同轮常量Rcon[j]进⾏异或,其中j表示轮数。(同轮常量给定)
- 字循环 将1个字中的4个字节循环左移1个字节。即将输⼊字[b0, b1, b2, b3]变换成