密码学及其应用 —— 非对称加密/公匙密码技术

news2024/11/24 15:19:18

1 RSA加密算法

        RSA加密算法是一种基于公钥密码学的加密技术,由罗纳德·里维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)在1977年共同发明。RSA算法是第一个既能用于加密也能用于数字签名的算法,其安全性基于大数分解的难度。

1.1 RSA密钥生成过程

        a.选择两个大质数pq,并计算它们的乘积N = p \times qN用作公钥和私钥的一部分。N的长度,即其位数,是加密强度的关键因素,N被用作模数,对外公开。

        b.计算N的欧拉函数\varphi(N) = (p-1) \times (q-1),这是与N互质的正整数数量。

        c.选择一个小于\varphi(N)的整数e作为公钥的一部分,e需要与\varphi(N)互质,且通常选择一个较小的质数,例如65537,因为它可以加快加密过程,同时保持足够的安全性。

        在RSA加密算法中,要求e\varphi(N)互质,意味着e\varphi(N)之间没有除了1以外的公约数。换句话说,e\varphi(N)的最大公约数(GCD)必须是1,即gcd(e, \varphi(N)) = 1

        这个条件是为了确保e在模\varphi(N)的乘法群中有逆元,这样才能在加密过程中使用e,并且在解密过程中能够找到对应的解密密钥d。只有当e\varphi(N)互质时,根据欧拉定理或费马小定理,才能保证存在一个整数d满足下面的关系:

ed \equiv 1 \mod \varphi(N)

        这里的de的模\varphi(N)下的乘法逆元,即d是私钥的一部分,用于解密。选择e\varphi(N)互质是为了保证每个加密的消息都可以被唯一解密,从而确保RSA算法的可行性和安全性。这个性质是公钥加密中非常重要的一环,它保证了加密和解密操作是可逆的,即加密后的信息可以通过相应的私钥被正确解密。

        d. 计算e在模\varphi(N)下的乘法逆元d,即满足ed \equiv 1 \mod \varphi(N)dd作为私钥的一部分。

        e. 公钥和私钥:公钥是eN的组合,私钥是dpq\varphi(N)必须保密。

        示例中的密钥生成:

        a. 给定p = 11q = 23,则N = p \times q = 253

        b. \varphi(N) = (p-1) \times (q-1) = 10 \times 22 = 220

        c. 选择e = 3(因为e\varphi(N)互质)

        d. 计算d,使得ed \equiv 1 \mod \varphi(N),在这个例子中,d = 147

        3d= 220q+1 ,d= (220q+1)/3 d=147(因为3 \times 147 = 441 \equiv 1 \mod 220)

1.2 加密与解密的过程

        RSA加密是一种非对称加密技术,它利用了数论中的一些基本原理。在RSA加密中,加密和解密操作都是基于模运算的。这里,我们用中文来详细解释一下RSA加密的基本过程。

1.2.1 加密过程

        首先,将明文消息M转换为一个整数,其中2 \leq M \leq N-1
        使用公钥中的eN,计算密文C,计算公式为C = M^e \mod N。c为余叔

1.2.2 解密过程

        使用私钥中的dN,对密文C进行解密,计算原始消息M,计算公式为M = C^d \mod N

1.3 安全性

        RSA加密的安全性基于大数分解的难度:给定N,很难分解出原始的两个质数pq。同时,如果没有d,也很难直接解密出消息M

        RSA加密安全性的确基于大整数分解的难度。这是因为RSA算法的核心是两个大的质数pq,以及它们的乘积N = pq,这个乘积构成了RSA公钥的一部分。公钥还包括一个小的公开指数e,而私钥包含一个秘密指数d。这里的d是在模(p-1)(q-1)e的乘法逆元,即de = 1 \mod (p-1)(q-1)。这里(p-1)(q-1)就是欧拉函数\varphi(N)的值。

1.3.1 RSA安全性的关键

        大整数分解:目前为止,没有已知的有效算法可以在多项式时间内分解一个大整数\(N\)为其质数因子pq。这个计算的复杂性是RSA安全性的基石。
        秘密指数d的计算:只有知道了pq,才能计算出\varphi(N) = (p-1)(q-1),进而计算出私钥d。如果不知道p和q,计算d几乎是不可能的,因为这需要解一个在实际操作中不可行的离散对数问题。

1.3.2 攻击RSA的可能性

        大整数分解:如果有人发现了一种有效的大整数分解算法,那么RSA加密将不再安全,因为攻击者可以用这种算法来找到N的质数因子p和q,然后计算出私钥d。
        特殊情况:对于某些特别选择的N、e和d,可能存在特殊的攻击方法。例如,如果e太小,或者p和q选得不够随机,可能会有安全风险。但这些都是在密钥生成时可以避免的问题。

1.3.3 综上所述

        RSA算法的安全性高度依赖于当前缺乏有效的大整数分解算法。只要分解N = pq的问题保持困难,RSA加密就是安全的。然而,安全性也要求谨慎地选择密钥,避免已知的一些弱点。此外,量子计算的发展可能会威胁到RSA加密的安全性,因为量子算法(如Shor算法)能在理论上有效分解大整数,但这还需要实用的量子计算机成为现实。

1.4 欧拉定理——解密还原出原始消息M

         RSA的工作原理还可以通过欧拉定理来简化解释。根据欧拉定理,如果n是一个正整数,a 是与n互质的任意整数,则有a^{\varphi(n)} \equiv 1 \mod n。在RSA中,因为ed \equiv 1 \mod \varphi(N),所以加密后的消息再经过解密过程等于原消息,即M^{ed} \mod N = M

1.4.1 RSA加密的基本原理

        在RSA中,选择的公钥e和私钥d满足以下关系:

ed \equiv 1 \mod \varphi(N)

        这意味着存在一个整数k,使得ed = 1 + k\varphi(N)

        根据欧拉定理,如果M和N互质,则M^{\varphi(N)} \equiv 1 \mod N。即便M和N不完全互质,RSA算法依然有效,这涉及到RSA定理的更深层次数学证明,但基本思想是相同的。

        当你使用私钥d解密C时,实际上是在计算 C^d = (M^e)^d = M^{ed} \mod N。由于ed = 1 + k\varphi(N),可以根据欧拉定理和它的推广形式(如费马小定理)推出M^{ed} \mod N = M,这证明了解密过程能够正确还原出原始消息M

        这就是RSA加密的基本原理。RSA加密因其安全性而广泛应用于数字签名、安全通信等领域。

1.4.2 详细过程

        a. 加密后的消息再解密:C^d \mod N = (M^e \mod N)^d \mod N = M^{ed} \mod N

        b. 使用欧拉定理:根据欧拉定理,如果a是一个正整数,n是与a互质的任意整数,则a^{\varphi(n)} \equiv 1 \mod n。在RSA算法中,如果M和N互质(即\text{gcd}(M, N) = 1),则可以应用欧拉定理。

        c. 利用ed = 1 + k\varphi(N):由于ed是1加上varphi(N)的倍数,我们可以将M^{ed}重写为M^{1+k\varphi(N)}

        d. 简化表达式:利用欧拉定理,我们知道M^{\varphi(N)} \equiv 1 \mod N,所以M^{1+k\varphi(N)} \mod N = M \times (M^{\varphi(N)})^k \mod N = M \times 1^k \mod N = M \mod N

        这意味着,通过RSA解密过程得到的C^d \mod N确实等于原始消息M。

        总之,这个过程基于欧拉定理和模运算的性质,确保了使用RSA加密的消息可以被正确解密回原始消息,前提是正确选择了公钥和私钥。

1.4.3 模运算的性质和RSA加密的数学基础

        为了理解为什么C^d \mod N = (M^e \mod N)^d \mod N = M^{ed} \mod N,我们需要了解模运算的性质和RSA加密的数学基础。

1.4.3.1 模运算的性质

        模运算的幂规则:如果有a^b \mod N,那么无论是先进行幂运算再取模,还是先取模再进行幂运算,结果都是相同的。即,a^b \mod N = (a \mod N)^b \mod N。这意味着无论何时执行模运算,都不会影响最终结果。

1.4.3.2 解释 C^d \mod N = M^{ed} \mod N

        根据加密公式,我们知道C = M^e \mod N

        将C代入解密公式,我们得到C^d \mod N。根据模运算的幂规则,这可以写成 (M^e \mod N)^d \mod N

        简化表达式,再次利用模运算的幂规则,我们可以得出(M^e)^d \mod N = M^{ed} \mod N

