一、CRC校验

循环冗余校验码(CRC),简称循环码,是一种常用的、具有检错、纠错能力的校验码,在早期的通信中运用广泛。循环冗余校验码常用于外存储器和计算机同步通信的数据校验。奇偶校验码和海明校验码都是采用奇偶检测为手段检错和纠错的(奇偶校验码不具有纠错能力),而循环冗余校验则是通过某种数学运算来建立数据位和校验位的约定关系的。 [1-2]

中文名循环冗余校验码外文名Cyclic Redundancy Check(CRC)编码规则前部分是信息码移位原信息码(kbit)左移r位

1、简介

循环冗余校验码(cyclie redundancy check)简称CRC(循环码),是一种能力相当强的检错、纠错码,并且实现编码和检码的电路比较简单,常用于串行传送(二进制位串沿一条信号线逐位传送)的辅助存储器与主机的数据通信和计算机网络中。 [3]

循环码是指通过某种数学运算实现有效信息与校验位之间的循环校验(而海明码是一种多重校验)。
这种编码基本思想是将要传送的信息M(X)表示为一个多项式L,用L除以一个预先确定的多项式G(X),得到的余式就是所需的循环冗余校验码。 这种校验又称多项式校验。

理论上可以证明循环冗余校验码的检错能力有以下特点:①可检测出所有奇数位错;②可检测出所有双比特的错;③可检测出所有小于、等于校验位长度的突发错。

2、校验位的生成

循环冗余校验码由信息码n位和校验码k位构成。k位校验位拼接在n位数据位后面,n+k为循环冗余校验码的字长,又称这个校验码(n+k,n)码。

n位信息位可以表示成为一个报文多项式M(x),最高幂次是xn-1。约定的生成多项式G(x)是一个k+1位的二进制数,最高幂次是xk。将M(x)乘以xk,即左移k位后,除以G(x),得到的k位余数就是校验位。这里的除法运算是模2除法,即当部分余数首位是1时商取1,反之商取0。然后每一位的减法运算是按位减,不产生借位。

3、CRC检错和纠错

CRC码存储或传送后,在接收方进行校验过程,以判断数据是否有错,若有错则进行纠错。一个CRC码一定能被生成多项式整除,所以在接收方对码字用同样的生成多项式相除,如果余数为0,则码字没有错误;若余数不为0,则说明某位出错,不同的出错位置余数不同。对(n,k)码制,在生成多项式确定时,出错位置和余数的对应关系是确定的。 [4]

4、CRC算法参数模型解释

NAME:参数模型名称。
WIDTH:宽度,即CRC比特数。
POLY:生成项的简写,以16进制表示。例如:CRC-32即是0x04C11DB7,忽略了最高位的”1”,即完整的生成项是0x104C11DB7。
INIT:这是算法开始时寄存器(crc)的初始化预置值,十六进制表示。
REFIN:待测数据的每个字节是否按位反转,True或False。
REFOUT:在计算后之后,异或输出之前,整个数据是否按位反转,True或False。
XOROUT:计算结果与此参数异或后得到最终的CRC值。

常见CRC参数模型如下:

