目录
一、ECC(椭圆曲线加密)公钥加密算法详解与C语言实现
ECC原理
椭圆曲线数学基础
ECC基于以下数学概念:
-
群(Group):在椭圆曲线上定义一种封闭的加法操作,使得任意两点P和Q的和仍在此曲线上,并满足加法的交换律、结合律及存在单位元(零点O)。
-
离散对数问题(Discrete Logarithm Problem, DLP):给定曲线上两点P和Q,如果知道Q=kP(即Q是P的k倍),则DLP要求找出整数k。对于适当的椭圆曲线参数,DLP被认为是计算上难解的,这是ECC安全性的基础。
-
椭圆曲线上的点加法:定义在椭圆曲线上的加法不同于传统的向量加法。对于给定椭圆曲线E上的两点P=(x_P, y_P)和Q=(x_Q, y_Q),它们的和R=P+Q可以通过以下规则计算:
- 如果P=Q,计算垂直平分线与曲线的另一交点R',然后取R=-R'(负数表示逆运算)。
- 如果P≠Q,过P作平行于y轴的直线交曲线于另一点R',过Q作平行于x轴的直线交曲线于另一点S',则R=P+Q=S'+R'。
上述规则保证了加法的封闭性,并且在坐标计算上可以通过特定公式实现。
ECC密钥生成
ECC密钥生成过程如下:
-
选取曲线参数:选择一个合适的椭圆曲线参数集,包括曲线方程(如Weierstrass形式:y² = x³ + ax + b,其中a、b为曲线系数,满足特定条件以确保曲线是椭圆曲线),以及一个大的素数p作为有限域的阶(即所有坐标值都在模p意义下运算)。这些参数是公开的。
-
随机生成基点:在选定的椭圆曲线上选择一个生成元G,它是曲线上的一个特定点,具有较大的阶n(即存在整数k使得kG=O,但n是G生成的子群的阶数,而不是整个曲线在模p意义下的阶数)。G的选择应确保其阶n是一个大素数,且离散对数问题在该子群中难解。
-
计算公钥与私钥:用户随机选择一个整数d作为私钥(通常d是1到n-1之间的整数)。公钥P=dG通过点乘运算得到,即在椭圆曲线上计算d次G的和。公钥P与私钥d共同构成了ECC密钥对。
ECC加密与解密过程
ECC加密:
给定明文消息M(通常先经过某种哈希函数转换为椭圆曲线上的一个点),接收者的公钥P,加密过程如下:
其中,k是发送者随机生成的一个秘密整数,r是计算过程中产生的另一个随机数,[k]M表示M被k倍,[r]G表示G被r倍。C为加密后的密文,是一个椭圆曲线上的点。
ECC解密:
持有私钥d的接收者收到密文C后,进行如下解密: