ECDH 算法概述(CNG 示例)

Posted yunshouhu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ECDH 算法概述(CNG 示例)相关的知识,希望对你有一定的参考价值。

转自: https://docs.microsoft.com/zh-cn/previous-versions/visualstudio/visual-studio-2008/cc488016(v=vs.90)

ECDH全称是椭圆曲线迪菲-赫尔曼秘钥交换(Elliptic Curve Diffie–Hellman key Exchange),主要是用来在一个不安全的通道中建立起安全的共有加密资料,一般来说交换的都是私钥,这个密钥一般作为“对称加密”的密钥而被双方在后续数据传输中使用。

ECDH是建立在这样一个前提之上的,给定椭圆曲线上的一个点P,一个整数k,求Q=KP很容易;但是通过Q,P求解K很难。

通过椭圆曲线 Diffie-Hellman (ECDH) 密钥协商协议,两个用户可以创建共享的机密协议。他们可以在不安全的公共媒体上完成此操作,而不必事先交换任何私有信息。该共享机密协议通常用于派生密钥材料。对称算法(如高级加密标准 (AES) 算法)可以使用密钥材料对后续消息进行加密。

下一代加密技术 (CNG) 安全通信示例演示了 ECDH 和 AES 算法的 CNG 实现。Alice、Bob 和 Mallory 在创建 Communicator 对象时在其 Run 方法中创建了加密密钥。

ECDH 数学

ECDH 协议依赖两个公共参数:p 和 g。参数 p 是一个大的质数,参数 g 是一个小于 p 的整数。这两个参数通过不安全的线路进行交换。Alice 和 Bob 收到这两个公共参数后,选择私有整数。Alice 选择了 a,Bob 选择了 b。这些值称为私钥。

然后,Alice 和 Bob 使用公共参数及其私钥创建公钥。Alice 使用 (g^a) mod p,Bob 使用 (g^b) mod p。这些是非对称密钥,因为它们不匹配。

Alice 和 Bob 交换这些公钥,并使用它们计算共享的机密协议。虽然 Alice 和 Bob 不知道彼此的私钥,ECDH 数学也会保证 Alice 和 Bob 将计算出同一共享机密协议。

ECDH 数学
说明:

只有 a、b 和 g^ab = g^ba 保密。其他所有值都是公开的。

任何截获交换的人都能够复制 p、g 和两个公钥。但是,要在不知道 Alice 和 Bob 的私钥的情况下从四个公开共享值生成共享机密协议,在计算上是不可行的。

使用暴力(即尝试所有可能的密钥)对 ECDH 加密的消息进行解密的难度与离散对数问题属同一级别。不过,ECDH 算法使用较短的密钥即可达到相同程度的安全性,这是因为它依赖椭圆曲线而不是对数曲线。

ECDH 示例

下面的示例使用小整数来演示 ECDH 算法。

  1. Alice 和 Bob 同意使用质数 p 和基础整数 g:

    p = 83, g = 8

  2. Alice 选择机密整数 a = 9,然后向 Bob 发送 (g^a) mod p:

    (8^9) mod 83 = 5

  3. Bob 选择机密整数 b = 21,然后向 Alice 发送 (g^b) mod p:

    (8^21) mod 83 = 18

  4. Alice 计算 ( ( (g^b) mod p)^a) mod p:

    (18^9) mod 83 = 24

  5. Bob 计算 ( ( (g^a) mod p)^b) mod p:

    (5^21) mod 83 = 24

由于 g^(ab) = g^(ba),Alice 和 Bob 计算出相同的值 (24)。该值就是共享机密协议。Alice 和 Bob 使用这个值派生 AES 算法用来对其消息进行加密的密钥材料。

此示例使用值 24 生成共享机密协议。由于这是一个小的值,它生成的加密消息很容易被暴力攻击破坏。在实际情况中,p、g、a 和 b 是很大的数,需要计算机来生成相应的共享机密协议。

安全通信示例中使用的 CNG 类对复杂的数学进行了抽象,使您可以将精力集中在实现安全解决方案上,而不是考虑如何将大数相乘。

协议的限制

由于 ECDH 密钥交换协议不验证公钥发送者的身份,因此无法阻止中间人攻击。如果监听者 Mallory 截获了 Alice 的公钥,就可以替换为他自己的公钥,并将其发送给 Bob。Mallory 还可以截获 Bob 的公钥,替换为他自己的公钥,并将其发送给 Alice。这样,Mallory 就可以轻松地对 Alice 与 Bob 之间发送的任何消息进行解密。他可以更改消息,用他自己的密钥对消息重新加密,然后将消息发送给接收者。

为了解决此问题,Alice 和 Bob 可以在交换公钥之前使用数字签名对公钥进行签名。有两种方法可以实现此目的:

  • 使用安全的媒体(例如语音通信或可信载运商)在双方之间传输数字签名密钥。

  • 使用公共证书颁发机构 (CA) 向双方提供可信数字签名密钥。

在这两种情况下,都必须使用外部身份验证方案来验证公钥发送者的身份。CNG 示例演示了当未对密钥发送者进行身份验证时会发生的情况。编写该示例旨在启用一个安全漏洞。

对称和非对称密钥

非对称系统(例如 ECDH)非常慢。因此,在对大的消息进行加密时不使用它们,而是使用速度快很多倍的对称系统(例如 AES)。

典型的加密解决方案使用非对称系统派生对称共享机密协议。然后使用该共享机密协议来派生对称算法用来对消息进行加密的密钥材料。

CNG 安全通信示例对此行为进行了建模,如下所述:

  • 它使用非对称算法,即 ECDH 算法的 CNG 实现(ECDiffieHellmanCng 类)来派生对称加密密钥(共享机密协议)。

  • 然后,CNG ECDiffieHellmanCng.DeriveKeyMaterial 方法使用此密钥派生密钥材料。对称 AES 算法的 CNG 实现(Aes 类)使用该密钥材料对消息进行加密。

请参见

以上是关于ECDH 算法概述(CNG 示例)的主要内容,如果未能解决你的问题,请参考以下文章

ECDH 算法概述(CNG 示例)

从共享密钥生成派生密钥 (ECDH-ES) - ConcatKDF

椭圆加密算法

如何访问 OpenSSL 的 EVP_PKEY 结构中的原始 ECDH 公钥、私钥和参数?

CryptQueryObject 的 CNG 替换

转帖WebRTC回声抵消模块简要分析