-
Notifications
You must be signed in to change notification settings - Fork 0
/
oldProgram.py
144 lines (127 loc) · 4.92 KB
/
oldProgram.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
#!/usr/bin/python
import sys
from tinyec import registry
from Crypto.Cipher import AES
import hashlib, secrets
from os.path import exists as file_exists
import pickle
class PasswordManager:
def __init__(self, password, pathFile = "passwords.txt"):
self.pathFile = pathFile
self.password = password.encode()
self.curve = registry.get_curve('brainpoolP256r1')
self.privKey = self.getPrivateKey()
self.pubKey = self.privKey * self.curve.g
def encrypt_AES_GCM(self, msg, secretKey):
aesCipher = AES.new(secretKey, AES.MODE_O)
ciphertext, authTag = aesCipher.encrypt_and_digest(msg)
return (ciphertext, aesCipher.nonce, authTag)
def decrypt_AES_GCM(self, ciphertext, nonce, authTag, secretKey):
aesCipher = AES.new(secretKey, AES.MODE_GCM, nonce)
plaintext = aesCipher.decrypt_and_verify(ciphertext, authTag)
return plaintext
def ecc_point_to_256_bit_key(self, point):
sha = hashlib.sha256(int.to_bytes(point.x, 32, 'big'))
sha.update(int.to_bytes(point.y, 32, 'big'))
return sha.digest()
def encrypt_ECC(self):
ciphertextPrivKey = secrets.randbelow(self.curve.field.n)
sharedECCKey = ciphertextPrivKey * self.pubKey
secretKey = self.ecc_point_to_256_bit_key(sharedECCKey)
ciphertext, nonce, authTag = self.encrypt_AES_GCM(self.password, secretKey)
ciphertextPubKey = ciphertextPrivKey * self.curve.g
return (ciphertext, nonce, authTag, ciphertextPubKey)
def decrypt_ECC(self, encryptedMsg):
(ciphertext, nonce, authTag, ciphertextPubKey) = encryptedMsg
sharedECCKey = self.privKey * ciphertextPubKey
secretKey = self.ecc_point_to_256_bit_key(sharedECCKey)
plaintext = self.decrypt_AES_GCM(ciphertext, nonce, authTag, secretKey)
return plaintext
def getPrivateKey(self):
try:
f = open("privateKey.ecc", "r")
try:
privateKey = int(f.read())
except ValueError:
exit("Can't read private key")
except IOError:
exit("Private key file does not exist!")
return privateKey
def getPlaintext(self, fileName):
try:
f = open(fileName, "r")
try:
plainText = f.read()
except ValueError:
exit("Can't read password")
except IOError:
exit("File does not exist!")
array = plainText.split("\n")
for i in range(len(array)):
array[i] = array[i].split(":")
return array
def encryptPassword(self, pathFile):
plainText = self.getPlaintext(pathFile)
filename = pathFile
if file_exists(filename):
open(filename, 'w').close()
createPass = PasswordManager(str(plainText))
encryptedMsg = createPass.encrypt_ECC()
file = open(filename, 'ab')
pickle.dump(encryptedMsg, file)
file.close()
def decryptPasswords(self, pathFile):
student = []
file = open(pathFile, 'rb')
student.append(pickle.load(file))
file.close()
try:
decryptedMsg = self.decrypt_ECC(student[0])
except ValueError:
exit("Impossible to decrypt, wrong private key ...")
str = (decryptedMsg.decode('utf-8'))
print(str)
def main(cmd, pathFile):
encrypt = PasswordManager("", pathFile)
if "-e" == cmd or "--encrypt" == cmd:
encrypt.encryptPassword(pathFile)
elif "-d" == cmd or "--decrypt" == cmd:
encrypt.decryptPasswords(pathFile)
else:
help()
return 84
print("Done!")
return 0
def help():
print("Usage: python3 passwordManager.py [OPTION] [FILE]")
print("-d or --decrypt to decrypt passwords")
print("-e or --encrypt to encrypt passwords")
print("-g or --generate to generate private key")
print("-h or --help to display help")
print("-v or --version to display version")
def version():
print("Version: 1.0 (Python 3.6.4)")
print("Author: OnsagerHe")
def generatePrivateKey():
print("Generating a new private key...")
privateKey = secrets.randbelow(
registry.get_curve('brainpoolP256r1').field.n)
print("Private key: " + str(privateKey))
print("Saving private key...")
file = open("privateKey.ecc", "w")
file.write(str(privateKey))
file.close()
print("Private key save in privateKey.ecc file !")
if __name__ == "__main__":
if len(sys.argv) == 2:
if (sys.argv[1] == "-h" or sys.argv[1] == "--help"):
help()
elif (sys.argv[1] == "-v" or sys.argv[1] == "--version"):
version()
elif (sys.argv[1] == "-g" or sys.argv[1] == "--generate"):
generatePrivateKey()
elif len(sys.argv) == 3:
main(str(sys.argv[1]), str(sys.argv[2]))
else:
print("Usage: python3 passwordManager.py [OPTION] [FILE]")
print("\t-h or --help to display options")