Skip to content

LV005-加密简介

一、概述

随着互联网的发展,信息安全问题日益受到重视。我们平时的工作中,可能也在很多地方用到了加密、解密,比如:

  • 用户的密码不能明文存储,要存储加密后的密文
  • 用户的银行卡号、身份证号之类的敏感数据,需要加密传输
  • 还有一些重要接口,比如支付,客户端要对请求生成一个签名,服务端要对签名进行验证

加密算法是一种用于保护数据安全和隐私的技术,它可以将任意长度的数据(称为“明文”)转换为固定或者可变长度的字符串(称为“密文”)。加密算法的作用是将数据进行有规则的变换,从而使得只有掌握正确的密钥的人才能恢复原始的数据。

加密算法在数据安全、数据传输、数据认证等领域有着广泛的应用,例如:

  • 数据安全:加密算法可以用来保护数据不被未经授权的人员窃取或者篡改,例如文件加密、硬盘加密、密码管理等。通过使用合适的加密算法和密钥,可以确保数据只能被拥有正确权限的人员访问和修改。

  • 数据传输:加密算法可以用来保护数据在网络上的传输过程中不被截取或者篡改,例如 HTTPS、SSL/TLS、VPN 等。通过使用合适的加密算法和协议,可以确保数据在发送方和接收方之间进行安全和可靠的通信。

  • 数据认证:加密算法可以用来验证数据的来源和完整性,例如数字签名、消息摘要、验证码等。通过使用合适的加密算法和机制,可以确保数据是由真实且可信的发送方发送,并且没有在传输过程中被修改或者损坏。

二、基本概念

加密算法的原理是将输入的数据按照一定的数学函数或者逻辑规则进行运算,从而得到一个不同于原始数据的输出。不同的加密算法有不同的运算函数或者规则,但通常都包括以下几个要素:

  • 明文:输入到加密算法中的原始数据,可以是任意格式的文本、数字、文件等。
  • 密钥:用于控制加密算法的参数,可以是一个数字、一个字符串、一个文件等。密钥决定了加密算法的输出结果,只有拥有正确的密钥才能对数据进行加密或者解密。
  • 加密函数:用于将明文和密钥进行运算,从而得到一个与明文不同的输出,称为密文。加密函数是一个单向函数,即给定明文和密钥,可以很容易地计算出密文,但给定密文和密钥,却很难计算出明文。
  • 密文:输出到加密算法中的变换后的数据,通常是一串看似无意义的字符。密文只有经过解密函数才能恢复成明文。

举个例子,假设我们使用凯撒密码这种简单的加密算法,它可以将任意长度的英文字母转换为另外一些英文字母。凯撒密码的运算规则如下:

  • 明文:输入到凯撒密码中的英文字母,例如“HELLO”。
  • 密钥:用于控制凯撒密码的偏移量,即每个字母向后移动多少位,例如“3”。
  • 加密函数:用于将明文和密钥进行运算,即将每个字母向后移动指定位数,并在 Z 之后回到 A,从而得到一个与明文不同的输出,例如“KHOOR”。
  • 密文:输出到凯撒密码中的变换后的英文字母,例如“KHOOR”。

说明:凯撒密码是最早的代换密码,使用单表代换。其基本思想是:通过把字母移动一定的位数来实现加密和解密。明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是 3 的时候,所有的字母 A 将被替换成 D,B 变成 E,以此类推 X 将变成 A,Y 变成 B,Z 变成 C。位数就是凯撒密码加密和解密的密钥。

三、加密算法分类

根据加密结果是否可以被解密,算法可以分为可逆加密和不可逆加密(单向加密),从这个意义上来说,单向加密只能称之为加密算法而不是加解密算法。对于可逆加密,又可以根据密钥的的对称性分为对称加密和非对称加密。具体的分类结构如下:

image-20251212105405305

几个概念:

  • 不可逆加密的算法的加密是不可逆的,密文无法被还原成原文。

  • 可逆加密的算法顾名思义就是可逆的,密文可以被还原。

  • 对称加密:指使用相同或者可推导出来的密钥进行加解密的加密算法。对称加密通常具有较高的速度和效率,但也存在着如何安全地传输和保存共享秘钥等问题。常见的对称加密算法有 DES、AES、RC4 等。

  • 非对称加密:指使用不同且无法推导出来的一对公钥和私钥进行加解密的加密算法。非对称加密通常具有较高的安全性和可靠性,但也存在着如何验证公钥真实性等问题。常见的非对称加密算法有 RSA、ECC、DSA 等。

四、常见加解密算法简介

1. 不可逆算法

散列算法,就是一种不可逆算法。散列算法中,明文通过散列算法生成散列值,散列值是长度固定的数据,和明文长度无关。散列算法的具体实现有很多种,常见的包括 MD5、SHA1、SHA-224、SHA-256 等等。散列算法常用于数字签名、消息认证、密码存储等场景。散列算法是不需要密钥的,当然也有一些不可逆算法,需要密钥,例如 HMAC 算法。

图片

1.1 MD5 算法

MD5,全称为“Message-Digest Algorithm 5”,翻译过来叫“信息摘要算法”。它可以将任意长度的数据通过散列算法,生成一个固定长度的散列值。MD5 算法的输出长度为 128 位,通常用 32 个 16 进制数表示。有以下特点:

(1)生成 128 位的信息摘要。

(2)哈希值的微小变化会产生完全不同的哈希结果。

(3)计算 MD5 哈希值很快。

(4)MD5 是一种单向哈希算法, 无法通过哈希值反算出原文。

(5)MD5 在强碰撞攻击下不安全, 通常用于数据完整性验证, 不用于数字签名。

1.2 SHA-256 算法

SHA(Secure Hash Algorithm)系列算法是一组密码散列函数,用于将任意长度的数据映射为固定长度的散列值。SHA 系列算法由美国国家安全局(NSA)于 1993 年设计,目前共有 SHA-1、SHA-2、SHA-3 三种版本。

其中 SHA-1 系列存在缺陷,已经不再被推荐使用。SHA-2 算法包括 SHA-224SHA-256SHA-384SHA-512 四种散列函数,分别将任意长度的数据映射为 224 位、256 位、384 位和 512 位的散列值。

SHA-2 算法之所以比 MD5 强,主要有两个原因:

  • 散列值长度更长:例如 SHA-256 算法的散列值长度为 256 位,而 MD5 算法的散列值长度为 128 位,这就提高了攻击者暴力破解或者彩虹表攻击的难度。
  • 更强的碰撞抗性:SHA 算法采用了更复杂的运算过程和更多的轮次,使得攻击者更难以通过预计算或巧合找到碰撞。

2. 可逆加密算法

2.1 对称加密算法

对称加密算法,使用同一个密钥进行加密和解密。加密和解密过程使用的是相同的密钥,因此密钥的安全性至关重要。如果密钥泄露,攻击者可以轻易地破解加密数据。常见的对称加密算法包括 DES、3DES、AES 等。其中,AES 算法是目前使用最广泛的对称加密算法之一,具有比较高的安全性和加密效率。

图片
2.1.1 DES 算法

DES(Data Encryption Standard)算法是一种对称加密算法,由 IBM 公司于 1975 年研发,是最早的一种广泛应用的对称加密算法之一。DES 算法使用 56 位密钥对数据进行加密,加密过程中使用了置换、替换、异或等运算,具有较高的安全性。被广泛用于金融、通信等领域。有以下特点:

(1)对称加密算法: 加密和解密使用相同的密钥。

(2)分组加密: 明文被分成 64 位的组, 每组用相同的密钥进行加密。

(3)密钥长度为 56 位, 经过置换选择、循环左移等操作生成 16 轮子密钥。

(4)加密流程包括初始置换、16 轮迭代运算、初始逆置换等。

(5)算法结构相对简单, 运算速度快。

DES 的算法速度较快,但是在安全性上面并不是最优选择,因为 DES 算法的密钥长度比较短,被暴力破解和差分攻击的风险比较高,一般推荐用一些更安全的对称加密算法,比如 3DES、AES。

2.1.2 AES 算法

AES(Advanced Encryption Standard)即高级加密标准,是一种对称加密算法,被广泛应用于数据加密和保护领域。AES 算法使用的密钥长度为 128 位、192 位或 256 位,比 DES 算法的密钥长度更长,安全性更高。它被广泛地应用于电子商务、互联网等信息系统中。有以下特点:

(1)使用对称加密, 加解密使用相同密钥。

(2)分组加密, 明文被分成 128 位的块进行处理。

(3)密钥长度可选择 128、192、256 位。

(4)算法结构较复杂, 包括字节替代、行移位、列混淆、轮密钥加等步骤。

(5)安全性高, 抗差分及线性攻击的能力强。

AES 算法采用的密钥长度更长,密钥空间更大,安全性更高,能够有效地抵抗暴力破解攻击。当然,因为密钥长度较长,需要的存储也更多。

2.2 非对称加密算法

图片
2.2.1 RSA 算法

RSA 算法是是目前应用最广泛的非对称加密算法,由 Ron Rivest、Adi Shamir 和 Leonard Adleman 三人在 1978 年发明,名字来源三人的姓氏首字母。有以下特点:

(1)非对称加密: 使用公钥加密, 私钥解密, 两个密钥互为对称。

(2)安全性: RSA 算法的安全性依赖于大整数分解问题的难度。

(3密钥长度通常为 1024 位或 2048 位。密钥越长, 安全性越高, 但加解密速度降低。

(4)适用于数字签名和数据加密。

RSA 算法的优点是安全性高,公钥可以公开,私钥必须保密,保证了数据的安全性;可用于数字签名、密钥协商等多种应用场景。缺点是加密、解密速度较慢,密钥长度越长,加密、解密时间越长;密钥长度过短容易被暴力破解,密钥长度过长则会增加计算量和存储空间的开销。