Initial commit
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
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()
|
||||
|
||||
Reference in New Issue
Block a user