标题: 椭圆曲线加密算法之Sony惨案模拟题的答案 创建: 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, ecdsa k = 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兼容。