学习内容:
密码学相关内容:
https://www.bilibili.com/video/BV1tz4y197hm/?spm_id_from=333.337.search-card.all.click&vd_source=c901ae3ff497a02016ba7bada52b2e3b
https://www.cnblogs.com/WittPeng/p/8978737.html
绪论
1. 信息安全与密码学
传统信息安全三要素:机密性、完整性、认证性;
现代信息安全的基本要求:机密性、完整性、认证性、不可否认性;
机密性 = 通过加密方式;完整性 = 消息摘要(哈希函数);认证性 = 数字签名;不可否认性 = 数字签名;
2. 密码学发展:
源自:1949年香农发表一篇题为《保密系统的通信理论》的经典论文。
先后经历了两个阶段:传统密码学和现代密码学。
传统密码:古代密码学、近代密码。
现代密码学:1949年香农发表《保密系统的通信理论》标志着现代密码学的真正开始(第一次质的飞跃)。1976年,Diffie和Hellman发表《密码学的新方向》,标志着公钥密码体制的诞生(第二次质的飞跃)。1978年,Rivest、Shamir和Adleman提出了RSA公钥密码体制。
密码学基础
密码学分类
1. 密码编码学和密码分析学
编码学:保密体制和认证体制;
保密体制:分类:明文空间、密文空间、密钥空间、加密算法、解密算法;
按照密钥划分为:对称密钥体制和非对称密钥体制;
分析学:遵循柯克霍夫准则;
2. 攻击方式分类:
枚举攻击、统计分析攻击、数学分析攻击;
古典密码学
时间范围:
1976年之前,一般都采用手工或机械;
经典算法:
置换密码:
明文保持不变,但是顺序被打乱;典型方法:棍子加密、抽象代数法;
代换密码:
明文中每个字符被替换为密文中的另一个字符;典型方法:单表代换密码-凯撒密码;
特点:
数据安全基于算法的保密,而现在密码是基于密钥的加密,算法是公开的;
以字母表为主要的加密对象,而现在密码是基于比特序列进行加密的;
现代密码学
三个代表事件:
1976年:由 Diffie 和 Hellman 在《 密码学的新方向》(《New Directions in Cryptography》)提出了公钥密码学体制的思想
1977年:美国国家标准局颁布数据加密标准 DES(Data Encryption Standard)
1978年:第一个公钥算法 RSA 算法(由 Ron Rivest、Adi Shamir 和 Leonard Adleman 的姓氏首字母组成)
三个方向:
私钥密码(对称加密)、公钥密码(非对称加密)、安全协议;
对称加密
定义:
加密和解密使用的相同的密钥;
设计原则:
扩散-将明文的统计结构打乱,使得这种结构在密文中不再明显。具体来说,扩散是为了确保明文中的单个位或字符的变化能够影响到密文中多个位置的变化。这样做的目的是使得攻击者无法通过分析密文中的模式来推断出明文。
混乱-使得密文的统计特性与密钥的取值之间的关系尽量复杂,即改变密钥中的任何一个比特都会导致密文发生不可预测的变化。
DES
定义:
DES(Data Encryption Standard)是1977年美国联邦信息处理标准(FIPS)中所采用的一种对称密码(FIPS46.3)。
应用场景:
被美国以及其他国家的政府和银行等广泛使用;
现状:
DES的密文可以在短时间内被破译,现阶段基本不在使用;
核心:
将64bit的明文加密成64bit的密文;
密钥长度,规格上是64bit,其中8bit的错误检查位,56bit真实密钥;
以64bit为一个单位进行加密,该方法为分组加密的一种;
代码实现:
import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
// 工具类
// 辅助函数,用于将字节数组转换成十六进制字符串
private static String bytesToHex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02X", b));
}
return sb.toString();
}
// DES算法 之 密码生成
public Key DESKey() {
// 创建一个DES算法的KeyGenerator对象
KeyGenerator keyGen = null;
try {
keyGen = KeyGenerator.getInstance("DES");
// 初始化此密钥生成器,使其具有确定的密钥大小
keyGen.init(56); // DES密钥长度固定为56位
// 生成一个密钥
SecretKey secretKey = keyGen.generateKey();
System.out.println(secretKey.getEncoded().length); // 结果是8
return secretKey;
// 密钥支持某种编码(即它可以被序列化为字节数组),那么 getEncoded() 方法会返回一个包含密钥信息的字节数组。
// 密钥长度最后应该是64bit
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
main方法:
//DES 密钥生成 加解密;
Key key = new encryptDecrypt().DESKey();
byte[] result = key.getEncoded();
System.out.println("密钥:**********");
System.out.println("密钥 string:"+result.toString()); // 密钥 string:[B@cb5822
// 上述表示会多一个符号 [ 需要将其去掉; 真实使用不能用toString的方法
System.out.println("密钥 长度:"+result.length); // 密钥 长度:8
System.out.println("密钥 十六进制:"+bytesToHex(result)); // 密钥 十六进制:02ECD0314A75BA4F
// 16进制 那么64位 就是16个数字
String encryptedText = "";
// 加密
System.out.println("加密: **********");
// 创建Cipher对象并初始化为加密模式
Cipher cipheren = null;
Cipher cipherde = null;
try {
cipheren = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipheren.init(Cipher.ENCRYPT_MODE, key );
// 明文
String plainText = "Hello, World!";
byte[] plainTextBytes = plainText.getBytes();
// 加密过程
byte[] encryptedBytes = cipheren.doFinal(plainTextBytes);
encryptedText = Base64.getEncoder().encodeToString(encryptedBytes);
System.out.println("Encrypted Text: " + encryptedText); // Encrypted Text: 8u9aORKY2aElbp7bimAFNg==
} catch (Exception e) {
throw new RuntimeException(e);
}
// 解密
System.out.println("解密: **********");
byte[] encryptedBytes = Base64.getDecoder().decode(encryptedText);
// 解密过程
byte[] decryptedBytes = new byte[0];
try {
cipherde = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipherde.init(Cipher.DECRYPT_MODE, key);
decryptedBytes = cipherde.doFinal(encryptedBytes);
String decryptedText = new String(decryptedBytes);
System.out.println("Decrypted Text: " + decryptedText); // Decrypted Text: Hello, World!
} catch (Exception e) {
throw new RuntimeException(e);
}
3DES
定义:
是基于DES研发的,为了增强其强度,将DES重复3次所得到;
加密:明文——加密1——密文1——解密2——密文2——加密3——密文3
解密:密文3——解密3——密文2——加密2——密文1——解密1——明文
核心:
每个密钥56位,再加上错误检测位8位,三个密钥,总共是192位;
如果三个密钥都相同,则3DES = DES;
常见模式为为:EDE(加密-解密-加密)和EDE3(加密-解密-加密,第三个密钥不同于前两个)
代码实现: