defattack(lis): m = 5 n = 257 UL = matrix.identity(m) * CURVE.q UR = matrix.zero(m, n) DR = matrix.identity(n)
main_mat = [] for i inrange(5): z, r, s = lis[i] vec = [-(s-1)*z] zbin = bin(z)[2:].zfill(256) assertlen(zbin) == 256 zbin = zbin[::-1] for i inrange(256): tmp = (2^i) * (r + (2*int(zbin[i])-1) * s) % (CURVE.q) vec.append(tmp) main_mat.append(vec) mat = matrix(ZZ, main_mat).T
M = block_matrix(ZZ, [[UL, UR], [mat, DR]]) M = M.LLL() # print(M) for row in M: if row[5] == 1andset(row[6:]).issubset([0, 1]): print('Find solution!') d = int(''.join(list(map(str, row[6:][::-1]))), 2) return d
d = attack(lis) # print(d)
第三部分就是按照给出的签名和验证进行签名,费老半天了,用sage的椭圆曲线跑不出来不知道怎么回事。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
# %% P = d*secp256k1.G defsignature(msg): h = int(hashlib.sha256(msg).hexdigest(),16) k = h^^d r = (k*secp256k1.G).x s = inverse_mod(k,secp256k1.q) * (h + r*d) % secp256k1.q return'%064x%064x' % (r, s)
Gitalk 加载中 ...