-
Notifications
You must be signed in to change notification settings - Fork 0
/
TD2.py
164 lines (117 loc) · 4.54 KB
/
TD2.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
from sha256 import *
import secrets as s
import hashlib
import sys
#Functions shamefully stolen to professor, converts byte into binary value
def padd_binary(bin_str: str, size: int) -> str:
"""
Pads a binary string with zeros to the left
:param bin_str: binary string to pad
:param size: size of the padded string
:return: padded binary string
"""
for _ in range(size - len(bin_str)):
bin_str = '0' + bin_str
return bin_str
def byte_to_binary(b: bytes, size: int) -> str:
"""
Converts a byte to a binary string
:param byte: byte to convert
:param size: size of the binary string
:return: binary string
"""
order = -1 if sys.byteorder == 'little' else 1
bin_n = bin(int.from_bytes(b, byteorder='big'))[2:]
return padd_binary(bin_n, size)
#Accepts binary entropy entry as parameter, enering no parameters generates a random crypo safe entropy
def Generate_Seed(entropy=None):
#Generate safe random integer as entropy
if entropy==None:
entropy= s.randbits(128)
print("entropy : ",entropy)
entropy=bin(entropy)[2:].zfill(128)
else:
entropy=bin(entropy)[2:].zfill(128)
#print(len(entropy))
#print("binary entropy : ",entropy)
#Checksum moment :
#Generate Hash of entropy
hash=generate_hash(str(entropy)) #Hashs the entropy
#print(hash)
checksum=byte_to_binary(hash, 256)[:4] #Converts it to bytes and keeps the 4 first
#print("checksum : ",checksum)
final_entropy= str(entropy) + str(checksum) #adds it to entropy to have a 132 bits final entropy
#print(final_entropy)
#creates an array and keeps every 11 bits from the final hash
segments=[]
for i in range(12):
segments.append(final_entropy[11*i:11*(i+1)])
#print(segments)
#i found online a text file with BIP39 words sorted by int value (0 is "abandon" etc...)
file=open('BIP39words.txt','r')
bipw=file.readlines()
#print(bipw)
#Converts the binary segments into int then the int into to corresponding word
bwl=[]
for k in segments:
k=bipw[int(str(k),2)]
bwl.append(k)
#print(bwl)
print("\n")
for l in bwl:
print(l)
def Import_Seed(seed:str):
#Checksum not implemented yet so this function isn't perfectly working :'-(
#Some bugs are still remaining
bin_res=[]
file=open('BIP39words.txt','r')
bipw=file.readlines()
bipw[-1]+="\n"
#print(bipw)
mnemo=seed.split()
#print(mnemo)
#For each mnemo word, checks its presence in the Bip39 Mnemo words and append its decimal value in a list
#If a word is incorrect, returns an error.
for i in mnemo:
resp=True
for j in range(len(bipw)):
if bipw[j]==i+"\n":
bin_res.append(j)
resp=False
if resp:
print("Word",i,"is incorrect.")
bin_res=None
break
#print(bin_res)
#creates a list from the mnemo words binary equivalent
bin_fin=[]
for k in range(len(bin_res)):
bin_fin.append(bin(bin_res[k])[2:].zfill(11))
#print(bin_fin)
"creates a string to return the complete entropy"
entropy=""
for f in bin_fin:
entropy+=f
entropy=entropy[:-5]
print("Binary entropy is : ",entropy)
print("Integer entropy is : ",int(entropy,2))
def Extract_MasterKey(seed:str):
print(hashlib.sha512(seed))
#Generate_Seed(107539121524694991868515036671812879545)
#Import_Seed("peace innocent alcohol clip invest squeeze flock grass buzz across girl tortoise")
#Generate_Seed(130907837269173211963531510614441289891)
#Extract_MasterKey("peace innocent alcohol clip invest squeeze flock grass buzz across girl tortoise")
print("Welcome to Gabriels Saliba's TD2 of blockchain programming")
print("To generate a Seed, enter 1 \n To find entropy from a defined Seed, enter 2")
inp = input()
if inp == "1":
print("To generate the words from a defined integer seed, press 1\n to Generate a crypto-safe integer seed press 2")
inp2=input()
if inp2=="1":
print("enter your integer seed")
Generate_Seed(int(input()))
else:
Generate_Seed()
else:
print("enter your seed words separated by a space, all in lower case size")
Import_Seed(input())