![57309c242fa58173ea20e8e6bd879c69.png](https://i-blog.csdnimg.cn/blog_migrate/2c205d2b4c7d0cbbd04d12ee283dad3d.jpeg)
1. 对称加密标准 encryption standard
AES (Advanced Encryption Standard)高级加密标准。Rijndael算法首先是一个密钥分组加密的算法,通过置换(permutations )和替换(substitutions)迭代加密,进过多轮操作形成密文。AES算是Rijndael算法的一种特殊实现,选的分组为128bit(16字节),密钥可以使用128、192 和 256bit三种。
AES是当前最常用的对称加密算法,讲清AES,需要有限域(Galois域)的相关知识。
2. 有限域
在抽象代数中,域是一种可进行加、减、乘和除运算的代数结构。域是环的一种。域和一般环的区别在于域要求它的元素可以进行除法运算,这等价于每个非零的元素都要有乘法逆元。简而言之,域是一个可以在其上进行加法、减法、乘法和除法运算而结果不会超出域的集合。如有理数集合、实数集合、复数集合都是域,但整数集合不是(使用除法得到的分数或小数已超出整数集合)。
如果域F只包含有限个元素,则称其为有限域。有限域中元素的个数称为有限域的阶。每个有限域的阶必为素数的幂,即有限域的阶可表示为pⁿ(p是素数、n是正整数),有限域通常称为伽罗瓦域(Galois Fields),记为GF(pⁿ)。密码学中,最常用的域是GF(2ⁿ)。
有限域在四则运算需要保证的特性是封闭性,即四则运算得到的值必须是域中元素或域中元素的组合,往往对计算结果进行mod运算来保证。
有限域可以用多项式表示,如0001 0101 可以用
有限域的加法和减法就是异或运算。如在
有限域的乘法比较复杂,为保证乘法结果在有限域是封闭的,需要对多项式结果进行取模处理,取模的对象是本原多项式,本原多项式是不可因式分解的多项式,下面是常用的本原多项式。
![cdc55987e8aeabad5cd333111c3e44e5.png](https://i-blog.csdnimg.cn/blog_migrate/c311af5f553fc0bacf1098efc35aa326.png)
伽罗华域上的多项式乘法,其结果需要mod 本原多项式P(x),在
例子:
![a89eaee9f42f74a3e12e458648fa4966.png](https://i-blog.csdnimg.cn/blog_migrate/cdbccf02dce90586060fbf38f9073fc6.png)
![9db5e36b852528c1e67db04d0c43785c.png](https://i-blog.csdnimg.cn/blog_migrate/5c4fc137de8218290c222c68e867bdef.jpeg)
3. AES加密:
AES每轮的加密步骤可以分为字节代换(S-BOX, substitute bytes)、行移位(shift rows)、列混合(mix columns)。
![0acdba57d4c8fd31f983834ff62162ba.png](https://i-blog.csdnimg.cn/blog_migrate/4817c638630f3f9068a0f290bf9cb9d5.png)
AES的字节代换其实就是一个简单的查表操作。AES定义了一个S盒和一个逆S盒。S盒即状态矩阵中的元素按照以下方式映射为一个新的字节,把该字节的高4位作为行值,低4位作为列值,取出S盒或者逆S盒中对应的行的元素作为输出。例如,加密时,输出的字节S1为0x12,则查S盒的第0x01行和0x02列,得到值0xc9,然后替换S1原有的0x12为0xc9。
行移位是一个简单的左循环移位操作。当密钥长度为128比特时,状态矩阵的第0行左移0字节,第1行左移1字节,第2行左移2字节,第3行左移3字节,如下图所示:
![6f30ca8d00e3320366319c48f307b45e.png](https://i-blog.csdnimg.cn/blog_migrate/830e58a720e28443abb30de804e5a843.png)
列混合变换是通过矩阵相乘来实现的,经行移位后的状态矩阵与固定的矩阵相乘,得到混淆后的状态矩阵,如下图的公式所示:
![787dae1f3815372ad68ec92482024238.png](https://i-blog.csdnimg.cn/blog_migrate/9d94b4ec23cf382591b5933b75986ef6.jpeg)
注:矩阵相乘等价于有限域内多项式相乘.,乘01相当于原多项式不变,乘2相当于多项式乘x,乘3相当于多项式乘x+1。
同时,针对乘x,x+1,有更快速的方法计算,例如:
对于一般形式的多项式
这时有两种情况:
(1)a_7 == 0,此时结果是一个小于指数小于8的多项式,不需要取模计算。
(2)a_7 == 1,则直接将a7x8替换为
其中,加一个多项式等价于异或一个二进制数
具体操作方式如下:
![fc30a9ac5fdd6dc65125d6eeded221f3.png](https://i-blog.csdnimg.cn/blog_migrate/f9df05b6ce15759ff19a7acbdc8a13c9.jpeg)
这就可以把列混淆过程完全转换为异或运算。
轮密钥加是将128位轮密钥Si与状态矩阵中的数据进行逐位异或操作,如下图所示。其中,密钥Ki中每个字W[4i],W[4i+1],W[4i+2],W[4i+3]为32位比特字,包含4个字节,轮密钥加过程可以看成是字逐位异或的结果,也可以看成字节级别或者位级别的操作。也就是说,可以看成S0 S1 S2 S3 组成的32位字与W[4i]的异或运算。
![0b5c9d1f55eab3e0d5c526de203d8f39.png](https://i-blog.csdnimg.cn/blog_migrate/d72ef4f906ff80b9f364bdf48926adb4.jpeg)
AES总体如下:
![2029a8bc2dcdc646696cd2ce96193af4.png](https://i-blog.csdnimg.cn/blog_migrate/3e66ab830ee8c5dd4c8a136829129d6e.jpeg)
4. RSA加密
在对称加密算法中,由于加密和解密使用同样规则(简称"密钥")。但这种加密模式有一个最大弱点:甲方必须把加密规则告诉乙方,否则无法解密。保存和传递密钥,就成了最头疼的问题。
非对称加密算法需要两个密钥:公开密钥(publickey:简称公钥)和私有密钥(privatekey:简称私钥)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将公钥公开,乙方使用甲方的公钥对机密信息进行加密后再发送给甲方;甲方再用自己私钥对加密后的信息进行解密。甲方想要回复乙方时正好相反,使用乙方的公钥对数据进行加密,同理,乙方使用自己的私钥来进行解密。RSA是常用的非对称加密算法,利用了大数质因数计算复杂度高,难以求解的原理。
生成公钥,私钥步骤如下:
![ef8bf4a198d43f856450674434ce94af.png](https://i-blog.csdnimg.cn/blog_migrate/ed638f74e5da627019feca1fc67691a0.jpeg)
1. 随机选择两个不相等的质数p和q。如17和11。(实际应用中,这两个质数越大,就越难破解。)
2. 计算p和q的乘积n。如n = 17×11 = 187。n的二进制位数就是密钥长度。实际应用中,RSA密钥一般是1024位,重要场合则为2048位。
3. 计算n的欧拉函数φ(n)。φ(n) = (p-1)(q-1)。如φ(187)等于16×10,即160。
4. 随机选择一个整数e,条件是1< e < φ(n),且e与φ(n) 互质。如在1到160之间,随机选择7。
5. 计算e对于φ(n)的逆元d。即ed ≡ 1 (mod φ(n))。ed + φ(n)y = 1,通过扩展欧几里得定理求解。如整数解为 (d,y)=(23,-10),即 d=23。
6. 将n和e封装成公钥,n和d封装成私钥。如n=187,e=7,d=23,所以公钥就是 (187,7),私钥就是(187, 23)
公钥用到了两个(n和e),其余四个数字都是不公开的。其中最关键的是d,因为n和d组成了私钥,一旦d泄漏,就等于私钥泄漏。
那么,有无可能在已知n和e的情况下,推导出d?
(1) ed≡1 (mod φ(n))。只有知道e和φ(n),才能算出d
(2) φ(n)=(p-1)(q-1)。只有知道p和q,才能算出φ(n)。
(3) n=pq。只有将n因数分解,才能算出p和q。
如果n可以被因数分解,d就可以算出,也就意味着私钥被破解。可是,大整数的因数分解,是一件非常困难的事情。目前,除了暴力破解,还没有发现别的有效方法。
举例:
![60ab9d44d1d4e0d6e22d510d20ac0175.png](https://i-blog.csdnimg.cn/blog_migrate/0f11b7246a45cc03216c0d96fc949aab.jpeg)
假设Bob要向Alice发送加密信息m,他就要用Alice的公钥 (n,e) 对m进行加密。m必须小于n。加密,就是算出m^e ≡ c (mod n),Alice的公钥是 (187, 7),Bob的m假设是88,那么可以算出下面的等式:
88^7 ≡ 11 (mod 187)。于是,c等于11,Bob就把11发给了Alice。
解密要用私钥(n,d),Alice拿到Bob发来的11以后,就用自己的私钥(187, 23) 进行解密。可以证明,下面的等式一定成立:
c^d ≡ m (mod n) c等于11,私钥是(187, 23),那么,Alice算出11^23 ≡ 88 (mod 183)。
注意到RSA只能解决加密(Encryption)的问题,但不能解决认证(authentication)和不可抵赖(non-repudiation)特性,即对接收者Alice来说,可以得到加密后的信息,但是不能保证这个信息一定是Bob发来的。
这时可以让Bob先用自己的私钥对信息签名,再用Alice的公钥加密。
![d7a2c58ab2d78b786af5e1be5c8c317f.png](https://i-blog.csdnimg.cn/blog_migrate/e5d1eaa23bb20b5651fcdd727761868d.jpeg)
![c84840563f9905ab5975d0e23ee93bb0.png](https://i-blog.csdnimg.cn/blog_migrate/f2fc8017cf069d615752c9bb5fb3f8a3.jpeg)
![f4244ce598ef5b69391c742423a5bc86.png](https://i-blog.csdnimg.cn/blog_migrate/6a39fb7a010f704d602da248559a658a.jpeg)
对原文1314。用自己私钥先加密一次相当于签名。
加密过程:先用自己的私钥c^d ≡ m (mod n)得到m = 4033,
再用对方公钥m^e ≡ c (mod n),得到c = 7613。
解密过程:用自己私钥:c^d ≡ m (mod n),得到m=7613
再用对方公钥:m^e ≡ c (mod n) 得到原文1314