对称加密与非对称加密🚀

597 阅读11分钟

什么是加密?

密码学是研究编制密码和破译密码的技术科学。以数学为基础,在加密和解密、攻击和防守、矛和盾的对抗过程中交替发展起来。从数学算法的角度看,它包含对称密码算法非对称密码算法杂凑算法

不过在进一步了解之前,我们得了解一些基本概念。

明文:未被加密过的原始数据

密文:明文被某种加密算法加密之后会变成密文,从而确保原始数据的安全。密文也可以被解密,得到原始的明文。

密钥:密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的参数。密钥分为对称密钥与非对称密钥,分别应用在对称加密和非对称加密上

对称加密

加密和解密时使用的是同一个密钥,这种加密方法称为对称加密,也称为单密钥加密。

c2499a456237e960142a52921c3d0f4.png

加密过程如下:明文 + 加密算法 + 私钥 => 密文

解密过程如下:密文 + 解密算法 + 私钥 => 明文

优点:算法公开、计算量小、加密速度快、加密效率高。

缺点:由于对称加密的算法是公开的,所以一旦私钥被泄露,那么密文就很容易被破解,所以对称加密的缺点是密钥安全管理困难。如果一方的秘钥被泄露,那么加密信息也就不安全了。

加密类型

根据加密方式的不一样,对称加密算法又分为两种:流加密和块加密。

流加密

即每次只对明文中的单个位或单个字节进行加密操作。

优点:能够实时进行数据传输和解密

缺点:抗攻击能力比较弱。

块加密

又称为分组加密,即每次对明文中的一组数据进行加密操作。现在使用的分组加密算法典型的分组长度是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 具有更好的 安全性、效率 和 灵活性。

非对称加密

非对称加密算法需要两个密钥来进行加密和解密,这两个密钥是公开密钥和私有密钥。

公开密钥与私有密钥是一对。

如果用公钥对数据进行加密,只有用对应的私钥才能解密。

如果用私钥对数据进行加密,只有用对应的公钥才能解密。 7ff03786c5d167fc506a6c60dc56cd9.png

模仿一下工作过程~

工作过程

  1. 乙方生成一对密钥(公钥和私钥)并将公钥公开。
  2. 甲方使用公钥对机密信息进行加密,发送给乙方。
  3. 乙方用自己保存的另一把密钥(私钥)对加密后的信息进行解密。

在传输过程中,即使截获了传输的密文,并得到了乙的公钥,也无法破解密文,因为只有乙的私钥才能解密密文。

同样,如果乙要回复加密信息给甲,那么需要甲先公布甲的公钥给乙用于加密,甲自己保存甲的私钥用于解密。

被公钥加密过的密文只能被私钥解密,过程如下

明文 + 加密算法 + 公钥 => 密文

密文 + 解密算法 + 私钥 => 明文

非对称加密算法比较(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一样流行的消息摘要算法,然而SHA1MD5的安全性更强。对于长度小于2^64位的消息,SHA1 会产生一个 160 位的 消息摘要。基于 MD5SHA1的信息摘要特性以及不可逆 (一般而言),可以被应用在检查文件完整性以及数字签名场景

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 为每个线程缓存一个实例可以避免进行锁操作。

到这关于对称加密与非对称加密就告一段落了!!还麻烦大家提出意见~