1.4.3.3 为什么等式成立

        根据RSA的选择,e和d被选择为互逆的,即在模\varphi(N) 下,ed = 1 + k\varphi(N)。这里 \varphi(N)是欧拉函数,当N是两个质数p和q的乘积时,\varphi(N) = (p-1)(q-1)

        当我们计算M^{ed}时,实际上是在计算M^{1+k\varphi(N)},根据欧拉定理(如果gcd(M, N) = 1,则M^{\varphi(N)} \equiv 1 \mod N,这意味着M^{ed} \mod N会简化为M,因为M^{\varphi(N)}的任何整数幂都等于1。

        因此,RSA加密和解密的数学保证就是基于模运算的性质和欧拉定理,确保了加密后的消息可以通过解密过程准确地恢复。

1.5 测试算法

        在RSA加密算法的密钥生成过程中,选取大的质数p和q是一个关键步骤。为此,通常会使用概率性的质数测试方法,如米勒-拉宾(Miller-Rabin)测试。下面是对原文的翻译和解释:

1.5.1 米勒-拉宾测试的原理

        米勒-拉宾检验是一种基于费马小定理和欧拉定理的概率性质数测试方法,用于判断一个给定的大数k是否为质数。

        费马小定理:如果k是质数,对于任意整数a 1 < a < k-1,都有a^{k-1} \equiv 1 \mod k。这是米勒-拉宾测试的基础。

        欧拉定理:如果k是质数,对于任意与k互质的整数a,同样满足a^{k-1} \equiv 1 \mod k

        卡迈克尔数:存在一些特殊的合数(如561),对于所有的整数a,都有a^{k-1} \equiv 1 \mod k,这些数被称为卡迈克尔数。虽然这些数很少,但它们说明了仅凭费马小定理不能完全确定一个数是否为质数。例如,561是一个合数(561 = 3 \times 11 \times 17),但对于所有整数a,a^{560} \equiv 1 \mod 56。这样的数被称为卡迈克尔数,它们虽然罕见,但存在。

1.5.2 米勒-拉宾检验步骤

  1. 选择基数a:在测试中,随机选择多个不同的基数a。
  2. 计算a^{k-1} \mod k:对于每一个基数a,计算a^{k-1} \mod k
  3. 判断条件:
    •  - 如果对于某个a,a^{k-1} \not\equiv 1 \mod k,则k肯定不是质数。
    •  - 如果对于所有选定的基数a,都有a^{k-1} \equiv 1 \mod k,则k有很高的几率是质数

1.5.3 解释

        米勒-拉宾测试,这是一种常用于RSA加密中确定大数是否为质数的概率性方法。该测试基于欧拉定理,通过对多个不同基数a的计算,来判断一个大数k是否为质数。虽然该方法有一定的错误概率,但通过增加测试的基数数量,可以使错误的可能性极低,从而在实际应用中高度确信所选的大数是质数。

        该测试的一个重要注意点是存在卡迈克尔数,这些数不是质数,但它们满足质数在米勒-拉宾测试中的条件。尽管如此,由于这些数非常罕见,米勒-拉宾测试仍然是一个在加密算法中寻找大质数的有效和实用的工具。

        RSA加密算法的密钥生成过程中,选择大的质数p和q是至关重要的一步。为了确定一个大数是否为质数,通常使用概率性的质数测试算法,比如米勒-拉宾(Miller-Rabin)质数检验。下面将用中文解释米勒-拉宾测试的原理。。

1.5.4 注意事项

        米勒-拉宾检验是一个概率性测试,它不能100%确定地证明一个数是质数,但可以以非常高的准确率判断。
        随着测试基数a的数量增加,错误判定的概率会大幅度减少。
        对于实际应用,特别是在RSA加密中,通过进行足够多的米勒-拉宾测试,可以高度确信选定的大数是质数。

        通过使用米勒-拉宾等质数测试方法,RSA密钥生成过程中的质数选择既高效又可靠,确保了加密系统的安全性。

1.5.5 加密指数e的选择

        在RSA加密算法中,密钥生成是一个核心步骤。特别地,加密指数e的选择对于算法的效率和安全性至关重要。下面讨论为什么经常(但不总是)选择e = 65537,以及这个选择背后的数学和算法原理。

1.5.2.1 为什么选择e = 65537?
1.5.2.1.1 质数性

        e = 65537是一个质数。在RSA算法中,需要e与\varphi(N) = (p-1)(q-1)互质,以确保e在模\varphi(N)下可逆,这是找到私钥d的前提。作为质数的e,更容易满足与\varphi(N)互质的条件。

1.5.2.1.2 小尺寸

        e = 65537是一个17位的数字。相对较小的e可以加快加密过程中的模指数运算速度。在RSA加密中,加密操作是计算C = M^e \mod N,较小的e可以减少计算量,提高加密效率。

1.5.2.1.3 Fermat数

        e = 65537表示为2^{16} + 1,它是一个特殊形式的质数,称为费马数。费马数定义为F_n = 2^{2^n} + 1,其中n是非负整数。e = 65537实际上是已知的最大的费马质数。费马数的这种特殊形式有利于优化模指数运算,因为它允许使用快速的算法来实施指数运算。

1.5.3 扩展欧几里得算法

        在RSA加密算法中,密钥生成是一个核心过程,特别是私钥指数d的计算。d是公钥指数e在模\varphi(N)下的逆元,这意味着de \equiv 1 \mod \varphi(N)。计算d的过程涉及到模逆元的求解,这通常通过扩展欧几里得算法(也称为扩展Euclid算法)完成。下面详细介绍扩展欧几里得算法的原理和如何用它来计算d。

1.5.3.1 扩展欧几里得算法

        扩展欧几里得算法是欧几里得算法(用于计算两个数的最大公约数)的一个扩展,不仅可以计算最大公约数,还可以找到满足特定线性方程的整数解。具体来说,对于给定的整数U和V,算法可以找到整数a和b,使得aU + bV = \text{gcd}(U, V)

1.5.3.2 RSA中的应用

        在RSA密钥生成过程中,需要计算d = e^{-1} \mod \varphi(N)。这里,e是公钥指数,而\varphi(N)是模N的欧拉函数值。扩展欧几里得算法在这里的应用是找到满足ae + b\varphi(N) = 1的a和b,其中a就是所求的d。

1.5.3.3 算法步骤
  1. 输入:整数e和\varphi(N)
  2. 输出:整数d,使得de \equiv 1 \mod \varphi(N)
  3. 过程:
    1. 使用扩展欧几里得算法对e和\varphi(N)进行操作。
    2. 通过一系列的欧几里得除法,算法逐步减小问题的规模,直到得到最大公约数,过程中同时计算a和b。
    3. 最终,当算法完成时,我们得到a,即d,满足de \equiv 1 \mod \varphi(N)
1.5.3.4 举例说明

        假设通过扩展欧几里得算法计算,我们找到了使得ae + b\varphi(N) = \text{gcd}(e, \varphi(N)) = 1的a和b。这里的a就是所需的模逆元d。因为e和varphi(N)互质(即它们的最大公约数为1),所以这个方程保证了d的存在性和唯一性。

1.5.3.5 重要性

        这个过程对RSA的安全性至关重要。没有有效的模逆元计算方法,生成私钥将非常困难,但扩展欧几里得算法为我们提供了一种高效的计算方式。RSA算法的安全性在很大程度上依赖于大质数的秘密性和私钥d的保密性,而扩展欧几里得算法正是计算私钥的关键步骤之一。

1.5.4 快速幂运算(或称为快速指数运算)和中国剩余定理(CRT)

        RSA加密和解密过程中,快速幂运算(或称为快速指数运算)和中国剩余定理(CRT)是两种提高效率的关键技术。让我们来详细解释这两种方法。

1.5.4.1 快速幂运算

        快速幂运算是一种高效计算大数幂模运算的方法,特别适用于RSA加密中的密文生成C = M^e \mod N和解密M = C^d \mod N过程。该算法基于幂的二进制表示和模运算的性质。

1.5.4.1.1 算法原理

        将指数d表示为二进制形式:d = \sum_{i}d_i2^i,其中d_i \in \{0, 1\}

        通过连续的平方计算基数的幂,并在必要时乘以基数,从而有效地计算幂模运算。

        这种方法只需要最多\log_2(d)次平方运算和最多\log_2(d)次乘法运算,相比于直接进行d次乘法运算要高效得多。

1.5.4.1.2 快速幂算法步骤

        a. 对指数d进行二进制分解。

        b. 从最低位开始,对于每一位二进制位d_i
                如果d_i = 1,则将当前结果乘以对应的幂值M^{2^i} \mod N,并取模。
                不论d_i的值如何,每一步都计算下一个幂值,通过将当前幂值平方并取模来实现。

        c.最终累乘的结果就是M^d \mod N

1.5.4.2 RSA-CRT解密优化

        RSA-CRT是利用中国剩余定理来优化RSA解密过程的技术。通过将大数运算分解为较小数域上的运算,可以显著提高解密速度。

1.5.4.2.1 原理

        根据中国剩余定理,如果你有一系列模N_i两两互质的同余方程,那么这个方程组在模\prod N_i下有唯一解。

        在RSA中,给定N = pq(其中p和q是大质数),可以单独在模p和模q下进行解密运算,然后将结果组合起来恢复出原始消息。

1.5.4.2.2 RSA-CRT解密步骤
  1. 预先计算并存储d_p = d \mod (p-1)d_q = d \mod (q-1)以及q_{inv} = q^{-1} \mod p
  2. 计算M_p = C^{d_p} \mod pM_q = C^{d_q} \mod q
  3. 利用中国剩余定理,结合M_pM_q和预计算的值,通过Garner公式计算出原始消息M。

        通过这种方式,RSA-CRT可以将解密操作的计算量大幅度减少,因为在较小的模下运算比在大模下运算要快得多。此外,这种方法还增加了解密过程的并行性,进一步提高了效率。

2. Diffie-Hellman密钥交换原理

2.1 背景

        在一个不安全的通信渠道上,Alice和Bob希望能够安全地通信。他们打算使用对称加密算法,这要求双方共享一个密钥。然而,关键问题是如何在不安全的通道上安全地交换这个密钥。

        这就是密钥交换协议,如Diffie-Hellman协议,发挥作用的场景。Diffie-Hellman密钥交换协议允许两个用户在没有共享初始秘密的情况下,通过一个不安全的通道交换密钥。

2.2 Diffie-Hellman密钥交换原理的协议步骤

        Diffie-Hellman密钥交换协议由W. Diffie和M.E. Hellman在1976年提出,是密码学领域的一个里程碑。该协议允许两方在不安全的通信渠道上协商出一个共享密钥,而无需预先共享秘密信息。

        a. 选择公共参数:Alice和Bob公开选择两个整数pg。其中,p是一个大质数prime,而g是模p的一个原根(即对于所有的整数n,在集合\{1, 2, \dots, p-1\}中,存在整数k,使得g^k \mod p = n)。在实践中,选择g不必过于复杂。例如,许多实现为了简化,会选择小的g值(如2或5),只要它们满足给定的p是原根的条件即可。

        b. 生成并交换公钥:lice随机选择一个整数a(私钥),满足1 \leq a \leq p-2,计算A = g^a \mod p(公钥),并将A发送给Bob。

        Bob也随机选择一个整数b(私钥),满足1 \leq b \leq p-2,计算B = g^b \mod p(公钥),并将B发送给Alice。

        c. 计算共享密钥:Bob收到A后,使用他的私钥b计算共享密钥K = A^b \mod p

        Alice收到B)后,使用她的私钥a计算共享密钥K = B^a \mod p

        由于A^b = (g^a)^b = g^{ab} \mod pB^a = (g^b)^a = g^{ab} \mod p,Alice和Bob得到的共享密钥K是相同的。

