import gmpy2
# 给定的p, q, e值
p = 473398607161
q = 4511491
e = 17
n = p * q # 计算模数n
# 使用扩展欧几里得算法计算d,这里我们假设e和(p-1)*(q-1)互质
phi_n = (p - 1) * (q - 1)
d = gmpy2.invert(e, phi_n)
# 要签名的数字(这里我们直接使用999)
message = 999
# 使用私钥d对消息进行签名
# 在实际中,你会对消息的哈希值进行签名,但这里我们直接对消息签名
signature = pow(message, d, n)
print("Signature:", signature)
下面是不使用 gmpy2库
# 给定的p, q, e值
p = 473398607161
q = 4511491
e = 17
# 计算模数n
n = p * q
# 计算欧拉函数φ(n)
phi_n = (p - 1) * (q - 1)
# 使用扩展欧几里得算法的一个简化版本来找到d,这里只适用于较小的e和phi_n
def extended_gcd(a, b):
if a == 0:
return (b, 0, 1)
else:
g, y, x = extended_gcd(b % a, a)
return (g, x - (b // a) * y, y)
def modinv(a, m):
g, x, y = extended_gcd(a, m)
if g != 1:
raise Exception('modular inverse does not exist')
else:
return x % m
# 计算私钥d
d = modinv(e, phi_n)
# 要签名的数字(这里我们直接使用999)
message = 999
# 使用私钥d对消息进行签名(注意:这在实际应用中是不安全的)
# 注意:这里我们直接使用Python的pow函数进行模幂运算
signature = pow(message, d, n)
# 输出签名结果
print("Signature:", signature)
结果:flag{535998728738810237}