密码学
密码学:主要是研究编制密码和破译密码的学科
密码学的主要目的:研究如何隐藏信息并且把信息传递出去的一个学科
1.1古典密码学
核心原理:替代法,移位法
凯撒加密
频度分析进行破译密码,在不知道密码的规则前提下,进行破译密码
如何设置密码才比较安全
1.2近代密码学
核心原理:替代法,移位法
1.3现代密码学
- 散列函数
MD5,SHA-1,SHA-256,SHA-512 - 对称加密
DES加密和解密,AES机密和解密
对称加密的核心原理:流加密,块加密
toString()和new String()核心原理和区别
加密模式:ESB,CBC
填充模式:NoPadding和PKCS5Padding - 非对称加密
非对称加密的特点
RSA算法和ECC算法
数字摘要
base64核心加密原则,和base64原理
数字签名和数字证书
keytool工具
1.4密码学的基本概念
密码:微信,QQ,支付宝,银行什么时候开始已经在使用
密码学:网络安全,信息安全,区块链这些学科的基础
密码学已经存在好几千年
1.5密码学的历史
1.5.1古典密码学
古代就已经开始使用密码,目的:就是希望保护信息
替换法
就是使用固定的信息,将原文替换成密文
例如:bee,将b替换成w,e替换p,单词就变成wpp
替换法的加密方式:第一种:单表提花,第二种:多表替换
单表替换:原文和密文使用的是同一张表
例如:abcde -->swtrp
多表替换:表示是有多张表,原文和密文进行对比
表单1:abcde-swtrp 、表单2:abcde-chfhk 、表单3:abcde-jftou
原文:bee
秘钥:312
秘文:fpk
移位法
移位法,是按照字母,在字母表上面的位置,进行移位
凯撒加密:位移法
例如 (往后移动两位):abcde -----> cdefg
古典密码学的破解方式
频率分析法:概率论
1.5.2近代密码学
恩尼格玛密码机 核心使用的也是移位法和替换法,后来被图灵(人工智能之父)破解了
1.5.3现代密码学
散列函数
散列函数,也叫做哈希函数,常见的加密方式:MD5,SHA-1,SHA-256
对称加密
对称加密,使用的加密方式和解密方式,使用的是同一把秘钥
非对称加密
非对称加密,有两把秘钥,使用公钥加密,必须使用私钥解密,或者私钥加密,必须使用公钥解密
1.5.4如何设置密码才安全
- 密码不要太常见,不要使用123456作为密码
- 各个应用软件里面的密码不要设置一样,撞库
- 在设置密码的时候,可以加一些图书的标记,注册京东,jd,zfb,szsgg
1.5.5凯撒加密和凯撒解密
原理:是吧26个字母,进行位移,往右边或者往左边位移,在位移的时候,需要注意的是,最多只能移动25位
public static void main(String[] args) {
//定义原文
String input = "Hello World";
//把原文右移动3位
int key = 3;
String s = encryptKarser(input, key);
System.out.println("密文---->" + s);
String s1 = descryptKarser(s, key);
System.out.println("明文---->" + s1);
}
/**
* 凯撒解密
* @param s
* @param key
* @return
*/
private static String descryptKarser(String s, int key) {
//把字符串变成字节数组
char[] chars = s.toCharArray();
StringBuilder stringBuilder = new StringBuilder();
for (char aChar : chars) {
int b = aChar;
//往左边移动3位
b = b - key;
char newB = (char)b;
stringBuilder.append(newB);
}
return stringBuilder.toString();
}
/**
* 凯撒加密
* @param input
* @param key
* @return
*/
private static String encryptKarser(String input, int key) {
//把字符串变成字节数组
char[] chars = input.toCharArray();
StringBuilder stringBuilder = new StringBuilder();
for (char aChar : chars) {
int b = aChar;
//往右边移动3位
b = b + key;
char newB = (char)b;
stringBuilder.append(newB);
}
return stringBuilder.toString();
}
1.6频率分析法
目的:在不知道秘钥的情况下,也想进行破解密文
原理;比如以英文为例:字母e,出现的频率是最高的,第二个频率最高的是t,然后就是a,当我们拿到密文的时候,密文里面也会出现一个频率最高的字母,假设密文里面出现频率最高的是j,可以假设密文里面的j,就是明文里面的e,假设密文里面出现第二个高的字母,就是明文当中的t。
1.7对称加密
特点:
- 加密速度快
- 密文不可逆转,秘钥不能泄露
- 如果在编码表找不到对应的字符,会出现乱码
- 一般需要结合base64一起使用
1.7.1加密和解密
DES(Data Encryption Standard)是一种对称加密算法,所谓对称加密就是加密和解密都是使用同一个密钥。秘钥key必须是八位字符。
1.7.2base64
base64介绍
base64不是加密算法,是可读性算法
base64不是为了保护我们的数据,而是为了可读性
base64是由64个字符组成,大写A-Z,小写a-z,数字0-9,两个符号,+和/
base64一般用在上的一种加密编码
base64和base58的区别
在base58里面,没有数字0和字母o,没有大写字母I和小写字母i,也没有+和/
base64原理
base64 是三个字节位一组,一共是24位,base64把三个字节换成四组,每组六位,一个字节应该是八位,缺少两位,那么就会在高位补0,这样做得好处,base去后面六位,去掉前面两位,这样可以控制在0-63之间
111 111 = 32 + 16 + 8 + 4 + 2 + 1 = 63
在base64里面,要设置一共3个字节位一组,如果不够的话,就需要使用=好进行补齐
1.8toString 和new String的区别
new String====>MM#WLAN#DFDJWIOOAIIFIAU#+KJFKDKFHAHFOAJHOA=
toString=====>[B@1540e19d
注意:如果在使用编码,进行加密好解密的时候,需要使用new String()的方式
区别:
str.toString 方法,这个方法调用的实际上是Object,里面的toString方法,一般Object中的toString方法返回的是哈希值,也就是地址。
new String()方法:是根据参数,参数是一个字节数组,使用java虚拟机默认编码格式,会把字节数组decode,找到对应字符,如果虚拟机编码格式是ISO-8859-1的话,会去找ascii里面的编码进行参照,找到对应的字符。
1.9加密模式
ESB:把一段文本进行分拆加密,使用同一把key进行加密,然后组合到一起
CBC:在进行加密的时候,会取决于前面的iv向量,把前面的向量进行异或处理,后面的明文进行加密的时候,会一直依赖于前面的key
1.10非对称加密
简介:
- 非对称加密,又叫做现代加密算法
- 非对称加密必须有两个秘钥,一个私钥,一个公钥
- 公钥和私钥是一对,我们叫做秘钥对
- 如果使用私钥加密,就必须使用公钥解密
- 如果使用公钥加密,就必须使用私钥解密
常见的非对称加密算法
- RSA
- ECC
1.11数字签名
数字签名:公钥数字签名,只有信息的发送者才能产生别人无法伪造的一段数字串,类似写在纸上的普通物理签名。