什么是加密?
密码学是研究编制密码和破译密码的技术科学。以数学为基础,在加密和解密、攻击和防守、矛和盾的对抗过程中交替发展起来。从数学算法的角度看,它包含对称密码算法
、非对称密码算法
和杂凑算法
。
不过在进一步了解之前,我们得了解一些基本概念。
明文:未被加密过的原始数据
密文:明文被某种加密算法加密之后会变成密文,从而确保原始数据的安全。密文也可以被解密,得到原始的明文。
密钥:密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的参数。密钥分为对称密钥与非对称密钥,分别应用在对称加密和非对称加密上
对称加密
加密和解密时使用的是同一个密钥
,这种加密方法称为对称加密,也称为单密钥加密。
加密过程如下:明文 + 加密算法 + 私钥 => 密文
解密过程如下:密文 + 解密算法 + 私钥 => 明文
优点
:算法公开、计算量小、加密速度快、加密效率高。
缺点
:由于对称加密的算法是公开的,所以一旦私钥被泄露,那么密文就很容易被破解,所以对称加密的缺点是密钥安全管理困难。如果一方的秘钥被泄露,那么加密信息也就不安全了。
加密类型
根据加密方式的不一样,对称加密算法又分为两种:流加密和块加密。
流加密
即每次只对明文中的单个位或单个字节进行加密操作。
优点
:能够实时进行数据传输和解密
缺点
:抗攻击能力比较弱。
块加密
又称为分组加密,即每次对明文中的一组数据进行加密操作。现在使用的分组加密算法典型的分组长度是64位,这个长度大到足以防止破译攻击,而又小到足以方便使用。
优点
:抗攻击能力强
缺点
:实时性差
算法模式是块加密法中一系列基本算法步骤的组合,块加密法常用的加密模式:电子编码簿模式(ECB),加密块链接模式(CBC),加密反馈模式(CFB),输出反馈模式(OFB),计数器模式(CTR)
。
电子编码簿模式(ECB)
最简单的操作模式,将输入明文消息分为64位块,然后单独加密每个块,消息中所有块使用相同密钥加密。
ECB中共同一个密钥加密消息的所有块,如果原消息中有明文块重复,那相应的密文块也会一样。如果输入中一个明文块多次出现,则输出中相应的密文块也会多次出现,从而让攻击者找到漏洞进行破解。
为了解决ECB相同明文产生相同密文的问题,加密块链接模式(CBC)出现了。
加密块链接模式(CBC)
CBC加密模式所有明文块加密依旧使用相同密钥,但使用了反馈机制,保证了即使输入中明文块相同,也能得到不同的密文块。
一开始接受两个输入:明文1和一个随机文本块(Initialization Vector),称为初始变量
初始变量没有什么特别意义,只是为了使得每个消息唯一。
加密时第一步使用IV和明文1作异或运算,加密后得到密文1,第二步用密文1和明文2作异或运算,加密后得到密文2,后面依此类推。
由于不是所有的应用程序都能处理块,所以面向字符的应用程序也需要安全性。这时候要使用流加密法,可以使用加密反馈模式。
加密反馈模式(CFB)
加密反馈模式中,数据用更小的单元加密(可以是8位,即一个字符的长度),这个长度小于定义的块长(通常是64位)。假设我们一次处理j位(j通常取8)。
第一步:与CBC模式一样,加密反馈模式也使用64位的初始化向量。初始化向量放在移位寄存器中,第一步产生相应的64位初始化向量密文
第二步: 加密初始化向量最左边的j位与明文前j位进行异或运算,产生密文第一部分密文C。
第三步:初始化向量的位左移j位,使移位寄存器最右边的j位为不可预测的数据,在其中填入C的内容。
第四步:重复1~3步,直到加密所有明文单元
汇总一下:
输出反馈模式(OFB)
与与CFB很相似,唯一差别是,CFB中下一阶段移位寄存器最右边的j位填的是前一阶段的密文j位,而在OFB中,I下一阶段移位寄存器最右边的j位填的是前一阶段的加密后的IV前j位。
计数器模式(CTR)
计数器模式与OFB模式非常类似。它使用序号(称为计数器)作为算法的输入。每个块加密后,要填充到寄存器中,使用下一个寄存器值。通常使用一个常数作为初始计数器的值,并且每次迭代后递增(通常是增加1)。计数器块的大小哎等于明文块的大小。
加密时,计数器加密后与明文块作XOR运算,得到密文。
对称加密算法比较(AES比较好)
DES
全称为Data Encryption Standard
,即数据加密标准。
DES是一种块加密算法,按64位块长加密数据,即把64位明文作为DES的输入,产生64位密文输出。
DES使用56位密钥。实际上,最初的密钥为64位,但在DES过程开始之前放弃密钥的每个第八位,从而得到56位密钥,即放弃第8、16、24、32、40、48、56、64位。
原理:
3DES
三重DES,就是三次执行DES,分为两个大类
(1)三个密钥的三重DES
首先用密钥K1加密明文块P,然后用密钥K2加密,最后用密钥K3加密,其中K1,K2,K3各不相同
(2)两个密钥的三重DES
AES
AES 加密算法是密码学中的 高级加密标准,该加密算法采用 对称分组密码体制,密钥长度的最少支持为 128 位、 192 位、256 位,分组长度 128 位,算法应易于各种硬件和软件实现。这种加密算法是美国联邦政府采用的 区块加密标准。AES 本身就是为了取代 DES 的,AES 具有更好的 安全性、效率 和 灵活性。
非对称加密
非对称加密算法需要两个密钥来进行加密和解密,这两个密钥是公开密钥和私有密钥。
公开密钥与私有密钥是一对。
如果用公钥对数据进行加密,只有用对应的私钥才能解密。
如果用私钥对数据进行加密,只有用对应的公钥才能解密。
模仿一下工作过程~
工作过程
:
- 乙方生成一对密钥(公钥和私钥)并将公钥公开。
- 甲方使用公钥对机密信息进行加密,发送给乙方。
- 乙方用自己保存的另一把密钥(私钥)对加密后的信息进行解密。
在传输过程中,即使截获了传输的密文,并得到了乙的公钥,也无法破解密文,因为只有乙的私钥才能解密密文。
同样,如果乙要回复加密信息给甲,那么需要甲先公布甲的公钥给乙用于加密,甲自己保存甲的私钥用于解密。
被公钥加密过的密文只能被私钥解密,过程如下:
明文 + 加密算法 + 公钥 => 密文
密文 + 解密算法 + 私钥 => 明文
非对称加密算法比较(RSA比较好)
RSA算法
RSA 加密算法是目前最有影响力的公钥加密算法,并且被普遍认为是目前 最优秀的公钥方案 之一。RSA 是第一个能同时用于加密和数字签名的算法,它能够抵抗到目前为止已知的所有密码攻击,已被 ISO 推荐为公钥数据加密标准
。
RSA 加密算法 基于一个十分简单的数论事实:将两个大 素数 相乘十分容易,但想要对其乘积进行 因式分解 却极其困难,因此可以将 乘积 公开作为 加密密钥。
RSA算法生成密钥对以及加解密过程:
(1) 选择两个大素数P,Q
设P = 7,Q = 17
(2) 计算N = P x Q
N = 7 x 17 = 119
(3) 选择一个公钥E,使其不是(P - 1)与(Q - 1)的因子
(P - 1) = 6 = 2 x 3
(Q - 1) = 16 = 2 x 2 x 2 x 2
因此我们选的公钥E不能有因子2和3。我们取E = 5
(4) 选择私钥D,满足:(D x E) mod (P - 1) x (Q - 1) = 1(D x 5) mod 6 x 16 = 1
(D x 5) mod 96 = 1
经计算,取D = 77
(5) 加密时,从明文PT计算密文CT:CT = mod N
假设明文为10
CT = mod 119 = 40
(6) 将密文CT发送给接收方
将40发送给接收方
(7) 解密时,从密文CT得到明文PT:PT = mod N
PT = mod 119 = 10
从上述例子可以看出,RSA算法本身很简单,关键是选择正确的密钥。
假设B要接收A的加密消息,首先生成公钥E和私钥D,私钥D自己保留,公钥E和数字N发布出去,攻击者拿到公钥E和数字N,似乎可以通过试错法计算出私钥D。这里就到了问题的关键,从上述例子可以看出,攻击者只要从N中分解出P和Q,就可以破解私钥。我们上述例子中选择的N很小,实际N是很大的,而大素数分解是极其困难的。
ECC算法
ECC 也是一种 非对称加密算法,主要优势是在某些情况下,它比其他的方法使用 更小的密钥,比如 RSA 加密算法,提供 相当的或更高等级 的安全级别。不过一个缺点是 加密和解密操作 的实现比其他机制 时间长 (相比 RSA 算法,该算法对 CPU 消耗严重)。
ECC全称为elliptic curve cryptography
,即椭圆曲线密码学算法。安全性建立在以下数学困难问题基础之上:
直接看图
不需要密钥的散列算法
加密算法分对称加密和非对称加密。此外,还有一类不需要密钥
的散列算法
。散列算法主要有 SHA-1、MD5
等。
散列算法比较
MD5算法
MD5 用的是哈希函数
,它的典型应用是对一段信息产生信息摘要,以防止被篡改
。严格来说,MD5 不是一种 加密算法 而是摘要算法。无论是多长的输入,MD5都会输出长度为 128bits 的一个串 (通常用 16 进制表示为32个字符)。
public static final byte[] computeMD5(byte[] content) {
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
return md5.digest(content);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
SHA1算法
SHA1
是和MD5
一样流行的消息摘要算法
,然而SHA1
比MD5
的安全性更强。对于长度小于2^64
位的消息,SHA1
会产生一个 160 位的 消息摘要。基于 MD5
、SHA1
的信息摘要特性以及不可逆 (一般而言),可以被应用在检查文件完整性以及数字签名
场景
public static byte[] computeSHA1(byte[] content) {
try {
MessageDigest sha1 = MessageDigest.getInstance("SHA1");
return sha1.digest(content);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
HMAC算法(类似于密钥的)
MAC
是密钥相关的哈希运算消息认证码
(Hash-based Message Authentication Code),HMAC
运算利用 哈希算法 (MD5、SHA1 等),以一个密钥和一个消息为输入,生成一个消息摘要作为输出。HMAC
发送方和接收方都有的key进行计算,而没有这把key的第三方,则是无法计算出正确的散列值的,这样就可以防止数据被篡改。
注意:HMAC
算法实例在多线程环境下是不安全的。但是需要在多线程访问时,进行同步的辅助类,使用 ThreadLocal
为每个线程缓存一个实例可以避免进行锁操作。
到这关于对称加密与非对称加密就告一段落了!!还麻烦大家提出意见~