Java 安全密码学
安全密码学,主要研究的是编制密码和破译密码。
安全密码学的发展历史分为:
古典密码学 ——> 近代密码学 ——> 现代密码学
一、古典密码学
核心: 替换法加密、移位法加密。
1.替换法
替换法就是使用固定的信息,将原文替换成密文。
例如:bee, 将b替换成w,e替换成p,那单词就变为wpp。
替换法的加密方式有两种,分别为:单表替换、多表替换。
- 单表替换:原文和密文使用的是同一张表(简单)。
- 多表替换:又多张表,原文和密文进行对比。
表单1:abcde - swtrp、表单2:abcde-chfhk、表单3:abcde-jftou
原文:bee 密钥:312 密文:fpk
2.移位法
移位法:按照字母,在字母表上面的位置进行移动。其中:最著名的是凯撒加密。
凯撒加密:
例子:abcde ——> 移2位 ——> cdefg
3.古典密码学破译方式:
使用频度分析法破译密码:在不知道密码的规则前提下,进行破译密码。
频率分析基于如下原理:在任何一种书面语言中,不同的字母或字母组合出现的频率各不相同。而且,对于以这种语言书写的任意一段文本,都具有大致相同的特征字母分布。
比如,在英语中,字母E出现的频率很高,而X则出现得较少。类似地,ST、NG、TH,以及QU等双字母组合出现的频率非常高,NZ、QJ组合则极少。英语中出现频率最高的12个字母可以简记为“ETAOIN SHRDLU”。在一个简单的替换密码中,明文中的每一个字母都被另一个字母替换,而且且明文中相同的字母在转换为密文时总是被同一个字母所替换。比如,所有的e都会被替换成 X.一个含有大量X的密文消息会向密码破译者暗示X替换e.
二、近代密码学
概率论出现后,古典密码学的安全性大大降低,为了保证密码的安全,在古典密码学的基础上进行了完善和优化,就有了近代密码学。
核心: 替换法加密、移位法加密
代表:恩尼格玛密码机:流加密,使用的也是移位法和替换法。 后面被图灵破解了。
三、现代密码学
1. 散列函数
MD5,SHA-1,SHA-256,SHA-512
2. 对称加密
对称加密,加密和解密时,使用的同一把密钥,所以一般也成为单密钥加密。
主流的加密方式有:DES加密、AES加密。
对称加密的核心原理:流加密、块加密
- 流加密:对信息流中的每一个元素(字母或者比特)作为基本的处理单元进行加密。
- 块加密:先对信息流分块,然后对每块进行加密。
这里需要提一下:古典密码学加密都是属于流加密的范畴。
对称加密的特点:
- 加密速度块,可以加密大文件。
- 密文不可逆。但是如果密钥文件泄露,会导致数据暴露。
- 加密后编码Ascii表找不到对应的字符,出现乱码。
- 一般结合Base64使用。
3. 加密模式
加密模式:https://docs.oracle.com/javase/8/docs/api/javax/crypto/Cipher.html
ECB : Electronic codebook, 电子密码本. 需要加密的消息按照块密码的块大小被分为数个块,并对每个块进行独立加密
- 优点 : 可以并行处理数据
- 缺点 : 同样的原文生成同样的密文, 不能很好的保护数据
- 同时加密,原文是一样的,加密出来的密文也是一样的
CBC : Cipher-block chaining, 密码块链接. 每个明文块先与前一个密文块进行异或后,再进行加密。在这种方法中,每个密文块都依赖于它前面的所有明文块.
- 优点 : 同样的原文生成的密文不一样
- 缺点 : 串行处理数据,加密耗时长.
4. 填充模式
当需要按块处理的数据, 数据长度不符合块处理需求时, 按照一定的方法填充满块长的规则。填充模式分为:NoPadding、PKCS5padding。
NoPadding:不填充
在DES加密算法下, 要求原文长度必须是8byte的整数倍
在AES加密算法下, 要求原文长度必须是16byte的整数倍
PKCS5Padding:数据块的大小为8位, 不够就补足
需要特别指出的是:
1. 默认情况下, 加密模式和填充模式为 : ECB/PKCS5Padding。
2. 如果使用CBC模式, 在初始化Cipher对象时, 需要增加参数, 初始化向量IV : IvParameterSpec iv = new IvParameterSpec(key.getBytes());
四、非对称加密
非对称加密,有两把密钥,公钥和私钥。
使用公钥加密,必须使用私钥解密。或者使用私钥加密,必须使用公钥解密。
常见的非对称加密算法为:RSA算法和ECC算法
对称加密和非对称加密的比较:
一般在使用的时候,会通过非对称加密传输密钥,对称加密传输数据,数据摘要算法保证数据的完整性。而这样的方式正是Https的密码套件的基本原理:
五、安全加密相关概念解析
1. Base64
Base64 不是加密算法,而是可读性算法,目的不是为了保护我们的数据,目的是为了可读性。
Base64 是由64个字符组成,A-Z,a-z,0-9, + 和 /
Base58 一般用在比特币的编码。在Base58里面没有字母o,大写字母I和小写字母i,也没有+ / 也没有数字0
Base64 的原理
Base64的,是三个字节为一组,一个字节是8位,一共是24位。Base64会把三个字节转换为4组,每组6位。
一个字节,应该是8位,那么分组后会缺少两位,在高位补0,这样做的好处是,Base64取后面6位,前面的2位去掉后就能够把Base64控制在0-63之间。
Base 64 需要设置三个字节为一组,输出的时候,如果不够三个字节,就需要使用=进行补齐。
2. toString 和 newString()的核心原理和区别.
- toString 方法:实际调用的是 object.toString 的方法,一般在 object 的 toString 方法中,返回的是哈希值。
- new String 方法:是根据传的参数,如果参数是一个字节数组,就会使用 java 虚拟机默认的编码格式,把这个字节数组进行decode,找到对应的字符,如果虚拟机的编码格式是ISO-8859-1,那么就回去ASCII编码表里进行参照,找到对应的字符。
那么什么时候使用new String, 什么时候使用 toString ?
- 在进行数据转码的时候,使用new String
- 打印对象或者得到地址的时候,可以使用 toString。
3.消息摘要
概念:消息摘要(Message Digest)又称为数字摘要(Digital Digest)。它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生。使用数字摘要生成的值是不可以篡改的,为了保证文件或者值的安全
特点:无论输入的消息有多长,计算出来的消息摘要的长度总是固定的。例如应用MD5算法摘要的消息有128个比特位,用SHA-1算法摘要的消息最终有160比特位的输出。只要输入的消息不同,对其进行摘要以后产生的摘要消息也必不相同;但相同的输入必会产生相同的输出。消息摘要是单向、不可逆的。
常见算法 : MD5、SHA1、SHA256、SHA512
4.数字签名
数字签名(又称公钥数字签名)是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。它是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术来实现的,用于鉴别数字信息的方法。
一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。数字签名是非对称密钥加密技术与数字摘要技术的应用。而数字签名呢?其实也是同样的道理,他的含义是:在网络中传输数据时候,给数据添加一个数字签名,表示是谁发的数据,而且还能证明数据没有被篡改。数字签名的主要作用就是保证了数据的有效性(验证是谁发的)和完整性(证明信息没有被篡改)。
数字签名的过程:
对信息做摘要,用私钥加密摘要。密文即签名。数字签名一般会和信息一起发送。
验证时数字签名,会用同样的算法对消息做摘要,然后用公钥解密密文,对比结果,来判断数据是否被篡改。