2.3 安全性

        Diffie-Hellman协议的安全性基于离散对数问题的难解性。离散对数问题是指:给定一个大质数p、一个基数g(在模p的乘法群中的生成元),以及g的一个幂A = g^a \mod p,尝试找到指数a的过程。这里的a就是A在模p下以g为基的离散对数。

2.3.1 离散对数问题的难度

        计算A = g^a \mod p:给定基数g、指数a和模数p,计算g的a次方再对p取模是相对容易的,可以在多项式时间内完成。这种运算通常使用快速幂算法,其时间复杂度大致为立方级别,与模数p的位长度有关。

        计算离散对数a:反过来,如果知道A、g和p,试图找出a则非常困难。目前没有已知的多项式时间算法可以解决这个问题。这意味着,即使攻击者知道A、g和p,他们也无法轻易地计算出a(或相应的b),除非他们能解决离散对数问题。

2.3.2 为什么离散对数问题很难

        离散对数问题的难度源于模p下乘法群的性质,其中元素的周期性和群的结构使得直接计算对数变得复杂。虽然加法运算中的对数(即常规对数)可以通过算术操作轻易求解,但模运算引入的周期性质和非线性特征使得离散对数问题在计算上变得非常复杂。

2.3.3 安全性影响

        由于离散对数问题的难解性,Diffie-Hellman密钥交换协议被认为是安全的,这意味着在实际应用中,即使攻击者能够拦截通信并获取公开的参数和公钥,他们也无法计算出私钥,从而无法解密双方共享的密钥。然而,离散对数问题的难度依赖于选定的质数p和基数g的大小和性质,选择合适的参数对保证协议的安全性至关重要。

2.4 应用

        Diffie-Hellman密钥交换在许多安全通信协议中发挥着核心作用,如SSL/TLS和IPsec。虽然它自身不提供通信双方的身份验证,但可以与其他认证机制结合使用,以确保通信的安全性。

2.5 优点和局限性

        优点:Diffie-Hellman协议允许两个用户在公开渠道上安全地共享密钥,而无需预先共享秘密信息。
        局限性:尽管Diffie-Hellman协议可以安全地交换密钥,但它本身不提供身份验证,也就是说,它不能保证你正在与预期的对方通信,而不是中间人。

        因此,Diffie-Hellman密钥交换通常与其他提供认证的安全协议一起使用,以确保通信的安全性和参与者的身份验证。

3. El Gamal加密

        El Gamal加密是一种基于离散对数问题的公钥加密算法,由Taher El Gamal在1984年提出。它类似于Diffie-Hellman密钥交换协议,并且同样基于离散对数问题的难解性来保证安全性。

3.1 El Gamal加密过程

3.1.1 密钥生成

        Alice选择一个大质数p和一个模p的原根g

        Alice选择一个随机数a作为她的私钥,1 \leq a \leq p-2

        Alice计算公钥A = g^a \mod p

        Alice的公钥是\{p, g, A\},私钥是a。

3.1.2 加密过程

        假设Bob想要给Alice发送一个明文消息M,其中2 \leq M \leq p-1

        Bob获取Alice的公钥\{p, g, A\},选择一个随机数b作为他的会话密钥。

        Bob计算B = g^b \mod p和加密后的消息C = M \cdot A^b \mod p

        Bob将加密后的消息对(C, B)发送给Alice。

3.1.3. 解密过程

        Alice收到(C, B)后,使用她的私钥a来解密消息。

        Alice计算B^a = g^{ab} \mod p,这实际上与Bob计算的A^b相同。

        Alice利用B^a的逆元(B^a)^{-1} \mod p来计算原始消息M = C \cdot (B^a)^{-1} \mod p

3.2 安全性基础

        El Gamal加密的安全性基于离散对数问题的难解性,即在已知g、p和g^a \mod p的情况下,计算a是非常困难的。攻击者即使拦截到加密消息(C, B)和公钥\{p, g, A\},也无法计算出私钥a或解密出明文M,除非能解决离散对数问题。

3.3 使用场景

        El Gamal加密不仅提供了消息的保密性,而且还可以用于数字签名。虽然它在加密和解密过程中相对于其他算法(如RSA)可能更为低效,但它的安全性和在某些场合的可行性使其成为公钥加密和数字签名的一个重要选择。

4. 椭圆曲线简介

        加密技术已经从传统的基于大整数分解和离散对数问题的方法(如RSA和Diffie-Hellman)发展到了基于椭圆曲线数学的椭圆曲线密码学(ECC)。ECC由Neil Koblitz和Victor Miller于1985年独立提出。它在公钥密码学中的应用,包括密钥交换、加密和数字签名,与传统方法相比,具有显著的优势。

4.1 椭圆曲线简介

        在实数域上的椭圆曲线定义为满足下面方程的点的集合(x, y),加上一个特殊的点,称为无穷远点或点 O :

y^2 = x^3 + ax + b

        这里的ab是曲线参数,而xy是变量。在密码学中,通常在有限字段上考虑椭圆曲线,特别是模一个大质数p的情况,即所有运算都在模p的条件下进行。

        其中,ab是方程中的常数,且满足条件4a^3 + 27b^2 \neq 0,以确保曲线是非奇异的。这个条件保证了多项式x^3 + ax + b = 0有三个不同的根,从而保证曲线上没有尖点(cusps)或自相交点,确保了曲线的平滑性。

        椭圆曲线上的点,包括无穷远点“O”,可以进行一种称为“点加”操作的数学运算。这个操作在曲线上定义了一个群结构,使得椭圆曲线成为公钥密码学,特别是椭圆曲线密码学(ECC)的基础。

4.2 椭圆曲线上的点加操作

        椭圆曲线上如何进行点加操作。椭圆曲线上的点加是定义曲线上群结构的基本运算。假设我们有椭圆曲线E上的两个点P = (x_1, y_1)Q = (x_2, y_2),我们想要找到第三个点R = P + Q

4.2.1 如果PQ不是相同点

        我们画一条直线穿过这两个点。

        这条直线会与椭圆曲线相交于第三点。

        我们取这个交点的x轴对称点(即在x轴上做镜像),得到的点称为R

        P 点 Q = R

4.2.2 特殊情况

        如果x_1 = x_2y_2 = -y_1(即点P和点Q互为对称点),那么直线是垂直的,根据椭圆曲线群的定义,是无穷远点O

        如果PQ是同一个点(即我们要计算点P加自身得到的2P)),我们不再画穿过这两点的直线,而是在点P处画椭圆曲线的切线,切线与曲线相交的第二个点的x轴对称点就是2P。 P点P = Q = 2P 

4.2.3 群的性质

        椭圆曲线上定义的加法运算使得所有曲线上的点形成一个数学上的群,这意味着加法满足封闭性、结合律、存在单位元(无穷远点O)以及每个元素都存在逆元。

        此外,椭圆曲线上的群是阿贝尔群,即加法运算是可交换的。

        椭圆曲线上的这些运算性质使得它们成为现代密码学中重要的工具,特别是在椭圆曲线密码学(ECC)中,这种加法运算用于加密、密钥交换和数字签名算法。

4.3 二次剩余

        在模素数p的情况下,椭圆曲线被定义在有限域\mathbb{Z}_p上,其中p是一个大于3的素数。在这个有限域上的椭圆曲线由所有满足下列方程的点(x, y)组成:

y^2 \equiv x^3 + ax + b \mod p

        其中ab是满足条件4a^3 + 27b^2 \not\equiv 0 \mod p的常数,以确保曲线是非奇异的。此外,还有一个特殊的点“O”,称为无穷远点,它在曲线上的运算中充当单位元。

        示例解释

        给定素数p = 11,以及椭圆曲线方程y^2 = x^3 + x + 6\mathbb{Z}_{11}上的情况,我们可以枚举x在模11下的所有可能值,并验证对应的x^3 + x + 6是否是模11的二次剩余,也就是说,我们查找是否存在某个数的平方等于x^3 + x + 6模11的值。

        在\mathbb{Z}_{11}上,一个数n是二次剩余,如果存在另一个数m使得m^2 \equiv n \mod 11。例如,我们计算x = 0x = 10时的y^2的值,来确定哪些(x, y)对是曲线E上的点。如果对于某个x,不存在这样的y,则x不对应曲线上的任何点。

        在实际操作中,我们可能会用到有效的算法来确定一个数是否是二次剩余,这种算法被称为“二次剩余的判别”。

        椭圆曲线群:在\mathbb{Z}_p上的椭圆曲线上的点,连同无穷远点“O”,构成了一个有限阿贝尔群。这个群在密码学中非常重要,特别是在椭圆曲线密码学(ECC)中,这种群结构被用于定义加密和签名算法中的点加和点乘运算。椭圆曲线上的群运算特性使得ECC成为提供高安全性同时又能使用较短密钥长度的密码系统。

4.4 ECDLP

        椭圆曲线密码学(ECC, Elliptic Curve Cryptography)中的安全性建立在椭圆曲线离散对数问题(ECDLP)上。即使在模一个素数p的条件下定义,我们仍然可以将加法运算推广到椭圆曲线上,尽管我们不能以传统的几何方式来解释这种加法。

4.4.1 椭圆曲线离散对数问题(ECDLP)

        在椭圆曲线密码学中,给定一个素数p,我们可以在\mathbb{Z}_p上定义一个椭圆曲线E,并在这个曲线上定义一个群运算。这个群是由曲线上所有点组成的,加上一个无穷远点作为群的单位元。

        当我们说椭圆曲线E是一个循环群时,我们的意思是曲线上存在一个点\alpha,这个点可以通过群运算生成曲线上的所有其他点。在密码学的上下文中,这个生成元点\alpha通常被称为基点。

        在椭圆曲线上,离散对数问题可以这样描述:给定一个基点\alpha和另一个点\beta,找到一个整数k,使得k倍的\alpha等于\beta(即k\alpha = \beta)。在加法群中,“倍数”意味着重复应用群的加法运算。

        由于椭圆曲线上的加法运算与整数域上的幂运算有着本质上的不同,因此解决ECDLP要比传统的模p整数幂离散对数问题要难得多。这就是为什么椭圆曲线密码学被认为在较短的密钥长度下仍能提供很高的安全性。

4.4.2 ECC的安全性

        ECC的安全性依赖于ECDLP的难度,与RSA和其他基于传统离散对数问题的密码体制相比,ECC可以使用更短的密钥长度达到相同或更高的安全级别。由于解决ECDLP没有已知的高效算法,这就使得基于ECDLP的加密算法成为非常强大的工具,用于保护数据的安全。

4.6 椭圆曲线密码学(ECC)

        椭圆曲线密码学在1985年由Neal Koblitz和Victor S. Miller独立提出。它利用椭圆曲线上的点加操作来实现加密、解密、签名和验证等密码学功能。ECC的一大优势是它可以在使用较短的密钥长度的同时,提供与RSA等传统公钥加密算法相同或更高的安全级别。这使得ECC在资源受限的环境中(如智能卡、移动设备等)特别有用。

        El Gamal加密算法在椭圆曲线上的实现涉及到了点加和标量乘(即点的倍数)操作。以下是基于椭圆曲线的El Gamal加密和解密过程的详细解释:

4.6.1 密钥生成

        假定有一个椭圆曲线群的生成元\alpha = (2, 7)
        Alice选择一个私钥a = 7,她的公钥是A = a\alpha = 7\alpha = (7, 2)

4.6.2 加密过程

        Bob想要给Alice发送消息M = (10, 9)

        Bob选择一个随机数r = 3,计算R = r\alpha = 3\alpha = (8, 3),并将R公开发送给Alice。

        Bob计算加密后的消息M + rA。他首先计算rA = 3(7, 2)。因为3(7, 2) = 21\alpha,这个结果可以简化为8\alpha = (3, 5)(在群中进行等价简化)。

        接下来,Bob将M和rA相加得到M + rA = (10, 9) + (3, 5),简化过程中用到了椭圆曲线群的加法规则。

        经过点加运算后,Bob得到M + rA = (10, 2)

        Bob将(R, M + rA) = ((8, 3), (10, 2))发送给Alice。

4.6.3 解密过程

        Alice收到(R, M + rA)后,使用她的私钥a计算aR = 7(8, 3)

        由于7(8, 3) = 21\alpha = 8\alpha = (3, 5),Alice现在拥有了Bob在加密消息时使用的rA值。

        Alice接着从M + rA中减去aR,即(10, 2) - (3, 5)

        通过椭圆曲线上的点加运算法则和求逆(在椭圆曲线群中,点的“减法”实际上是加上点的逆),Alice能够解出原始消息M

        这个过程表明,使用椭圆曲线上的点运算作为El Gamal加密的基础是可行的,且能够有效地进行加密和解密操作。这也展示了椭圆曲线加密相较于传统的基于整数离散对数的加密系统(如RSA),可以使用更小的密钥空间来实现相同级别的安全性。

4.7 椭圆曲线密码学的应用

        椭圆曲线密码学的主要优点是它允许使用比RSA更短的密钥长度来达到同等的安全级别。这意味着在保持相同的安全性的同时,可以减少计算量和存储需求,这对于资源受限的环境(如智能卡和物联网设备)特别有利。

4.8 安全性

        ECC的安全性基于椭圆曲线离散对数问题(ECDLP)的难解性。简而言之,给定椭圆曲线上的两个点P和Q,以及已知Q = nP(其中n是一个整数),ECDLP要求找出整数n。尽管点加操作相对简单,但是在没有n的情况下,从P和Q推导出n被认为是非常困难的。到目前为止,没有已知的有效算法可以解决ECDLP,这使得基于ECDLP的密码系统相对安全。

4.9 优点和缺点

        优点:与RSA相比,ECC可以使用更短的密钥长度提供相同或更高的安全级别。这导致加密操作更快,占用空间更少。
  
        缺点:尽管ECC提供了许多优势,但它的数学原理和加密/解密过程相对于RSA和Diffie-Hellman这样的传统算法更为复杂。此外,对于不熟悉椭圆曲线理论的开发者和安全专家来说,实现和审核ECC系统可能更加困难。

        总体而言,ECC代表了公钥密码学的一个重要进展,它通过提供更高效的加密机制,使得在资源受限的环境下部署安全通信变得更加可行。

4.10 ECC与RSA的比较

        密钥长度:ECC通常需要比RSA短得多的密钥来提供相同级别的安全性。例如,256位的ECC密钥提供的安全性大致相当于3072位的RSA密钥。

        计算效率:由于密钥长度较短,ECC在生成密钥和加密/解密操作上通常比RSA更高效。

        传输效率:ECC生成的加密文本大小通常也比RSA的小,这对于需要最小化数据传输量的应用来说是一个重要优势。

        尽管ECC提供了许多优势,但它的数学原理和实现比RSA更为复杂,需要特别注意安全参数的选择和算法的实现。

