-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSignatures.py
More file actions
142 lines (122 loc) · 3.73 KB
/
Copy pathSignatures.py
File metadata and controls
142 lines (122 loc) · 3.73 KB
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
#Signatures.py
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.exceptions import InvalidSignature
from cryptography.hazmat.primitives import serialization
def generate_keys():
private = rsa.generate_private_key(
public_exponent=65537,
key_size=2048,
backend=default_backend()
)
public = private.public_key()
pu_ser = public.public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo
)
return private, pu_ser
def sign(message, private):
message = bytes(str(message), 'utf-8')
sig = private.sign(
message,
padding.PSS(
mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH
),
hashes.SHA256()
)
return sig
def verify(message, sig, pu_ser):
public = serialization.load_pem_public_key(
pu_ser,
backend=default_backend()
)
message = bytes(str(message), 'utf-8')
try:
public.verify(
sig,
message,
padding.PSS(
mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH
),
hashes.SHA256()
)
return True
except InvalidSignature:
return False
except:
print("Error executing public_key.verify")
return False
def savePrivate(pr_key, filename):
pem = pr_key.private_bytes(
encoding = serialization.Encoding.PEM,
format= serialization.PrivateFormat.TraditionalOpenSSL,
encryption_algorithm= serialization.NoEncryption()
)
fp = open(filename, "wb")
fp.write(pem)
fp.close()
return
def loadPrivate(filename):
fin = open(filename, "rb")
pr_key = serialization.load_pem_private_key(
fin.read(),
password=None,
backend=default_backend()
)
fin.close()
return pr_key
def savePublic(pu_key, filename):
fp = open(filename, "wb")
fp.write(pu_key)
fp.close()
return True
def loadPublic(filename):
fin = open(filename, "rb")
pu_key = fin.read()
fin.close()
return pu_key
if __name__ == '__main__':
pr,pu = generate_keys()
print(pr)
print(pu)
message = "This is a secret message"
sig = sign(message, pr)
print(sig)
correct = verify(message, sig, pu)
print(correct)
if correct:
print("Success! Good sig")
else:
print ("ERROR! Signature is bad")
pr2, pu2 = generate_keys()
sig2 = sign(message, pr2)
correct= verify(message, sig2, pu)
if correct:
print("ERROR! Bad signature checks out!")
else:
print("Success! Bad sig detected")
badmess = message + "Q"
correct= verify(badmess, sig, pu)
if correct:
print("ERROR! Tampered message checks out!")
else:
print("Success! Tampering detected")
savePrivate(pr2, "private.key")
pr_load = loadPrivate("private.key")
sig3 = sign(message, pr_load)
correct = verify(message, sig3, pu2)
if correct:
print("Success! Good Loaded Private Key")
else:
print("Error! Loaded private key is bad")
savePublic(pu2, "public.key")
pu_load = loadPublic("public.key")
correct = verify(message, sig3, pu_load)
if correct:
print("Success! Good Loaded public Key")
else:
print("Error! Loaded public key is bad")