LightkingBeknazarov

Encrypt and decrypt file in django

Feb 8th, 2021
182
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.17 KB | None | 0 0
  1.  #encrypt file
  2.  def encrypt_file(self, in_file, password, extension='enc', salt_header='', key_length=32):
  3.         if not self._validate(in_file, password):
  4.             return False
  5.         try:
  6.             infile_name = in_file.name
  7.             outfile_name = '{}.{}'.format(infile_name, extension)
  8.             with open(outfile_name, 'wb') as out_file:
  9.                 bs = AES.block_size
  10.                 salt = os.urandom(bs - len(salt_header))
  11.                 key, iv = self._derive_key_and_iv(password, salt, key_length, bs)
  12.                 cipher = AES.new(key, AES.MODE_CBC, iv)
  13.                 out_file.write(str.encode(salt_header) + salt)
  14.                 finished = False
  15.                 while not finished:
  16.                     chunk = in_file.read(1024 * bs)
  17.                     if len(chunk) == 0 or len(chunk) % bs != 0:
  18.                         padding_length = (bs - len(chunk) % bs) or bs
  19.                         chunk += str.encode(
  20.                             padding_length * chr(padding_length)
  21.                         )
  22.                         finished = True
  23.                     out_file.write(cipher.encrypt(chunk))
  24.                 out_file.close()
  25.             reopen = self._open_file(outfile_name)
  26.  
  27.             return self._return_file(reopen, outfile_name)
  28.  
  29.      
  30.      
  31.    
  32. #decrypt file
  33.  
  34.     def decrypt_file(self, file_object, password, extension='enc', salt_header='', key_length=32):
  35.         try:
  36.             if not self._validate(file_object, password):
  37.                 return False
  38.             filename = file_object.name
  39.             outfile_name = filename.replace('.{}'.format(extension), '')
  40.             print(os.path.join(file_object.name))
  41.             with open(os.path.join(filename), 'r+b') as in_file:
  42.                 bs = AES.block_size
  43.                 salt = in_file.read(bs)[len(salt_header):]
  44.                 key, iv = self._derive_key_and_iv(password, salt, key_length, bs)
  45.                 cipher = AES.new(key, AES.MODE_CBC, iv)
  46.                 next_chunk = b''
  47.                 finished = False
  48.                 with open(outfile_name, 'wb') as out_file:
  49.                     while not finished:
  50.                         chunk, next_chunk = next_chunk, cipher.decrypt(in_file.read(1024 * bs))
  51.                         if len(next_chunk) == 0:
  52.                             if check_version == 2:
  53.                                 padding_length = chunk[-1]
  54.                                 chunk = chunk.replace(padding_length, '')
  55.                             else:
  56.                                 padding_length = chunk[-1]
  57.                                 chunk = chunk[:-padding_length]
  58.                             finished = True
  59.                         out_file.write(chunk)
  60.                     out_file.close()
  61.             reopen = self._open_file(outfile_name)
  62.             return self._return_file(reopen, outfile_name)
  63.  
  64.  
  65.        
  66.  #view
  67.  
  68.  
  69. def encrypt_view(request):
  70.     context = {}
  71.  
  72.     form = FileEncForm(request.POST or None, request.FILES or None)
  73.     if form.is_valid():
  74.         instance = form.save(commit=False)
  75.         try:
  76.             myfile = request.FILES.get('file', None)
  77.             password = request.POST.get('password', None)
  78.             encrypted_file = EncryptionService().encrypt_file(myfile, password, extension='enc')
  79.             instance.file = encrypted_file
  80.             instance.save()
  81.         except ValidationError as e:
  82.             print(e)
  83.     context['form'] = form
  84.     context['files'] = FileEncrypt.objects.all()
  85.     return render(request, "file.html", context)
  86.  
  87.  
  88. def decrypt_view(request, pk):
  89.     context = {}
  90.     try:
  91.         my_object = FileEncrypt.objects.get(pk=pk)
  92.         myfile = my_object.file
  93.  
  94.         decrypt_file = EncryptionService().decrypt_file(my_object.file, '123', extension='enc')
  95.  
  96.         f = open(decrypt_file, 'rb')
  97.         file_content = f.read()
  98.         f.close()
  99.         return HttpResponse(file_content, content_type="text/plain")
  100.     except ValidationError as e:
  101.         print(e, 'rsfasd')
  102.  
  103.     return render(request, "file.html", context)
  104.  
  105.  
  106.  
  107.  
  108. #model
  109. class FileEncrypt(models.Model):
  110.     file = models.FileField(
  111.         upload_to='encrypt/'
  112.     )
  113.  
Advertisement
Add Comment
Please, Sign In to add comment