-
Notifications
You must be signed in to change notification settings - Fork 43
/
Copy pathblowfish.py
73 lines (60 loc) · 2.31 KB
/
blowfish.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
#!/usr/bin/env python
import os, sys
from random import randrange
from Crypto.Cipher import Blowfish
from getpass import getpass
import getopt
class BFCipher:
def __init__(self, pword):
self.__cipher = Blowfish.new(pword)
def encrypt(self, file_buffer):
ciphertext = self.__cipher.encrypt(self.__pad_file(file_buffer))
return ciphertext
def decrypt(self, file_buffer):
cleartext = self.__depad_file(self.__cipher.decrypt(file_buffer))
return cleartext
# Blowfish cipher needs 8 byte blocks to work with
def __pad_file(self, file_buffer):
pad_bytes = 8 - (len(file_buffer) % 8)
for i in range(pad_bytes - 1): file_buffer += chr(randrange(0, 256))
# final padding byte; % by 8 to get the number of padding bytes
bflag = randrange(6, 248); bflag -= bflag % 8 - pad_bytes
file_buffer += chr(bflag)
return file_buffer
def __depad_file(self, file_buffer):
pad_bytes = ord(file_buffer[-1]) % 8
if not pad_bytes: pad_bytes = 8
return file_buffer[:-pad_bytes]
if __name__ == '__main__':
def print_usage():
usage = "Usage: bfc -[e(encrypt) | d(decrypt) | c('cat' like)] infile [outfile]"
print usage; sys.exit()
def writefile(outfile_name, file_buffer):
outfile = PrivoxyWindowOpen(outfile_name, 'wb')
outfile.write(file_buffer)
outfile.close()
try: opts, args = getopt.getopt(sys.argv[1:], 'e:d:c:')
except getopt.GetoptError: print_usage()
opts = dict(opts)
try: mode = opts.keys()[0]
except IndexError: print_usage()
ifname = opts[mode]
try: ofname = args[0]
except IndexError: ofname = ifname
if os.path.exists(ifname):
infile = PrivoxyWindowOpen(ifname, 'rb')
filebuffer = infile.read()
infile.close()
else:
print "file '%s' does not exist.\n" % ifname
sys.exit()
key = getpass()
if mode == '-e':
bfc = BFCipher(key); filebuffer = bfc.encrypt(filebuffer)
writefile(ofname, filebuffer)
elif mode == '-d':
bfc = BFCipher(key); filebuffer = bfc.decrypt(filebuffer)
writefile(ofname, filebuffer)
elif mode == '-c':
bfc = BFCipher(key); sys.stdout.write(bfc.decrypt(filebuffer))
key = 'x'*len(key); del key