椭圆曲线加密算法之Sony惨案模拟题的答案
2023-12-20 12:6:42 Author: mp.weixin.qq.com(查看原文) 阅读量:1 收藏

创建: 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

椭圆曲线加密算法之Sony惨案模拟题

网友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兼容。


文章来源: https://mp.weixin.qq.com/s?__biz=MzUzMjQyMDE3Ng==&mid=2247487018&idx=1&sn=a0ed8cbd1c2f19d21eed898c6a3ea0a4&chksm=fab2cd15cdc5440361921f404ee98c425fc2c52cd15748a5fce7b36865c8f5f2b8400d659625&scene=58&subscene=0#rd
如有侵权请联系:admin#unsafe.sh