Last active
February 9, 2019 17:50
-
-
Save hikenshi/cab8a9d7e2158b55dc6d303c1f521e90 to your computer and use it in GitHub Desktop.
Script mã hoá và giải mã file bằng AES256
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
Ma Hoa AES256. Dung cho python 3.5+ | |
Can cai dat pycryptodome. https://pypi.org/project/pycryptodome/ | |
Script nay co su dung code tu: https://eli.thegreenplace.net/2010/06/25/aes-encryption-of-files-in-python-with-pycrypto/ | |
""" | |
import os, random, struct | |
import hashlib | |
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' | |
iv = ''.join(chr(random.randint(0, 0xFF)) for i in range(16)) | |
iv = hashlib.sha256(iv.encode('utf-8')).digest()[: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 += b' ' * (16 - len(chunk) % 16) | |
outfile.write(encryptor.encrypt(chunk)) | |
def decrypt_file(key, in_filename, out_filename=None, chunksize=24*1024): | |
""" Decrypts a file using AES (CBC mode) with the | |
given key. Parameters are similar to encrypt_file, | |
with one difference: out_filename, if not supplied | |
will be in_filename without its last extension | |
(i.e. if in_filename is 'aaa.zip.enc' then | |
out_filename will be 'aaa.zip') | |
""" | |
if not out_filename: | |
out_filename = os.path.splitext(in_filename)[0] | |
with open(in_filename, 'rb') as infile: | |
origsize = struct.unpack('<Q', infile.read(struct.calcsize('Q')))[0] | |
iv = infile.read(16) | |
decryptor = AES.new(key, AES.MODE_CBC, iv) | |
with open(out_filename, 'wb') as outfile: | |
while True: | |
chunk = infile.read(chunksize) | |
if len(chunk) == 0: | |
break | |
outfile.write(decryptor.decrypt(chunk)) | |
outfile.truncate(origsize) | |
def main(): | |
huongdan = """Bat buoc su dung python 3.5 tro len. \n\n | |
File sau khi duoc ma hoa se co dang <tenfile.enc> .\n Vi du: file <abcd.rar> sau khi duoc ma hoa se tao ra file <abcd.rar.enc>\n\n | |
File sau khi duoc giai ma se co ten file bi loai bo phan duoi.\nVi du: file <abcd.rar.enc> sau khi duoc giai ma se tao ra file <abcd.rar>\n\n""" | |
z = input("Chon 1 hoac 2 hoac 3. [1] encrypt (Ma Hoa), [2] decrypt (Giai Ma), [3] Huong dan: ") | |
if int(z) == 3: | |
print(huongdan) | |
return | |
if int(z) == 2: | |
x = input("Nhap password: ") | |
y = input("Nhap duong dan den file can ma hoa / giai ma: ") | |
in_filename = y.replace("\\", "/") | |
key = hashlib.sha256(x.encode('utf-8')).digest() | |
decrypt_file(key, in_filename, out_filename=None, chunksize=24*1024) | |
if int(z) == 1: | |
x = input("Nhap password: ") | |
x1 = input("Nhap lai password: ") | |
if x != x1: | |
print("password khong trung voi password o tren!!!! EXIT!!!") | |
return | |
y = input("Nhap duong dan den file can ma hoa / giai ma: ") | |
in_filename = y.replace("\\", "/") | |
key = hashlib.sha256(x.encode('utf-8')).digest() | |
encrypt_file(key, in_filename, out_filename=None, chunksize=64*1024) | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment