密码学与隐写术不同,密码学隐藏的是信息的含义,不隐藏信息,而隐写术是隐藏信息

古典密码

  • 凯撒密码
  • 维吉尼亚密码
  • 栅栏密码

现代密码

  • 对称密码

    • DES

    • AES

    • RC4

    • SM4

  • 非对称密码

    • RSA
    • ECC
    • ElGamal
    • DSA
    • ECD SA
  • 哈希密码

    • MD5
    • SHA
    • SHA-3
    • SM3

凯撒密码

维吉尼亚密码

栅栏密码

DES加密原理

DES算法属于对称加密中的分组加密算法

密钥长64位,56位参与运算,其余8位为校验位。(8,16,24,32,40,56,64)

当n个64位铭文数据块都经过DES加密处理后,所得到的n个64位密文数据块串在一起就是密文。

AES加密原理

RC4

SM4

RSA 加密原理

一、RSA 加密与解密过程

RSA 是一种公钥加密算法,其核心在于利用模运算进行加密和解密操作,同时基于特定数学原理保证安全性。

1. 加密

将原始数据表示为一个数m(即原始信息),通过公钥(e, N)对其进行加密。加密公式为
$$
m^e\ mod\ N = c
$$
其中e为公钥中的加密指数,N为一个大数,c为得到的密文。

2. 解密

使用私钥d对密文c进行解密,解密公式为
$$
c^d\ mod\ N = m
$$
通过这两个公式可以推导出
$$
m^{ed}\ mod\ N = m
$$
这就表明了加密与解密过程的可逆性。

二、关键参数计算

在 RSA 算法中,如何选取e,d的值是最为关键的问题,这涉及到欧拉定理的应用。

1. 欧拉定理
$$
m^{\varphi(n)}\equiv 1\ (mod\ n),其中\varphi(n)为欧拉函数,表示小于或等于n的正整数中与n互质的数的个数。
$$
2. 参数推导

对欧拉定理公式进行变换,先在等式两端同时取k次幂(k为任意正整数),接着在两端同时乘m,最后将模运算写在等式左边,得到
$$
m^{k\varphi(n)}\equiv 1\ (mod\ n)\qquad m^{k\varphi(n)}*m\equiv m\ (mod\ n)\qquad 即:m^{k\varphi(n)+1}\ mod\ n = m
$$
与加密解密公式对应,可得到
$$
ed = k\varphi(n)+1\qquad 即:d=\frac{k\varphi(n)+1}{e}
$$
3. 欧拉函数性质

  • 当n为质数时,有
    $$
    \varphi(p)=p - 1
    $$

  • 对于任意两个互质的整数p,q,有
    $$
    \varphi(pq)=\varphi(p)\varphi(q)
    $$

三、公钥与私钥生成示例

以两个质数p = 17,q = 23为例,n = pq = 391,则
$$
\varphi(391)=\varphi(17)\varphi(23)=352
$$
取e = 3(需保证e与n的欧拉函数值互质),在k = 5的情况下,计算私钥d:
$$
d=\frac{k\varphi(n)+1}{e}=\frac{5
352+1}{3}=587
$$
算法将e和n公布作为加密时的公钥,而d保存下来作为解密时的私钥。由于其他人难以知道p和q这两个质因数,无法计算出n的欧拉函数值,从而难以破译私钥d。

四、加解密示例

假设要加密的字符为“a”,其对应的 ASCII 码为97,即m = 97。使用公钥(e = 3, N = 391)进行加密:
$$
97^3\ mod\ 391 = 79
$$
这里79为密文。

为了解密,使用私钥d = 587进行计算:
$$
79^{587}\ mod\ 391 = 97
$$
得到原始数据97。

五、快速幂算法实现

以下是使用快速幂算法求模的 Python 代码,用于在加密和解密过程中高效计算幂次取模:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def quick_pow(c, d, n):
result = 1
c %= n
while d > 0:
if d & 1: # 判断n的二进制最低位是否为1
result = (result * c) % n
c = (c * c) % n
d >>= 1 # 右移一位,相当于d // 2
return result

#调用
c =
d =
n =
print(quick_pow(c, d, n))

ECC加密原理

ElGamal

DSA

ECD SA

MD5

SHA

SHA-3

SM3