已知椭圆曲线方程E11为:y 2 y^2y \n2\n =x 3 x^3x \n3\n +x xx+6(mod 11),取p(2,7)为一个生成元,,令k=3,d=5,e=h(m),写出签名与验证签名过程
时间: 2024-05-24 16:12:28 浏览: 143
签名过程:
1. 选取私钥为d=5。
2. 选取一个随机数k=3。
3. 计算椭圆曲线上的点P=k*G,其中G为公钥p(2,7)。
首先计算2G=G+G,3G=G+2G。根据椭圆曲线的加法规则,有:
2G = (6, 3)
3G = (2, 6)
因此,P=3G=(2,6)。
4. 计算r=x(P) mod 11,r为签名中的第一个参数。
r=2 mod 11。
5. 计算s=k^-1*(e+rd) mod (11-1),其中e为消息的哈希值。
假设消息的哈希值为h(m)=8。
首先计算k^-1 mod 10,根据扩展欧几里得算法,有:
3*7 + (-10)*2 = 1
因此,k^-1=7 mod 10。
接着计算s=7*(8+2*5) mod 10=9。
因此,签名为(2, 9)。
验证签名过程:
1. 接收到签名信息(2, 9)和消息m。
2. 计算椭圆曲线上的点P=s*G-e*P,其中G为公钥p(2,7)。
首先计算e的哈希值为h(m)=8。
接着计算-e*P=-5*(2,6)=(-10,2),根据椭圆曲线的加法规则。
最后计算P=9*G+(-10,2)=s*G。
因此,P=(7,3)。
3. 计算r=x(P) mod 11。
r=7 mod 11。
4. 验证签名是否有效,即判断r是否等于签名中的第一个参数。
由于r=7,而签名中的第一个参数为2,两者不相等,因此签名无效。
因此,此签名是无效的。
相关问题
已知椭圆曲线方程E11为:y^2=x^3+x+6(mod 11),取p(2,7)为一个生成元,,令k=3,d=5,e=H(M),写出签名与验证签名过程
签名过程:
1. 随机选择一个整数k ∈ [1, 10],计算P = kP。
2. 计算r = xP mod 11,如果r = 0,则重新选择k。
3. 计算s = k^(-1)(e + dr) mod 11,如果s = 0,则重新选择k。
4. 签名为(r,s)。
验证签名过程:
1. 验证r,s是否在[1,10]范围内。
2. 计算w = s^(-1) mod 11。
3. 计算u1 = ew mod 11和u2 = rw mod 11。
4. 计算点Q = u1P + u2p。
5. 如果r = xQ mod 11,则签名有效,否则无效。
已知椭圆曲线E11(1,6)表示 y2 = (x3 + x + 6) mod 11,用python编程求出该曲线上所有的点。
在Python中,我们可以使用elliptic_curve库来处理椭圆曲线。但是,对于模数较小的情况(如11),直接计算所有点可能会非常耗时,因为每个点都需要通过逐个尝试所有可能的x值来找到对应的y值,而这个集合通常是无限的,除非曲线有特殊性质(比如存在无穷远点)。对于这种简单的曲线,更常见的做法是使用更高效的算法,例如Baby-step Giant-step。
以下是一个基本的示例,展示如何遍历可能的x值并检查它们是否满足曲线方程:
```python
def find_points_on_curve(E11):
p = 11
a = 0
b = 6
points = []
def point(x):
y_square = ((x**3 + a*x + b) % p)**(p+1) % p
if y_square == 0 and x != 0 and x ** 2 != -b % p:
return (x, int(y_square ** 0.5)) # 返回合法的点对,注意模p取整
for i in range(1, p): # 取模11是因为我们只关心小于p的x值
point_x = point(i)
if point_x:
points.append(point_x)
# 包含原点O=(0,0)
points.append((0, 0))
return points
# 计算E11的所有点
all_points = find_points_on_curve((1, 6))
print("椭圆曲线E11上的所有点:", all_points)
阅读全文
相关推荐
















