-
Notifications
You must be signed in to change notification settings - Fork 0
/
encrypt.py
129 lines (109 loc) · 3.57 KB
/
encrypt.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
import random
import base64
from Crypto.Cipher import AES
from Crypto import Random
import os, random, struct,sys
from Crypto.Cipher import AES
def encrypt_file(key, in_filename, out_filename=None, chunksize=64*1024):
""" Encrypts a file using AES (CBC mode) with the
given key.
key:
The encryption key - a string that must be
either 16, 24 or 32 bytes long. Longer keys
are more secure.
in_filename:
Name of the input file
out_filename:
If None, '<in_filename>.enc' will be used.
chunksize:
Sets the size of the chunk which the function
uses to read and encrypt the file. Larger chunk
sizes can be faster for some files and machines.
chunksize must be divisible by 16.
"""
if not out_filename:
#out_filename = in_filename + '.enc'
out_filename = 'cipherFile.enc'
iv = ''.join(chr(random.randint(0, 0xFF)) for i in range(16))
encryptor = AES.new(key, AES.MODE_CBC, iv)
filesize = os.path.getsize(in_filename)
with open(in_filename, 'rb') as infile:
with open(out_filename, 'wb') as outfile:
outfile.write(struct.pack('<Q', filesize))
outfile.write(iv)
while True:
chunk = infile.read(chunksize)
if len(chunk) == 0:
break
elif len(chunk) % 16 != 0:
chunk += ' ' * (16 - len(chunk) % 16)
outfile.write(encryptor.encrypt(chunk))
def binaryRandom():
#generating 128 bit random number
k=""
for i in range(0,128):
k = k+str(random.randint(0,1))
#print(len(str(k)))
return k
def _chunks(string, chunk_size):
for i in range(0, len(string), chunk_size):
yield string[i:i+chunk_size]
def encryption():
try:
inputFile = sys.argv[1]
except IndexError:
print("Please pass the filename to be encrypted as first program argument")
sys.exit()
k = binaryRandom()
print("Encrypting...")
#converting 128 bits to 16bytes hexadecimal representation
stringHex = ''.join('{:02x}'.format(int(b,2)) for b in _chunks(k,8))
#print(stringHex)
strinHextoInt = '0x'+stringHex
#print(int(strinHextoInt,16))
k=int(strinHextoInt,16) #converting k to int
#print(hex(k))
#get p, g, h from file
file1 = open("key.txt",'r')
p = long(file1.readline())
g = long(file1.readline())
h = long(file1.readline())
r=random.randint(0, p)
cipher2 = squareAndMultiply(g,r,p)
#k = long(k)
cipher3 = (k*squareAndMultiply(h,r,p))%p
# filec2 = open("cipher2.txt","w")
# filec3 = open("cipher3.txt","w")
# filec2.write(str(cipher2))
# filec3.write(str(cipher3))
#encrypt the file
encrypt_file(stringHex,inputFile)
#we have the encrypted file, now in new file write cipher2 and cipher3 along with all the contents of .enc file
cipherFile = open("cipherFile.enc","rb")
newCipherFile = open("cipherFile","wb")
newCipherFile.write(str(cipher2))
newCipherFile.write("\n")
newCipherFile.write(str(cipher3))
newCipherFile.write("\n")
newCipherFile.write(str(inputFile))
newCipherFile.write("\n")
for line in cipherFile:
newCipherFile.write(line)
cipherFile.close()
newCipherFile.close()
file1.close()
os.remove("cipherFile.enc")
print_message ="Encrypted file stored under name : cipherFile"
print(print_message)
def squareAndMultiply(x,c,n):
z=1
#getting value of l by converting c into binary representation and getting its length
c="{0:b}".format(c)[::-1] #reversing the binary string
l=len(c)
for i in range(l-1,-1,-1):
z=pow(z,2)
z=z%n
if(c[i] == '1'):
z=(z*x)%n
return z
encryption()