CRC算法名称 多项式公式 宽度 多项式 初始值 结果异或值 输入反转 输出反转
CRC-4/ITU x4 + x + 1 4 03 00 00 true true
CRC-5/EPC x5 + x3 + 1 5 09 09 00 false false
CRC-5/ITU x5 + x4 + x2 + 1 5 15 00 00 true true
CRC-5/USB x5+ x2 + 1 5 05 1F 1F true true
CRC-6/ITU x6 + x + 1 6 03 00 00 true true
CRC-7/MMC x7 + x3 + 1 7 09 00 00 false false
CRC-8 x8 + x2+ x + 1 8 07 00 00 false false
CRC-8/ITU x8 + x2+ x + 1 8 07 00 55 false false
CRC-8/ROHC x8 + x2+ x + 1 8 07 FF 00 true true
CRC-8/MAXIM x8 + x5 + x4 + 1 8 31 00 00 true true
CRC-16/IBM x16+ x15+ x2+ 1 16 8005 0000 0000 true true
CRC-16/MAXIM x16 + x15 + x2+ 1 16 8005 0000 FFFF true true
CRC-16/USB x16 + x15 + x2+ 1 16 8005 FFFF FFFF true true
CRC-16/MODBUS x16+ x15+ x2+ 1 16 8005 FFFF 0000 true true
CRC-16/CCITT x16 + x12 + x5+ 1 16 1021 0000 0000 true true
CRC-16/CCITT-FALSE x16 + x12 + x5 + 1 16 1021 FFFF 0000 false false
CRC-16/X25 x16 + x12 + x5+ 1 16 1021 FFFF FFFF true true
CRC-16/XMODEM x16 + x12 + x5+ 1 16 1021 0000 0000 false false
CRC-16/DNP x16 + x13 + x12 + x11 + x10+ x8+ x6+ x5+ x2 + 1 16 3D65 0000 FFFF true true
CRC-32 x32+ x26+ x23+ x22 + x16+ x12+ x11+ x10+ x8+ x7+ x5+ x4+ x2+ x + 1 32 04C11DB7 FFFFFFFF FFFFFFFF true true
CRC-32/MPEG-2 x32 + x26 + x23 + x22 + x16+ x12+ x11 + x10+ x8+ x7+ x5 + x4+ x2+ x + 1 32 04C11DB7 FFFFFFFF 00000000 false false

4、检错计算举例

实际的CRC校验码生成是采用二进制的模2算法(即减法不借位、加法不进位)计算出来的,这是一种异或操作。下面通过一些例子来进一步解释CRC的基本工作原理。假设:
(1) 设约定的生成多项式为G(x)=x4+x+1,其二进制表示为10011,共5位,其中k=4。
(2) 假设要发送数据序列的二进制为101011(即f(x)),共6位。 [5]
(3) 在要发送的数据后面加4个0(生成f(x)*xk),二进制表示为1010110000,共10位。
(4) 用生成多项式的二进制表示10011去除乘积1010110000,按模2算法求得余数比特序列为0100(注意余数一定是k位的)。
(5) 将余数添加到要发送的数据后面,得到真正要发送的数据的比特流:1010110100,其中前6位为原始数据,后4位为CRC校验码。
(6) 接收端在接收到带CRC校验码的数据后,如果数据在传输过程中没有出错,将一定能够被相同的生成多项式G(x)除尽,如果数据在传输中出现错误,生成多项式G(x)去除后得到的结果肯定不为0。

二、MD5校验

1、简介

MD5常常作为文件的签名出现,我们在下载文件的时候,常常会看到文件页面上附带一个扩展名为.MD5的文本或者一行字符,这行字符就是就是把整个文件当作原数据通过MD5计算后的值,我们下载文件后,可以用检查文件MD5信息的软件对下载到的文件在进行一次计算。两次结果对比就可以确保下载到文件的准确性。 另一种常见用途就是网站敏感信息加密,比如用户名密码,支付签名等等。随着https技术的普及,现在的网站广泛采用前台明文传输到后台,MD5加密(使用偏移量)的方式保护敏感数据保护站点和数据安全。

三、AES加密—对称加密算法

1、简介

高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥,具体的加密流程如下图:
image.png

四、RSA加密—非对称加密

1、简介

Ron Rivest、Adi Shamir、Leonard Adleman三人题提出,名字首字母
RSA加密算法是一种典型的非对称加密算法,它基于大数的因式分解数学难题,它也是应用最广泛的非对称加密算法。
非对称加密是通过两个密钥(公钥-私钥)来实现对数据的加密和解密的。公钥用于加密,私钥用于解密。
image.png
image.png

2、加密密钥与解密密钥

  • 在公钥密码体制中,加密密钥 PK(public key,即公钥)是向公众公开的,而解密密钥 SK(secret key,即私钥或秘钥)则是需要保密的。
  • 加密算法 E 和解密算法 D 也都是公开的。
  • 虽然秘钥 SK 是由公钥 PK 决定的,但却不能根据 PK 计算出 SK