5. 数字签名

5.1 中间人攻击(MITM)的 流程

        在Diffie-Hellman密钥交换协议中的一个中间人攻击(MITM)示例。流程如下:

5.1.1  Alice和Bob的正常操作

         Alice选择一个随机数,并计算K_A = g^a \mod p,然后发送给Bob。

        同时,Bob选择一个随机数,并计算K_B = g^b \mod p准备发送给Alice。

5.1.2 Charlie的中间人攻击

        Charlie截获Alice发送给Bob的K_A,同时他自己选择一个随机数c,计算K_C = g^c \mod p,并将K_C发送给Bob。Bob认为K_C来自Alice。

        Charlie同样截获Bob发送给Alice的K_B,并将自己计算的K_C发送给Alice。Alice认为K_C来自Bob。

5.1.3 密钥计算误差

        Bob收到K_C,并使用自己的私钥b计算出一个错误的共享密钥K' = (K_C)^b \mod p

        Alice收到K_C,并使用自己的私钥a计算出另一个错误的共享密钥K = (K_C)^a \mod p

5.1.4 Charlie的优势

        Charlie能够与Bob和Alice分别计算共享密钥,因为他知道自己的私钥c以及他截获的K_AK_B。这意味着Charlie可以使用K_AK_B与Alice和Bob各自计算出的密钥进行通信。

5.1.5 结果

        Charlie能够解密Alice和Bob发送的任何加密信息,因为他拥有与他们各自协商的密钥。他可以将信息从Alice解密后重新加密发送给Bob,反之亦然,从而控制整个通信过程。

        在进行Diffie-Hellman密钥交换时需要身份验证措施来防止MITM攻击。如果Alice和Bob没有验证对方的身份,他们就可能与Charlie而不是彼此交换密钥,从而使通信变得不安全。

5.2 公钥基础设施(Public Key Infrastructure, PKI)和数字证书

        确实,为了对抗中间人攻击(MITM),重要的一步是确保参与通信的各方可以信任彼此的公钥。这通常是通过公钥基础设施(Public Key Infrastructure, PKI)和数字证书来实现的。

5.2.1 公钥基础设施(PKI)

        公钥基础设施(Public Key Infrastructure, PKI)是一套用于管理和分发公钥证书的系统架构。这些证书是非对称加密系统所必需的。PKI的目标是确保数字通信和数据传输的安全性,尤其是在开放网络如互联网中。它包括用于创建、管理、分发、使用、存储和撤销数字证书的硬件、软件、政策和标准。在PKI中,以下角色是核心组成部分:

5.2.1.1 PKI的主要组件

        证书颁发机构(Certificate Authority, CA):一个信任的第三方机构,负责颁发和管理安全证书、数字证书CA通过验证申请者的身份,然后发行一个证书,这个证书将申请者的公钥与其身份绑定在一起。

        注册机构(Registration Authority, RA):通常是CA的一个分支,负责接收和验证公钥证书申请。

        证书库:用于存储、索引和分发证书的系统。

        证书撤销列表(CRL):发布已被撤销的证书的列表。

5.2.1.2 PKI的关键职责

        验证身份:在颁发公钥证书之前,确认申请人的身份。这通常需要提供可信的身份证明。
  
        创建和管理证书:生成安全的公钥证书,并确保它们的有效性、可撤销性以及更新。

5.2.2 数字证书

5.2.2.1 数字证书的内容

        证书拥有者的身份信息:可能包括个人、公司、组织或设备的名称和其他标识信息。

        公钥值:证书拥有者的公钥。

        证书有效期:证书的开始和结束有效期。

        证书用途:该公钥被授权使用的目的,如加密、数字签名等。

        颁发证书的CA信息:颁发该证书的CA的标识信息。

        CA的数字签名:CA使用其私钥对证书进行的签名,任何人都可以用CA的公钥来验证这个签名。

5.2.2.2 数字证书的作用

        数字证书的目的是公钥与其所有者之间建立信任关系。通过验证证书签名的有效性,可以确信公钥确实属于宣称的持有者,从而在公钥加密和数字签名中使用这个公钥。

5.2.2.3 X.509标准

        数字证书是一种电子"护照",它将一个公钥与一个个体或实体的身份信息关联起来。最常见的证书格式是X.509。一个X.509证书通常包含以下信息:

        证书持有者的公钥。

        持有者的身份信息(如名字、组织)。

        证书有效期。

        证书颁发机构(CA)的签名。

        证书的唯一序列号。

        数字证书是用来关联公钥与其身份的电子文档,其中X.509是最常用的数字证书标准之一。这个标准由国际电信联盟(ITU)提出,并被广泛应用于多种安全协议和服务,比如安全邮件(S/MIME)、网络安全协议(IPSec)和安全套接层(SSL)等。

5.2.2.3 X.509证书的格式

一个X.509证书大致包含以下信息:

        证书版本(Version):标明证书遵循的X.509标准的版本,例如V1、V2或V3。

        证书序列号(Serial Number):由证书颁发机构(CA)分配的唯一编号。

        签名算法标识(Signature Algorithm):证书签名使用的加密算法。

        颁发者名称(Issuer Name):颁发证书的CA的名称。

        有效期限(Validity Period):证书有效的日期范围,包括开始日期和结束日期。

        主题名称(Subject Name):证书所有者的名称和其他标识信息。

        主题公钥信息(Subject Public Key Info):证书所有者的公钥及其算法。

        颁发者唯一标识符和主题唯一标识符(Issuer and Subject Unique Identifiers):在版本2或3的证书中,用于标识证书颁发者和主题的唯一标识符(可选项)。

        扩展信息(Extensions):V3证书中可包含的额外信息,比如支持的使用案例、密钥使用限制或其他特性。

        证书签名(Certificate Signature):包括签名算法和由CA对证书信息进行加密的签名。

        证书中的这些信息提供了可验证的细节,使得证书接收方能够验证证书的有效性、颁发者的身份以及证书主体的公钥真实性。通过证书颁发机构(CA)的数字签名,可以保护这些信息不被篡改,确保任何人都无法伪造证书。

        你使用浏览器访问一个使用SSL的网站时,你的浏览器会自动检查该网站的SSL证书是否有效,是否由一个可信任的CA签名,以及是否适用于该网站的地址。这是一个用于验证网站身份的过程,它可以防止MITM攻击,保证你与预期的服务器进行加密通信。

5.2.2.4 证书示例

        这是X.509数字证书的一个例子。通常在网页安全通信(如税务申报)中使用,由权威机构颁发。这份证书包含了以下关键信息:

        版本(Version):这里使用的是版本3(V3),这是目前使用最广泛的X.509证书版本,它支持扩展字段。

        序列号(Serial Number):证书的唯一标识符,每个证书都有一个独特的序列号。

        签名算法(Signature Algorithm):用于证书签名的算法,此处为md5WithRSAEncryption,表示使用MD5算法和RSA加密的组合。

        颁发者(Issuer):证书的颁发机构,这里是法国税务总局(Direction Générale des Impôts)。

        有效期(Validity):证书的有效起止日期。

        主体(Subject):证书所标识的个人或组织的信息。

        主体公钥信息(Subject Public Key Info)

        公钥加密算法:rsaEncryption。
        RSA公钥:包括模数(Modulus)和指数(Exponent)。

        X509v3扩展:包括基本限制(Basic Constraints)、CRL分发点(CRL Distribution Points)和密钥用法(Key Usage)。这些扩展提供了证书用途的附加信息。

        签名:包含了对整个证书进行哈希计算后,使用CA的私钥加密得到的签名。这是证书可靠性的关键,任何人都可以使用CA的公钥验证这个签名。

        证书下方的签名算法重复列出了用于签名证书的算法,以及签名本身的摘要,这可以用于验证证书的完整性和真实性。

        这个证书确保了网站与公钥的关联,使得网站能够安全地加密传输数据,用户也可以验证该网站的身份。在网站安全协议(如HTTPS)中,浏览器将自动检查服务器提供的证书是否有效,是否由信任的CA签发,以及是否适用于要访问的网站。

