Hướng dẫn encrypt file aes python - mã hóa tệp aes python

Hướng dẫn encrypt file aes python - mã hóa tệp aes python

Tệp mã hóa Python

Hãy để sử dụng Python để mã hóa một tệp với AES! Chúng tôi sẽ viết một số mã python để mã hóa một tệp trên đĩa bằng AES và sau đó giải mã tệp để truy xuất tệp plaintext ban đầu của chúng tôi. Chúng tôi sẽ sử dụng Python 3.8.10 cho ví dụ này.

AES (Tiêu chuẩn mã hóa nâng cao) & nbsp; ban đầu được gọi là & nbsp; rijndael & nbsp; và là một thuật toán khối đối xứng để mã hóa hoặc giải mã dữ liệu. Tiêu chuẩn được thành lập bởi Viện Tiêu chuẩn và Công nghệ Quốc gia Hoa Kỳ (NIST) năm 2001.was originally called Rijndael and is a symmetric block algorithm for encrypting or decrypting data. The standard was established by the U.S. National Institute of Standards and Technology (NIST) in 2001.

AES có kích thước khối cố định là 128 bit (16 byte) và có ba độ dài chính khác nhau: 128, 192 hoặc 256 bit.

Chúng tôi sẽ sử dụng 3 thư viện trong ví dụ này. Hai trong số chúng có thể yêu cầu cài đặt mà chúng ta có thể làm như sau:

pip install hashlib
pip install pycryptodomex

HĐH mô -đun khác sẽ được tích hợp vào Python 3. Bây giờ, hãy để viết mã của chúng tôi:

from hashlib import md5
from Cryptodome.Cipher import AES
from os import urandom

def derive_key_and_iv(password, salt, key_length, iv_length): #derive key and IV from password and salt.
    d = d_i = b''
    while len(d) < key_length + iv_length:
        d_i = md5(d_i + str.encode(password) + salt).digest() #obtain the md5 hash value
        d += d_i
    return d[:key_length], d[key_length:key_length+iv_length]

def encrypt(in_file, out_file, password, key_length=32):
    bs = AES.block_size #16 bytes
    salt = urandom(bs) #return a string of random bytes
    key, iv = derive_key_and_iv(password, salt, key_length, bs)
    cipher = AES.new(key, AES.MODE_CBC, iv)
    out_file.write(salt)
    finished = False

    while not finished:
        chunk = in_file.read(1024 * bs) 
        if len(chunk) == 0 or len(chunk) % bs != 0:#final block/chunk is padded before encryption
            padding_length = (bs - len(chunk) % bs) or bs
            chunk += str.encode(padding_length * chr(padding_length))
            finished = True
        out_file.write(cipher.encrypt(chunk))

def decrypt(in_file, out_file, password, key_length=32):
    bs = AES.block_size
    salt = in_file.read(bs)
    key, iv = derive_key_and_iv(password, salt, key_length, bs)
    cipher = AES.new(key, AES.MODE_CBC, iv)
    next_chunk = ''
    finished = False
    while not finished:
        chunk, next_chunk = next_chunk, cipher.decrypt(in_file.read(1024 * bs))
        if len(next_chunk) == 0:
            padding_length = chunk[-1]
            chunk = chunk[:-padding_length]
            finished = True 
        out_file.write(bytes(x for x in chunk)) 


password = '12345' #shouldn't be something this simple

with open('infile.docx', 'rb') as in_file, open('outfile.docx', 'wb') as out_file:
    encrypt(in_file, out_file, password)

with open('outfile.docx', 'rb') as in_file, open('outfile_decrypted.docx', 'wb') as out_file:
    decrypt(in_file, out_file, password)