3、RSA加密原理

步骤 说明 描述 备注
1 找出质数 P 、Q -
2 计算公共模数 N = P * Q -
3 欧拉函数 φ(N) = (P-1)(Q-1) -
4 计算公钥E 1 < E < φ(N) E的取值必须是整数 E 和 φ(N) 必须是互质数
5 计算私钥D E * D % φ(N) = 1 -
6 加密 C = M E mod N C:密文 M:明文
7 解密 M =C D mod N C:密文 M:明文

公钥=(E , N) 私钥=(D, N)对外,我们只暴露公钥。

(1)找出质数 P 、Q

  1. P = 3 Q = 11

(2)计算公共模数

  1. N = P * Q = 3 * 11 = 33
  2. N = 33

(3)欧拉函数

  1. φ(N) = (P-1)(Q-1) = 2 * 10 = 20
  2. 即φ(N) = 20

(4)计算公钥E

  1. 1 < E < φ(N)
  2. 1 <E < 20

E 的取值范围 {3, 7, 9, 11, 13, 17, 19} E的取值必须是整数, E 和 φ(N) 必须是互质数 为了测试,我们取最小的值 E =3 3 和 φ(N) =20 互为质数,满足条件

(5)计算私钥D

  1. E * D % φ(N) = 1
  2. 3 * D % 20 = 1

根据上面可计算出 D = 7

(6)公钥加密

我们这里为了演示,就加密一个比较小的数字 M = 2

  1. 公式:C ME mod N
  2. M = 2 E = 3
  3. N = 33
  4. C = 23 % 33 = 8

明文 “2” 经过 RSA 加密后变成了密文 “8”

(7)私钥解密

  1. M CD mod N
  2. C = 8 D = 7 N = 33
  3. M = 87 % 33 8 * 8 * 8 * 8 * 8 * 8 * 8 = 2097152
  4. M = 8 * 8 * 8 * 8 * 8 * 8 * 8 % 33 = 2

密文 “8” 经过 RSA 解密后变成了明文 2。
image.png
公钥加密 - 私钥解密流程图
image.png
私钥加密 - 公钥解密流程图

在实际上如果我用私钥加密一段数据(当然只有我可以用私钥加密,因为只有我知道2是我的私钥),结果所有的人都看到我的内容了,因为他们都知道我的公钥是,那么这种加密有什么用处呢?

4、应用

如果某一信息用公开密钥加密,则必须用私有密钥解密,这就是实现保密的方法
如果某一信息用私有密钥加密,那么,它必须用公开密钥解密。这就是实现数字签名的方法

(1)公钥加密,私钥解密—-对数据内容进行加密解密
(2)私有加密,公钥解密—-数字签名(验证)

五、数字签名

1、数字签名的功能

(1)报文鉴别——接收者能够核实发送者对报文的签名,其他人不能伪造对报文的签名(证明来源);
(2)报文的完整性——接收者收到的数据与发送者发送的数据一样(防篡改);
(3)不可否认——发送者事后不能抵赖对报文的签名(防否认)。

可以看出,数字签名的功能不是为了加密

2、数字签名的实现

现在已有多种实现各种数字签名的方法。但采用公钥算法更容易实现

数字签名实现.png
图 数字签名实现

  • 因为除 A 外没有别人能具有 A 的私钥,所以除 A 外没有别人能产生这个密文。因此 B 相信报文 X 是 A 签名发送的,这就是报文的鉴别功能
  • 如果在传输过程中其他人(非A)篡改过报文X—->X’,因为没有A的私钥无法对篡改过的报文进行加密,B收到X的密文后用公钥进行解密就会发现X被修改过。这样就可以保证报文的完整性。
  • 如果A抵赖曾发报文给B,B可以将A与密文Y交给第三放公正。 这就是不可否认功能

以上方法仅对报文X进行了签名,没有对报文X进行加密。因为获取到公钥加密的密文后,接获者可以用公钥进行解密。
具有保密性的数字签名.png
具有保密性的数字签名