5.3 如何使用PKI防御MITM攻击

        当Alice和Bob通信时,他们会相互提供自己的数字证书。

  1. 证书验证:当Alice和Bob收到对方的证书时,他们会检查证书是否由可信的CA签发。
  2. 签名检查:Alice和Bob会检查对方证书上的数字签名,以确认证书未被篡改。
  3. 撤销检查:他们会查看CRL或使用在线证书状态协议(OCSP),以确保证书未被撤销。

        在Diffie-Hellman等密钥交换协议中,使用PKI可以确保交换的公钥是真实且可信的。当Alice和Bob交换公钥时,如果公钥伴随着由CA签名的有效证书,那么即使Charlie拦截了通信,他也无法替换公钥而不被发现。Alice和Bob可以相互验证对方证书的签名,确保他们正在使用的是真正的、未被篡改的公钥。

        PKI的核心就在于创建一个可以信赖的环境,即使在开放和不安全的网络中,也能够安全地进行公钥交换和加密通信。

        这些步骤提高了通信的安全性,但需要所有参与者正确实施PKI和证书验证的相关步骤。如果实施不当,系统仍然可能受到MITM攻击。

5.4 证书签名请求(Certificate Signing Request,简称CSR)

        证书签名请求(Certificate Signing Request,简称CSR)是公钥基础设施(PKI)中的一个重要部分,是证书申请者向证书颁发机构(CA)提出的包含公钥的正式请求。通过CSR,申请者请求CA颁发一个与提供的公钥相关联的数字证书。

5.4.1 CSR的创建和内容

        a. 生成密钥对:首先,申请者会创建一对密钥,包括一个公钥和一个私钥。

        b. 生成CSR:使用公钥和申请者的身份信息(如组织名称、通用名(Common Name, CN)、地理位置等)生成CSR。

        c. 信息:CSR通常包含以下信息:1.申请者的公钥。2. 申请者的身份信息,比如公司名称、部门、国家代码、地区、城市、街道地址和邮箱地址等。3.如果CA要求,可能还需要包括证明身份的其他信息。

        d. 签名:使用申请者的私钥对CSR进行数字签名,以证明请求是合法的,并且申请者拥有相应的私钥。

        e. 提交CSR:将CSR提交给CA,等待CA进行验证。

        f. 验证:CA在验证申请者的身份信息后,哈希后用私匙进行签名,如果接受CSR,将颁发一个数字证书,该证书包含申请者的公钥和CA对该公钥的签名。

5.4.2 CSR的格式

        PKCS#10:这是创建CSR的最常见标准,它定义了CSR的结构。

        PEM:这是一种文件格式,通常包含`-----BEGIN CERTIFICATE REQUEST-----`和`-----END CERTIFICATE REQUEST-----`标签。PEM文件的内容是PKCS#10格式的CSR经过Base64编码的结果,可能还包括证书链或私钥。

5.4.3 安全性

        重要的是,CSR中不包含私钥。私钥永远不应该离开申请者的服务器或其他安全环境。如果私钥泄露,任何拥有它的人都可以冒充证书的合法拥有者。

        CSR的签名确保了请求的完整性和身份验证,它使得CA能够确认公钥真正属于提出请求的实体。返回的数字证书包含了公钥和CA的数字签名,这样任何使用该公钥的通信都可以被验证为来自持有相应私钥的实体。

5.5 数字签名

        数字签名是一种用于验证电子文档身份验证、数据完整性和非抵赖性的技术。在数字签名中,发送者利用自己的私钥对信息或文件进行加密,接收者则可以使用发送者的公钥来验证签名的真实性。如果验证成功,接收者可以确信信息确实来自签名者,并且自签名后未被更改。

5.5.1 数字签名的目标

        身份验证:证明消息确实是由声称的发送者所发送。

        数据完整性:确保数据自签名以后未被更改,任何对数据的更改都会导致验证失败。

        非抵赖性:签名者不能否认他们签署的文件或消息,因为数字签名是独一无二,不能伪造。

5.5.2 数字签名的法律效力

        在许多国家和地区,数字签名具有与手写签名等同的法律效力。在2000年法国通过的法律以及2001年发布的法令中,明确了数字签名的合法性,这为数字签名在商业和法律活动中的使用提供了法律基础。

5.5.3 实现机制

        数字签名的实现基于公钥加密技术:

        签名者使用私钥进行签名。

        任何人都可以使用签名者的公钥来验证签名的有效性。

5.5.4 常见的数字签名算法

        RSA:基于大整数分解难题的数字签名算法。

        El Gamal:基于离散对数问题的数字签名算法。

        DSA(Digital Signature Algorithm):一种改进的El Gamal算法变体,由美国国家标准技术研究院(NIST)和美国国家安全局(NSA)于1994年开发。虽然DSA的起源是政府机构,但它已被广泛采用,并作为数字签名的国际标准。尽管有关DSA可能存在后门的猜测,但没有确凿证据表明存在这样的后门。

        数字签名是确保电子交易和通信安全的基石,尤其是在涉及敏感信息传输时。通过使用这些技术,可以确保交易的每一方都能够验证对方的身份,同时保证传输内容的真实性和完整性。

5.5.5 数字签名的哈希

        通常被认为是“天真”的因为它直接在整个文件上使用了公钥算法进行签名,而实际应用中通常不这么做,原因是效率问题。具体过程如下:

        a. Alice:想要发送一个文件给 Bob。

        b. Alice使用她的私钥(Priv(Alice))对整个文件进行签名。

        c. Alice将原始文件和数字签名一起发送给Bob。

        d. Bob收到文件和签名后,使用Alice的公钥(Pub(Alice))来验证签名。

        e. Bob对比验证结果,如果签名匹配,就证明文件确实来自Alice并且内容未被篡改。

        然而,这个方法存在一个主要问题:计算时间太长。对于大文件来说,使用公钥算法直接签名会花费过多的时间。这是因为公钥加密和数字签名算法(如RSA、El Gamal或DSA)在大文件上的运算成本非常高。

        为了解决这个问题,实际中我们通常先对文件进行哈希处理,生成一个固定长度的摘要,然后再对这个摘要进行数字签名。这样无论原始文件有多大,生成和验证签名所需要处理的数据量都是恒定的,这大大提高了效率。接收方在收到文件后,会执行相同的哈希处理,并用发送方的公钥验证签名。如果哈希值匹配,那么文件就是真实且未被篡改的。过程如下:

        a. Alice(发信人) 准备发送一个文件给 Bob(接收人)。

        b.哈希处理:Alice首先对文件内容运用哈希函数,生成一个固定长度的摘要(Hashed)。哈希函数的特点是计算速度快,且几乎不可能从摘要反推出原始数据(哈希函数是单向的)。

        c.签名摘要:接下来,Alice使用她的私钥(Priv(Alice))对哈希摘要进行数字签名。然后将原文件和签名后的哈希摘要一起发送给Bob。

        d.Bob的验证过程:收到文件后,Bob用相同的哈希函数对文件进行哈希处理。Bob使用Alice的公钥(Pub(Alice))来验证Alice发送过来的签名摘要是否有效。如果摘要匹配,Bob可以确信文件确实来自Alice并且在传输过程中未被篡改。

        这个过程中使用了哈希函数来减少需要签名的数据量,从而显著提高了处理速度。但是,这个方法的安全性依赖于哈希函数的强度。如果使用的哈希函数容易发生冲突(即两个不同的文件产生相同的哈希值),攻击者可能会构造另一个文件具有相同的哈希摘要,这会破坏系统的安全性。因此,不推荐使用如MD5或可能存在安全风险的SHA-1,而是应使用如SHA-256这样的较强的哈希函数。

5.6 数字签名的操作流程

        数字签名是一种用于验证消息发送者身份、保证消息完整性,并防止发送者否认发送特定消息的技术。这是一个非对称加密的应用,允许任何人使用公钥来验证签名,但只有拥有私钥的人才能生成签名。下面是数字签名的具体运作流程:

        计算消息摘要:Alice(消息的发送者)会先使用哈希函数计算她想要发送的消息的摘要。这个摘要是一个较短的、代表原始消息的固定长度的值。

        用私钥加密摘要:Alice随后使用她的私钥对这个消息摘要进行加密,这一加密过的摘要就构成了数字签名。由于只有Alice有她的私钥,因此理论上只有她能生成这个签名。

        发送消息和签名:Alice将原始消息和数字签名一同发送给Bob(消息的接收者)。

        验证签名:Bob收到消息后,使用Alice的公钥对数字签名进行解密,得到一个摘要值。同时,Bob使用同一哈希函数对Alice发送来的原始消息计算摘要。如果这两个摘要值匹配,那么Bob就可以确定消息确实来自Alice,并且在传递过程中未被篡改。

5.7 使用密钥的最佳实践

        尽管理论上同一对密钥既可以用于加密通信,也可以用于数字签名,但在实践中出于安全和组织方面的考虑,通常建议使用两对密钥:一对用于加密(保密通信),另一对用于数字签名(验证身份和消息的完整性)。这样做的好处包括:

        分离使用:在使用密钥的目的上进行分离,有助于避免将加密和签名的安全风险汇集在同一对密钥上。

        安全合规:在一些法律或组织政策中,可能要求对加密和签名使用不同的密钥。

        灵活性和控制:如果其中一对密钥需要更换,不会影响到另一对密钥的使用。

        减少风险:如果签名密钥泄露,不会危及加密的通信内容;同样,如果加密密钥被破解,签名的有效性和信任度仍然得到保证。

        按照最佳实践,用户应该分别管理加密密钥和签名密钥,确保它们的安全性和有效性。

