80 lines
2.4 KiB
Python
80 lines
2.4 KiB
Python
from src.module.decdsa import *
|
|
import random
|
|
import hashlib
|
|
from sage.all import matrix, Integer, Zmod, vector
|
|
from ecdsa import NIST256p
|
|
curve = NIST256p
|
|
order = int(curve.order)
|
|
|
|
def case1():
|
|
ecdsa = DECDSA()
|
|
inc = 0
|
|
for i in range(100):
|
|
temp = random.randbytes(10)
|
|
signature = ecdsa.sign(temp)
|
|
hasil = ecdsa.verify(temp+b'1', signature)
|
|
if(not hasil):
|
|
inc += 1
|
|
print("Different message Failed:",inc)
|
|
# checking true
|
|
inc = 0
|
|
for i in range(100):
|
|
temp = random.randbytes(10)
|
|
signature = ecdsa.sign(temp)
|
|
hasil = ecdsa.verify(temp, signature)
|
|
if(not hasil):
|
|
inc += 1
|
|
print("Same message Failed:",inc)
|
|
|
|
# def Babai_closest_vector(B, target):
|
|
# # Babai's Nearest Plane algorithm
|
|
# M = B.LLL()
|
|
# G = M.gram_schmidt()[0]
|
|
# small = target
|
|
# for _ in range(1):
|
|
# for i in reversed(range(M.nrows())):
|
|
# c = ((small * G[i]) / (G[i] * G[i])).round()
|
|
# small -= M[i] * c
|
|
# return target - small
|
|
|
|
def case2():
|
|
ecdsa = ECDSA()
|
|
dataset = []
|
|
inc = 80
|
|
for i in range(inc):
|
|
temp = random.randbytes(10)
|
|
signature = ecdsa.sign(temp)
|
|
r1, r2, s = ecdsa.bytes_to_sign(signature)
|
|
message = temp
|
|
m1, m2 = message[:len(message)//2], message[len(message)//2:]
|
|
h1 = hashlib.sha256(m1).digest()
|
|
h2 = hashlib.sha256(m2).digest()
|
|
z1 = int.from_bytes(h1, byteorder='big') % order
|
|
z2 = int.from_bytes(h2, byteorder='big') % order
|
|
dataset.append([temp, z1, z2, r1, r2, s])
|
|
|
|
# B = 2**247
|
|
B = 2**201
|
|
p = order
|
|
Zn = Zmod(p)
|
|
|
|
m = [[order,0] + [-Integer((pow(dataset[i-1][5], -1, order)*(dataset[i-1][1]+dataset[i-1][2])-pow(dataset[i][5], -1, order)*(dataset[i][1]+dataset[i][2]))%order) for i in range(1, inc)]]
|
|
m += [[0,Integer(B)/order] + [Integer((pow(dataset[i-1][5], -1, order)*(dataset[i-1][3]+dataset[i-1][4])-pow(dataset[i][5], -1, order)*(dataset[i][3]+dataset[i][4]))%order) for i in range(1, inc)]]
|
|
inc -= 1
|
|
m += [[0,0]+[0]*i+[order]+[0]*(inc-i-1) for i in range(inc)]
|
|
|
|
Mat = matrix(m)
|
|
# W = Babai_closest_vector(Mat, Y)
|
|
# x = W[1] * (p-1) / 2
|
|
# print(x)
|
|
for line in Mat.LLL():
|
|
if(line[0]==order):
|
|
key = Zn(line[1]*p/B)
|
|
print(order-key, int(order).bit_length())
|
|
# is_valid = ecdsa.verify(temp, signature)
|
|
|
|
if __name__ == "__main__":
|
|
# case1()
|
|
case2()
|
|
|