ECIES实现原理
ECIES(椭圆曲线集成加密方案)是基于 ECC(椭圆曲线密码学)构建的具体加密应用方案,二者是 “基础理论” 与 “实际应用” 的关系,具体可从以下角度理解:
一、本质定位
- ECC(Elliptic Curve Cryptography):
是一种密码学基础理论,基于椭圆曲线数学特性设计,提供了一套公钥密码体系的底层支撑。
核心是利用椭圆曲线上的点运算(如点加法、点乘法)实现密钥生成、密钥协商等基础功能,其安全性依赖于 “椭圆曲线离散对数问题” 的计算复杂度(比 RSA 的大整数分解问题更难,因此同等安全强度下,ECC 密钥更短,效率更高)。 - ECIES(Elliptic Curve Integrated Encryption Scheme):
是基于 ECC 实现的具体加密方案(属于应用层),它整合了 ECC 的密钥协商能力、对称加密算法(如 AES) - ECC、ECDH、ECIES
三者是 “基础理论→核心技术→应用方案” 的递进关系,围绕椭圆曲线密码学形成一套完整的加密体系
二、ECIES实现原理
以 BouncyCastle 库的 ECIES 实现为例,来拆解每个步骤的内部流程
(假设使用secp256r1曲线,AES 对称加密,SHA256 作为 KDF 和 MAC 哈希):
1、调用 “生成密钥对” 方法时,内部发生了什么?
// 伪代码:生成ECIES密钥对
val keyPair = ECKeyPairGenerator.generate()
// 返回 (公钥, 私钥)
内部流程:
- 步骤 1:选择椭圆曲线参数
库会加载预设的椭圆曲线参数(如secp256r1),包括:
曲线方程(如y² = x³ + ax + b);
基点G(曲线上的一个固定点);
阶n(基点G的循环次数,一个大质数)。 - 步骤 2:生成私钥
库会用加密安全随机数生成器(SecureRandom)生成一个随机数d,范围是 1 < d < n(私钥本质是这个随机数)。 - 步骤 3:计算公钥
用椭圆曲线的点乘法,将基点G乘以私钥d,得到公钥Q:
Q = d * G(Q是曲线上的一个点,包含 x 和 y 坐标,公钥本质是这个点的坐标)。
最终结果:返回一个密钥对,包含公钥Q(曲线上的点)和私钥d(随机数)。
2、调用 “拿公钥加密数据” 方法时,内部发生了什么?
// 伪代码:用接收方公钥加密
val ciphertext = ECIESEngine.encrypt(plaintext, receiverPublicKey)
内部流程(核心是 “混合加密”,公钥不直接加密明文,而是加密对称密钥):
- 步骤 1:生成临时密钥对
发送方临时生成一个新的 ECC 密钥对(d1, Q1),其中d1是临时私钥(随机数),Q1是临时公钥(Q1 = d1 * G)。 - 步骤 2:计算共享密钥
发送方用接收方的公钥Q(接收方公钥)和自己的临时私钥d1,通过椭圆曲线点乘法计算共享密钥点S:
S = d1 * Q(因为Q = d * G,所以S = d1 * d * G,后续接收方可通过自己的私钥d和临时公钥Q1计算出同一个S)。 - 步骤 3:派生实际密钥(KDF)
从共享密钥点S的 x 坐标中提取字节,通过 KDF(密钥派生函数,如 KDF2+SHA256)生成两个密钥:
对称加密密钥Kenc(如 16 字节,用于 AES);
MAC 密钥Kmac(如 16 字节,用于 HMAC)。 - 步骤 4:加密明文
用对称加密密钥Kenc对明文进行对称加密(如 AES-CBC),得到加密后的明文C。 - 步骤 5:生成 MAC
用 MAC 密钥Kmac对加密后的明文C计算 MAC 值(如 HMAC-SHA256),确保数据未被篡改。 - 步骤 6:组装加密结果
最终返回的密文是一个组合体:
ciphertext = [临时公钥Q1] + [加密后的明文C] + [MAC值]
3、调用 “拿私钥解密数据” 方法时,内部发生了什么?
// 伪代码:用自己的私钥解密
val plaintext = ECIESEngine.decrypt(ciphertext, myPrivateKey)
内部流程(反向还原加密步骤):
- 步骤 1:解析密文
从接收的ciphertext中拆分出三部分:
发送方的临时公钥Q1;
加密后的明文C;
附带的 MAC 值。 - 步骤 2:计算共享密钥
接收方用自己的私钥d和发送方的临时公钥Q1,通过点乘法计算共享密钥点S:
S = d * Q1(因为Q1 = d1 * G,所以S = d * d1 * G,与发送方计算的S完全相同)。 - 步骤 3:派生密钥(KDF)
用与加密相同的 KDF,从S的 x 坐标派生Kenc(对称加密密钥)和Kmac(MAC 密钥)。 - 步骤 4:验证 MAC
用Kmac对加密后的明文C重新计算 MAC,并与接收的 MAC 值对比:
若不一致,说明数据被篡改,抛出异常;
若一致,继续解密。 - 步骤 5:解密密文
用Kenc对加密后的明文C进行对称解密(如 AES-CBC),得到原始明文。
最终结果:返回解密后的原始明文。