6. 零知识证明

        证明是什么?说服对方相信某事。

        知识是什么?可以理解为信息与能力。拥有知识意味着拥有做某件事的能力。

        零知识是什么?在不泄漏额外信息的证明.

        阿里巴巴洞穴的故事:

        交互式证明系统:交互图灵机              

        零知识证明(Zero-Knowledge Proof,ZKP)是一种密码学方法,它允许证明者向验证者证明某个断言是真实的,而无需泄露除了该断言的真实性之外的任何信息。这种方法是由Shafi Goldwasser、Silvio Micali和Charles Rackoff在20世纪80年代提出的。

        零知识证明(Zero Knowledge Proof)是一种加密方法。这种方法特别适用于需要证明拥有某个秘密,但又不希望将该秘密直接暴露的情况

        在这个上下文中,我们关注的是如何证明一个人拥有某个秘密(如一个数字或密码),但又不直接展示这个秘密。这个过程利用了单向函数和随机掩码的概念。下面,我将解释一种特定场景下的零知识证明——证明某人拥有一个特定的对数值,而不透露该值本身

6.1 零知识证明的基本特点

        完整性:如果证明者按照协议正确地执行了证明过程,那么诚实的验证者会被说服。
        可靠性:如果证明者试图欺骗验证者,那么他几乎不可能成功。
        零知识性:验证者除了知道声明的事情是真的之外,不会获得任何其他知识。

6.2 系统参数

        系统设定了两个主要参数:一个大的质数 p,和一个生成元 \alpha。这里,\alphaZ_p^*的一个元素,而Z_p^*表示所有小于p并且与p互质的正整数的集合。在这个设置中,每个用户都有一个私钥s和一个对应的公钥I,其中I = \alpha^s \mod p。这里的I作为用户在系统中的标识符(或公钥)。

6.3 零知识证明的目标

        目标是证明某用户确实拥有私钥s,而无需明文发送s。这意味着用户需要以某种方式向系统或其他用户证明他们知道\alphas次方根,但又不直接透露s的值。

6.4 零知识证明的过程

        这个过程一般涉及几个步骤,包括挑战和响应。为了简化,我们这里描述一个基于离散对数问题的简化版流程:

        a. 提交证据阶段:证明者选择一个随机数r,计算T = \alpha^r \mod p,然后将T 发送给验证者作为他们承诺的证据。

        b. 挑战阶段:验证者向证明者发出一个随机挑战,要求证明者以某种方式响应,这种方式需要用到他们的秘密s,但又不直接透露s

       c.  响应阶段:证明者使用他们的私钥s和先前选择的随机数r来生成一个响应,这个响应既证明了他们知道秘密s,又没有直接透露 s

        d. 验证阶段:验证者根据证明者的响应、公钥I,以及先前的提交T来验证证明者是否真的知道秘密s

        这个过程通过确保即使在通信过程中拦截了消息,攻击者也无法获得秘密s 的任何信息,从而保护了秘密的安全。零知识证明不仅能用于保护秘密,还能用于各种加密应用,如身份验证、数字货币等,使其成为现代加密技术中一个非常重要的组成部分。

6.4 Schnorr签名协议

        你提到的是一个简化版本的Schnorr签名协议,这是一个典型的零知识证明(Zero-Knowledge Proof)协议,它可以让证明者P(Prover)向验证者V(Verifier)证明他知道某个离散对数(logarithm),即某个值s的值,而无需透露s本身。这里是协议的具体步骤:

6.4.1 步骤1:承诺(Commitment)

        P选择一个随机数r(在模p-1下),计算t = \alpha^r \mod p

        P将t发送给V,作为承诺。

6.4.2 步骤2:挑战(Challenge)

        V选择一个随机的二进制位e,其值为0或1,并将这个值发送给P作为挑战。

6.4.3 步骤3:回应挑战(Response)

        如果e = 0,P发送x = r \mod (p-1)作为回应。

        如果,P发送x = (r + s) \mod (p-1)作为回应,其中s是P试图证明知道的私钥。

6.4.4 步骤4:验证(Verification)

        V接收到x后,将其用于下面的验证:

        如果e = 0,V检查\alpha^x \mod p是否等于t

        如果e = 1,V检查\alpha^x \mod p是否等于It \mod p,其中I = \alpha^s \mod p是P的公钥。

        通过这个协议,V能够确信P知道对应于公钥I的私钥s,而P没有泄露任何有关s的信息。每次运行协议,P使用不同的随机数r,这使得攻击者无法从多次执行协议中获取关于s的任何信息。这个协议的安全性基于离散对数问题的难解性。

6.5 离散对数证明协议

        下图是零知识证明中的离散对数证明协议的一个阶段,其中参与者P(证明者)试图向V(验证者)证明他知道某个值s的离散对数,而不泄露s本身。

6.5.1 承诺阶段的作用

        承诺阶段允许P提前固定一个随机数r,并计算出t = \alpha^r \mod p。这一步是证明过程中的第一步,它设置了一个基线,以便在接下来的步骤中,验证者V能够检查P是否真的知道私钥s

        承诺阶段的作用是:确保P无法在知道V的挑战后更改他的响应。使得验证过程对于V来说是零知识的,即V不会学到除了P知道私钥s以外的任何信息。

6.5.2 模拟攻击者的策略

        如果一个模拟攻击者I(冒名者)尝试在不知道s的情况下通过协议,他可以尝试猜测V的挑战。如果V的挑战总是固定的,比如总是1,那么I可以选择一个随机数r并发送t = \alpha^r \mod p作为承诺。如果挑战是1,I可以简单地回应r + s。但因为I不知道s,他必须在没有挑战的情况下猜测一个s,如果挑战变成0,他就会被揭露。

6.5.3 多轮认证的必要性

        对于一个不知道s的冒名者I来说,他在每一轮中都有一半的概率能够猜对V的挑战。但如果协议执行多轮,冒名者通过所有轮次的概率会急剧下降。在执行n轮的情况下,冒名者不被发现的概率为(1/2)^n,这个概率随着n的增加而迅速减小。

        通过要求多轮证明,可以大大降低冒名者成功模拟的可能性,提高协议的安全性。在实际应用中,协议通常会运行足够多的轮次,以确保即使是极小的欺骗概率也能被检测到。

6.6 冒名者的策略

        在这个零知识证明协议的场景中,如果冒名者(Imposteur)知道验证者(Vérificateur)只会问他e = 1的情况,那么他可以采用一种策略来假装他知道私钥s,尽管他实际上并不知道。

6.6.1 冒名者的策略

        冒名者知道在第三步他需要提供一个x,使得\alpha^x \equiv It \mod p,其中I = \alpha^s \mod p是证明者(Prouveur)的公开值,t是在第一步中发送给验证者的承诺值。冒名者可以采取以下策略:

        a.不正确地计算t

        而不是通过选择一个随机数r来正确计算t = \alpha^r \mod p,冒名者可以反向工作,选择一个x,然后计算t作为t = \alpha^x/I

        b. 发送计算结果:在第一步(承诺)中,冒名者将这个计算得到的t发送给验证者。

6.6.2 验证者提问e = 0的后果

        如果验证者最终问了e = 0,冒名者就无法提供一个合适的r,因为这就相当于要求他解决离散对数问题来找到满足t = \alpha^rr,而冒名者没有足够的信息来计算这个值。

6.6.3 结果

        这个策略表明,如果验证过程中挑战是可预测的,那么零知识证明的安全性就会被破坏,因为冒名者可以调整他们的承诺来应对可预见的挑战。这就是为什么在实际的零知识证明协议中,挑战必须是随机和不可预测的。这样,即使是冒名者也没有办法提前知道他应该准备回应什么样的挑战,因此他无法成功地通过验证过程而不被发现。

6.7 二次剩余问题

        在密码学中,特别是在基于零知识证明的身份验证协议中,二次剩余问题(Quadratic Residuosity Problem)扮演了一个重要角色。一个数y是模N的二次剩余,如果存在一个整数x,使得x^2 \equiv y \mod N。在不知道N的质因数分解的情况下,确定一个数是否是二次剩余或者找到对应的x是困难的。

6.7.1 二次剩余问题

        a. 二次剩余的确定:给定两个整数yN,判断y是否是模N的二次剩余可以通过Jacobi符号来进行,但如果没有N的质因数分解,我们无法肯定地知道y是否确实是一个二次剩余。

        b. 求解x:如果我们知道y是二次剩余,并想要找到一个x,使得x^2 \equiv y \mod N,而N是两个大素数的乘积,如果我们不知道这些素数,这个问题就成了NP难题,这个问题没有已知的多项式时间算法。