Hãy để giải thích những gì đang xảy ra ở đây:

  1. Chúng tôi nhập thư viện của chúng tôi.
  2. Bạn sẽ cần phải chuẩn bị một tập tin gọi là infile.docx. Đây sẽ là một tài liệu Word trong trường hợp này (hoặc bất kỳ tệp ưa thích nào) với văn bản trong đó mà chúng ta có thể xác minh trước và sau quá trình mã hóa/giải mã. Hãy chắc chắn rằng nó tồn tại trong cùng một thư mục như kịch bản Python này.
  3. Chúng tôi xác định chức năng đầu tiên của chúng tôi derive_key_and_iv (). Hàm này chấp nhận mật khẩu, muối, key_length và iv_length. Mật khẩu được xác định là người dùng, SALT thêm bảo vệ bổ sung vào mật khẩu, key_lengm là độ dài của khóa mã hóa tính bằng byte và IV_LENGTH là độ dài trong byte của vectơ khởi tạo của chúng tôi. Vectơ khởi tạo là một chuỗi các byte không thể đoán trước được đối với các tin tặc tiềm năng. Nó miễn là kích thước khối (16 byte trong trường hợp này) và nó đảm bảo rằng các bản mã hóa riêng biệt được tạo ra ngay cả khi cùng một bản rõ được mã hóa nhiều lần trong các dịp khác nhau có cùng một khóa. Chế độ mã hóa mà chúng tôi đang sử dụng (mode_cbc) để mã hóa tệp của chúng tôi yêu cầu IV. Lưu ý rằng chúng tôi đã sử dụng thuật toán MD5 để tạo khóa khá mạnh. DRIVE_KEY_AND_IV () sẽ trả về 2 giá trị: phím và IV (vectơ khởi tạo). Cả hai sẽ được sử dụng để tạo mật mã mà chúng tôi sẽ sử dụng để mã hóa tệp.requires an iv. Note that we used the MD5 algorithm to generate a reasonably strong key. The derive_key_and_iv() will return 2 values: the key and the iv (initialization vector). Both will be used to create the cipher that we will use to encrypt the file.
  4. Chúng tôi xác định mã hóa hàm thứ hai của chúng tôi (). Hàm này chấp nhận 4 tham số: in_file, out_file, mật khẩu và key_length. In_file là tệp rõ ràng mà chúng tôi sẽ mã hóa (một tài liệu từ trong trường hợp này), out_file sẽ là một tệp được mã hóa không thể đọc được bởi bất kỳ ai không có mật khẩu, mật khẩu được xác định có giá trị mặc định là 32 byte.encrypt(). This function accepts 4 parameters:the in_file, out_file, password and key_length. The in_file is the plaintext file that we will encrypt (a Word Document in this case), the out_file will be a encrypted file that won’t be readable by anyone who doesn’t have the password, the password is user defined and the key_length has a default value of 32 bytes.
    • Trong chức năng này, chúng tôi gọi hàm derive_key_and_iv () sẽ trả về khóa và IV mà chúng tôi sẽ sử dụng cùng với chế độ để tạo mật mã.
    • Chế độ chúng tôi đang sử dụng ở đây được gọi là Mode_CBC hoặc chuỗi khối mã hóa. Chế độ hoạt động này được phát minh vào những năm 1970 và hoạt động bằng cách của Xoring, từng khối của bản rõ với khối mã hóa trước đó trước khi được mã hóa. Mật mã giá trị là một đối tượng mật mã CBCMODE_CBC or Ciphertext Block Chaining. This mode of operation was invented in the 1970s and works by “XORing” each block of plaintext with the previous ciphertext block before being encrypted. The value cipher is a CBC cipher object
    • Hãy nhớ lại rằng XOR có nghĩa là độc quyền của người Viking hoặc là một hoạt động hợp lý là đúng khi và chỉ khi các đối số của nó khác nhau, tức là một là đúng và cái kia là sai.
    • in_file được đọc từ đĩa và được mã hóa trong các khối hoặc các khối là bội số của kích thước khối mật mã. Khối cuối cùng được đệm trước khi mã hóa nếu nó không có chiều dài đầy đủ. Tệp được mã hóa out_file được viết vào đĩa trong các khối được mã hóa bằng mật mã của chúng tôi.
    • Out_file sẽ không thể đọc được của con người vì nó được mã hóa.
  5. Chúng tôi xác định chức năng thứ ba của chúng tôi giải mã (). Hàm này sẽ chấp nhận 4 tham số: in_file, out_file, mật khẩu và key_length. Hàm này làm điều tương tự như mã hóa () ngoại trừ ngược lại. In_file sẽ là tệp được mã hóa trước đó và out_file với một tệp được giải mã mà chúng ta có thể đọc.decrypt(). This function will accept 4 parameters: in_file, out_file, password and key_length. This function does the same thing as encrypt() except in reverse. The in_file will be the previously encrypted file and out_file with be a decrypted file that we can read.
  6. Mật khẩu chúng tôi xác định ở đây là rất quan trọng. Trong thực tế, mật khẩu của bạn nên là một cái gì đó phức tạp hơn và không dễ đoán. Chúng tôi đã sử dụng một cái đơn giản cho ví dụ này.
  7. Chúng tôi sử dụng một câu lệnh để mở tệp Plaintext để mã hóa và chúng tôi làm tương tự để giải mã nó.

Khi mã trên thực thi, chúng tôi sẽ nhận được 2 tệp mới trên đĩa trong cùng thư mục với tập lệnh của chúng tôi ngoài infile.docx:

  1. outfile.docx - tệp này là mã hóa. Điều này won có thể đọc được.encryptedfile. This won’t be readable.
  2. outfile_decrypted.docx - Tệp này là DecryptedFile. Tệp này phải giống hệt với tệp infile.docx gốc và tất cả các nội dung phải giống nhau và có thể đọc được.decryptedfile. This file should be identical to the original infile.docx file and all the contents should be the same and readable.

À chính nó đấy! Chúng tôi đã mã hóa thành công và giải mã một tập tin trong Python. Lời cảnh báo mặc dù, đây chỉ là một ví dụ. Trong thực tế, bạn hoàn toàn nên sử dụng phương tiện mạnh mẽ và mạnh mẽ hơn để mã hóa dữ liệu của bạn, cùng với mật khẩu mạnh hơn. Sử dụng mã này có nguy cơ của riêng bạn! Điều này chỉ dành cho mục đích trình diễn.example. In practice you should absolutely use stronger and more robust means to encrypt your data, along with a stronger password. Use this code at your own risk! This was for demonstration purposes only.

Cảm ơn vì đã đọc!Kiểm tra hướng dẫn mã hóa hai của chúng tôi ở đây.👌👌👌

Tôi thích chia sẻ, giáo dục và giúp đỡ các nhà phát triển.Tôi có hơn 14 năm kinh nghiệm trong đó.Hiện đang chuyển từ quản trị hệ thống sang DevOps.Độc giả khao khát, trí tuệ và người mơ mộng.Nhập tự do, đi an toàn và để lại một cái gì đó hạnh phúc mà bạn mang lại.