Advertisement
Guest User

Untitled

a guest
Sep 30th, 2016
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.71 KB | None | 0 0
  1. import sys
  2. import getpass
  3. import os.path
  4. from Crypto.Cipher import AES
  5. from Crypto.Hash import SHA512
  6. from subprocess import call
  7.  
  8. #pycrypto
  9.  
  10. def getFileNameFromInput (argv, maxSize):
  11. if len(argv) < 3:
  12. print "No input file specified."
  13. return None
  14.  
  15. filename = argv[2]
  16.  
  17. if not os.path.isfile(filename):
  18. print "This is not a file."
  19. return None
  20.  
  21. if os.stat(filename).st_size > maxSize*1024*1024:
  22. print "too big. max size is:", maxSize, "mb."
  23. return None
  24.  
  25. return filename
  26.  
  27. def getPasswordFromStdIn(text):
  28. password = getpass.getpass(text)
  29.  
  30. #if len(password) < 1:
  31. # print "too short"
  32. # return None
  33. return password
  34.  
  35. def isHelpMode(argv):
  36. for i in xrange(1, len(argv)):
  37. if argv[i] == "-h" or argv[i] == "--help":
  38. return True
  39. return False
  40.  
  41. def helpMode():
  42. print """Usage:
  43. Syntax:
  44. python enc OPERATION FILE
  45. ---------------------------------------------------
  46. -h
  47. prints usage
  48. -e | --encrypt
  49. encrypts FILE
  50. -d | --decrypt
  51. decrypts FILE
  52. -r | --read
  53. shows the contents of FILE and re-encrypts
  54. with the same password after exit
  55. -w | --write
  56. opens the FILE for r/w and re-encrypts
  57. withe the same password after exit
  58. ----------------------------------------------------
  59. """
  60.  
  61. def enum(**enums):
  62. return type('Enum', (), enums)
  63.  
  64. def getMode(argv, mode):
  65. if isHelpMode(argv):
  66. return mode.HELP
  67. for i in xrange(1, len(argv)):
  68. if argv[i] == "-e" or argv[i] == "--encrypt":
  69. return mode.ENCRYPT
  70. if argv[i] == "-d" or argv[i] == "--decrypt":
  71. return mode.DECRYPT
  72. if argv[i] == "-r" or argv[i] == "--read":
  73. return mode.READ
  74. if argv[i] == "-w" or argv[i] == "--write":
  75. return mode.WRITE
  76.  
  77. print "no valid mode. use -h to print usage section"
  78. return None
  79.  
  80. def pad(s, blocksize, padding):
  81. return s + (blocksize - len(s) % blocksize) * padding
  82.  
  83. def unpad(s, padding):
  84. while s[len(s)-1] == padding:
  85. s = s[:len(s)-2]
  86. return s
  87.  
  88. def createNewFileName(cryptMode, mode, filename, encryptExt, decryptExt, readWriteExt):
  89. if mode == cryptMode.ENCRYPT and filename[-3:] == decryptExt:
  90. return filename[:-3] + encryptExt
  91. if mode == cryptMode.ENCRYPT:
  92. return filename + encryptExt
  93. if mode == cryptMode.DECRYPT and filename[-3:] == encryptExt:
  94. return filename[:-3] + decryptExt
  95. if mode == cryptMode.READ or mode == cryptMode.WRITE:
  96. return filename + readWriteExt
  97. return None
  98.  
  99. def calcHash(pw):
  100. h = SHA512.new()
  101. h.update(pw)
  102. return h.hexdigest()
  103.  
  104. def encryptFile(fileContent, password, newFileName, blocksize, padding):
  105. cipher = pad(fileContent, blocksize, padding)
  106. for i in xrange(4):
  107. encrypter = AES.new(password[i*32:i*32+32], AES.MODE_CBC, password[i*32:i*32+16])
  108. cipher = encrypter.encrypt(cipher)
  109.  
  110. open(newFileName, 'w').close()
  111. newFile = open(newFileName, 'w')
  112. newFile.write(cipher)
  113. newFile.close()
  114.  
  115. def decryptFile(plaintext, password, newFileName, padding):
  116. for i in xrange(3, -1, -1):
  117. decrypter = AES.new(password[i*32:i*32+32], AES.MODE_CBC, password[i*32:i*32+16])
  118. plaintext = decrypter.decrypt(plaintext)
  119.  
  120. plaintext = unpad(plaintext, padding)
  121. open(newFileName, 'w').close()
  122. newFile = open(newFileName, 'w')
  123. newFile.write(plaintext)
  124. newFile.close()
  125.  
  126. # ======================================================================
  127.  
  128. cryptMode = enum(ENCRYPT=1, DECRYPT=2, READ=3, WRITE=4, HELP=5)
  129.  
  130. maxFileSize = 100
  131. fileExtensionEncrypt = "_en"
  132. fileExtensionDecrypt = "_de"
  133. fileExtensionTmp = "_tmp_DELETE_THIS_FILE"
  134. padding = '{'
  135. blocksize = 32
  136.  
  137. filename = getFileNameFromInput(sys.argv, maxFileSize)
  138. if filename == None:
  139. helpMode()
  140. exit(0)
  141.  
  142. fileContent = open(filename).read()
  143.  
  144. password = getPasswordFromStdIn("enter password: ")
  145. if password == None:
  146. exit(0)
  147.  
  148. password = calcHash(password)
  149.  
  150. mode = getMode(sys.argv, cryptMode)
  151. if mode == cryptMode.HELP or mode == None:
  152. helpMode()
  153. exit(0)
  154.  
  155. newFileName = createNewFileName(cryptMode, mode, filename, fileExtensionEncrypt, fileExtensionDecrypt, fileExtensionTmp)
  156. if newFileName == None:
  157. print "not an encrypted file. use a file ending in '_en'"
  158. exit(0)
  159.  
  160. if mode == cryptMode.ENCRYPT:
  161. encryptFile(fileContent, password, newFileName, blocksize, padding)
  162. exit(0)
  163.  
  164. if mode == cryptMode.DECRYPT:
  165. decryptFile(fileContent, password, newFileName, padding)
  166. exit(0)
  167.  
  168. if mode == cryptMode.READ:
  169. decryptFile(fileContent, password, newFileName, padding)
  170. call(["less", newFileName])
  171. call(["rm", "-rf", newFileName])
  172. exit(0)
  173.  
  174. if mode == cryptMode.WRITE:
  175. decryptFile(fileContent, password, newFileName, padding)
  176. call(["nano", newFileName])
  177. newEncryptFileName = createNewFileName(cryptMode, cryptMode.ENCRYPT, filename, fileExtensionEncrypt, fileExtensionDecrypt, fileExtensionTmp)
  178. newFileContent = open(newFileName).read()
  179. call(["rm", "-rf", newFileName])
  180. encryptFile(newFileContent, password, newEncryptFileName, blocksize, padding)
  181. exit(0)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement