创建: 2023-12-18 18:55
更新: 2023-12-20 11:47
https://scz.617.cn/misc/202312181855.txt
之前出了两道ECC的题
《椭圆曲线加密算法科普系列的作业》
https://scz.617.cn/misc/202312081417.txt
https://mp.weixin.qq.com/s/YwhqZ6RU4ABdWFMQrcpX2Q
《椭圆曲线加密算法之Sony惨案模拟题》
https://scz.617.cn/misc/202312111609.txt
https://mp.weixin.qq.com/s/D2M4Se7QIjvB_HqKRIrqRA
网友0x指纹(5845952017)完整答题,我转录一下。
2023-12-18 18:55
0x指纹(5845952017)关于《椭圆曲线加密算法科普系列的作业》的答案
from sage.all import *p = 10177777
a = 1
b = -1
E = EllipticCurve(GF(p), [a,b])
N = E.order()
n = factor(N)[-1][0]
h = N // n
P = E.random_point()
while h*P == E(0) :
P = E.random_point()
G = h*P
dA = 158903
dB = 17
HA = dA*G
HB = dB*G
print( n, G, HA, HB )
2023-12-18 19:03
0x指纹(5845952017)关于《椭圆曲线加密算法之Sony惨案模拟题》的答案
第一题直接套公式
n = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141
z1 = 0xfd8b4f3ab120efcd6bed61028c2a0b026f5d676535621339d0ed085313ae482c
z2 = 0x4ec0b587154fc85b7c28ad5b9f22225817027434b3b26ed895359643deba1e80
r = 0x902ed016f3b758876485e33c6ea3d4db8ef1a33b7d83ce26deeb751d117a829d
s1 = 0xa3c589cc084ba4b54bf184e22ba5e6e48f5821108c8c9a49d00f8fcf4afcbcb8
s2 = 0xc9bb9b5586ef058eba763dfef46b160945780184d016093345f871fc1a657a45
k = ((z1-z2)*pow(s1-s2,-1,n))%n
d = (pow(r,-1,n)*(s1*k-z1))%n
print( hex(k) )
print( hex(d) )k = 0x90a0b0c0d0e0f101259f2ae83a986c3b989d814fa02e8eac37c9c7c5b255620
d = 0x60e89fd3bec9c5184ff8b72883bb1989f5504a112f8521eb03258f4171af0c7e
第二题、第三题用ecdsa库来搞很方便,可以设置k和ECC私钥
import binascii, hashlib, ecdsak = 0x90a0b0c0d0e0f101259f2ae83a986c3b989d814fa02e8eac37c9c7c5b255620
d = '60e89fd3bec9c5184ff8b72883bb1989f5504a112f8521eb03258f4171af0c7e'
ecc_pri = ecdsa.SigningKey.from_string( binascii.unhexlify(d), curve=ecdsa.SECP256k1 )
with open('message_0.bin', 'rb') as f :
f_data = f.read()
f_sig = ecc_pri.sign( f_data, k=k, hashfunc=hashlib.sha512, sigencode=ecdsa.util.sigencode_der )
with open('message_0_other.sig', 'wb') as f :
f.write( f_sig )
md5sum message_0.sig message_0_other.sig
二者完全一样
scz:
可以不用binascii.unhexlify(),就用内置的bytes.fromhex()。
Sony惨案模拟题用了secp256k1这条椭圆曲线,前面通过名字直接引用预定义过的曲线。一般化时,假设没有名字,只有ECC参数,有兴趣者可以对之一般化。
另有starkbank-ecdsa库:
https://github.com/starkbank/ecdsa-python
相比ecdsa库,starkbank-ecdsa库差点意思,我不推荐。ecdsa.py实现Ecdsa类,有sign()、verify()两个类方法,其处理msg时要求类型是str,这不神经病么。可能是过去支持Python2时的遗迹,未对Python3进行优化。sign()无法指定k,对msg求哈希后未做截断处理,作者瞎吹与OpenSSL兼容。