6.7.2 Fiat-Shamir身份验证协议

        Fiat-Shamir协议是一个非交互式的零知识证明协议,它利用了二次剩余问题来安全地验证一个人的身份,而不泄露任何有用的信息。其步骤大致如下:

        a. 承诺(Commitment):证明者P选择一个随机数r,并计算承诺t = r^2 \mod N

        b. 挑战(Challenge):验证者V随机选择一个二进制位e \in \{0, 1\}。0或1,概率均为1/2

        c. 回应(Response):P基于e提供一个回应。如果e = 0,P可能只需要提供r;如果,P需要提供r的一个函数,这取决于P知道的秘密。计算et的一个平方根Z,将Z发送给V.

        d. 验证(Verification):V检查P的回应是否与t一致,并确保P的确知道某个与t相关的秘密信息,而不必暴露这个秘密信息本身。验证Z^2= et mod n 

        通过这个协议,P可以证明他知道某个秘密信息,而不必向V透露这个信息。这种协议的一个典型应用是在安全环境中身份验证,如安全登陆系统。由于二次剩余问题的难度,如果不知道N的分解,无法欺骗系统。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1879607.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

树莓派开发之文件传输

文章目录 一、简介使用U盘传输文件使用SD卡传输文件使用Xftp 7传输文件 二、 总结 一、简介 在树莓派开发中经常会用到文件传输&#xff0c;下面介绍几种树莓派文件传输的几种方法。 使用U盘传输文件 &#xff08;1&#xff09;复制所需传输文件到U盘 &#xff08;2&#…

双指针-旋转链表

目录 一、问题描述 二、解题思路 三、代码实现 四、刷题链接 一、问题描述 二、解题思路 1.先确定链表长度为len 2.注意当K>len时&#xff0c;如果每个节点都往右移动len个位置&#xff0c;等价于不移动&#xff0c;所以需要求KK%len。 3.所有元素右移K个位置&#xf…

Golang-channel理解

channel golang-channel语雀笔记整理 channelgolang channel的设计动机&#xff1f;chanel的数据结构/设计思考 golang channel的设计动机&#xff1f; channel是一种不同协程之间实现异步通信的数据结构。golang中有一种很经典的说法是要基于通信实现共享内存&#xff0c;而不…

多表执行嵌套查询,减少笛卡尔积,防止内存溢出

问题&#xff1a;当涉及四个表的查询时&#xff0c;会产生大量的笛卡尔积导致内存溢出。 解决办法 &#xff1a;可以使用嵌套查询将多表的联合查询拆分为单个表的查询&#xff0c;使用resultmap中的association&#xff08;适合一对一&#xff09; 或 collection&#xff08;一…

docker -run hello-world超时

主要原因就是尝试拉取库的时候没有从阿里云镜像里拉&#xff0c;所以设置一下就好了 这里使用的是ubuntu系统&#xff08;命令行下逐行敲就行了&#xff09; sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": [&quo…

51个图表,完美展示数据分布关系!

本节介绍seaborn展示数据分布关系的图表&#xff08;Distribution plots&#xff09;的实现&#xff0c;该类图表用于展示数据集的分布规律&#xff0c;帮助快速获取数据多方面信息&#xff0c;例如&#xff0c;观测值的范围、中心趋势、是否存在某个方向上严重偏斜、是否存在双…

每日一题(6.22-6.28)

(&#xff61;&#xff65;∀&#xff65;)&#xff89;&#xff9e;嗨&#xff0c;中途考电路分析去了&#xff0c;空了几天的题没有练&#xff0c;为什么三相电路他都没讲过的都要考啊&#xff1f;我服了&#xff0c;什么在Y型三相电路&#xff0c;线电压和相电压的比值都考&…

Hadoop3:Yarn容量调度器配置多队列案例

一、情景描述 需求1&#xff1a; default队列占总内存的40%&#xff0c;最大资源容量占总资源60%&#xff0c;hive队列占总内存的60%&#xff0c;最大资源容量占总资源80%。 二、多队列优点 &#xff08;1&#xff09;因为担心员工不小心&#xff0c;写递归死循环代码&#…

扛鼎中国AI搜索,天工凭什么?

人类的创作不会没有瓶颈&#xff0c;但AI的热度可不会消停。 大模型之战依旧精彩&#xff0c;OpenAI选择在Google前一天举行发布会&#xff0c;两家AI企业之间的拉扯赚足了热度。 反观国内&#xff0c;百模大战激发了大家对于科技变革的热切期盼&#xff0c;而如今行业已逐渐…

20240628每日前端---------解决vue项目滥用watch

主题 滥用watch。 名字解释 watch 例子 先看一个代码例子&#xff1a; <template>{{ dataList }} </template><script setup lang"ts"> import { ref, watch } from "vue";const dataList ref([]); const props defineProps([&q…

MySQL高级-SQL优化-insert优化-批量插入-手动提交事务-主键顺序插入

文章目录 1、批量插入1.1、大批量插入数据1.2、启动Linux中的mysql服务1.3、客户端连接到mysql数据库&#xff0c;加上参数 --local-infile1.4、查询当前会话中 local_infile 系统变量的值。1.5、开启从本地文件加载数据到服务器的功能1.6、创建表 tb_user 结构1.7、上传文件到…

笔记本电脑安装CentOS

正文共&#xff1a;1234 字 24 图&#xff0c;预估阅读时间&#xff1a;2 分钟 前面我们对VPP进行了多次介绍&#xff08;羡慕&#xff01;大佬的VPP能达到180G性能&#xff0c;而我的却只有13.5G&#xff09;&#xff0c;可以发现他的很多优点&#xff0c;但是我们也可以发现它…

从源码分析Springboot自动配置原理

一、什么是Springboot的自动配置 Spring Boot自动配置&#xff08;Auto-configuration&#xff09;是Spring Boot框架的核心特性之一&#xff0c;它使得开发者可以更容易地创建基于Spring的应用程序&#xff0c;而无需进行大量的手动配置。自动配置基于开发者添加的jar依赖项来…

Nuxt3 的生命周期和钩子函数(六)

title: Nuxt3 的生命周期和钩子函数&#xff08;六&#xff09; date: 2024/6/30 updated: 2024/6/30 author: cmdragon excerpt: 摘要&#xff1a;本文深入解析了Nuxt3框架中的多个核心生命周期钩子和组件注册功能&#xff0c;包括imports:sources、imports:extend、import…

【Qt】之【Bug】大量出现“未定义的标识符”问题

背景 构建时出现大量错误 原因 中文注释问题 解决 方法1. 报错代码附近的中文注释全部删掉。。。 方法2. 报错的文件添加 // Chinese word comment solution #pragma execution_character_set("utf-8")

2024年【安全生产监管人员】考试资料及安全生产监管人员考试总结

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全生产监管人员考试资料是安全生产模拟考试一点通生成的&#xff0c;安全生产监管人员证模拟考试题库是根据安全生产监管人员最新版教材汇编出安全生产监管人员仿真模拟考试。2024年【安全生产监管人员】考试资料及…

算法力扣刷题 二十六【459.重复的子字符串】

前言 字符串篇&#xff0c;继续。 记录 二十六【459.重复的子字符串】 一、题目阅读 给定一个非空的字符串 s &#xff0c;检查是否可以通过由它的一个子串重复多次构成。 示例 1: 输入: s "abab" 输出: true 解释: 可由子串 "ab" 重复两次构成。示例…

录取查询怎么公布?

这篇文章对于教育工作者来说非常有用&#xff0c;提供了关于如何公布学生录取情况的多种方法和注意事项。以下是对您文章的一些补充和建议&#xff1a; 1.易查分的使用&#xff1a;易查分系统是一个很好的工具&#xff0c;特别是对于那些不擅长技术开发的老师。它简化了查询过程…

40 - 餐馆营业额变化增长(高频 SQL 50 题基础版)

40 - 餐馆营业额变化增长 -- 方法一 SELECT t.visited_on,sum(c.amount) amount,ROUND(sum(c.amount) / 7, 2) average_amount FROM customer c,-- 查出足够7天的数据日期(SELECT DISTINCT visited_onFROM customerWHERE visited_on >(SELECT ADDDATE(MIN(visited_on), 6) F…

Nginx-2

一、高级配置 1.1网页状态页 基于nginx 模块 ngx_http_stub_status_module 实现&#xff0c;在编译安装nginx的时候需要添加编译参数 --with-http_stub_status_module&#xff0c;否则配置完成之后监测会是提示语法错误注意: 状态页显示的是整个服务器的状态,而非虚拟主机的状…