Trăn aes

Bài viết này phân tích một thiết kế về bộ giải mã [decrypt/decipher] để chuẩn hóa mã hóa dữ liệu AES-128. Nội dung rút gọn về lý thuyết giải mã và mã hóa các bạn xem thêm ở các bài viết trước, bài 1, bài 2 và bài 3

*inv là cách viết tắt của "inverse" với nghĩa là "đảo"

1] Mô tả tổng quan thiết kế

Bộ giải mã AES-128, aes128_decipher_top, được thiết kế bao gồm 2 khối

  • Khối mã hóa dữ liệu aes128_cipher_core_inv
  • Khối tính toán tạo vòng khóa aes128_key_expansion

Bộ mã hóa bao gồm các tín hiệu giao tiếp sau

  • clk_sys. clock clock
  • rst_n. đặt lại tích cực mức thấp
  • round_key_10[127. 0]. key round thứ 10. Giá trị này được sinh ra từ khóa mã thông qua quá trình KeyExpansion
  • cipher_text[127. 0]. dữ liệu cần giải mã, mã hóa
  • giải mã_vi. tín hiệu cho phép bộ giải mã hoạt động, tích cực 1 chu kỳ xung clock clk_sys để yêu cầu bộ giải mã hoạt động
  • decipher_ready. báo trạng thái bộ giải mã sẵn sàng hoạt động. Tín hiệu này chỉ bằng 0 khi bộ giải mã đang trong quá trình giải mã dữ liệu
  • plain_text[127. 0]. data after being decoding, theknown

Tín hiệu giao tiếp giữa khối aes128_cipher_core_inv và aes128_key_expansion_inv

  • rkey_vi. tín hiệu cho phép khối aes128_key_expansion_inv hoạt động
  • round_num[3. 0]. vòng tín hiệu báo vòng lặp giải mã hiện tại, round_num[3. 0]=0 is bước khởi động đầu tiên
  • round_key_inv_out[127. 0] là giá trị khóa vòng từ khối aes128_key_expansion_inv gửi cho khối aes128_cipher_core_inv. At the last last time, round_num[3. 0]=10, this value is the root key

Bên cạnh đó, thiết kế sử dụng một số chức năng được đặt trong các tệp sau

  • aes128_mul_inv. sinh viên. tệp chưa có chức năng nhân
  • aes128_sbox. sinh viên. tệp chứa chức năng tra bảng S-BOX
  • aes128_sbox_inv. sinh viên. tệp chứa chức năng tra bảng S-BOX đảo
  • aes128_rcon_inv. sinh viên. tệp chứa chức năng chọn giá trị Rcon cho quá trình quay vòng tính toán

Hình 1. Sơ đồ khối giải mã AES-128

2] Khối mạch logic aes128_key_expansion_inv


Khối này thực hiện chức năng khóa xoay vòng InvKeyExpansion đã được trình bày ở bài 2

Khối này sử dụng một thanh ghi round_key_reg[127. 0] để lưu lại giá trị khóa vòng sau mỗi lần tính toán

Các bạn hãy xem từ MUX, bên dưới cùng của hình, lên sẽ thấy dung được hoạt động của mỗi lần lặp tính năng khóa vòng [phím tròn]

round_num[3. 0] sẽ cho biết vòng thứ mấy đang được tính, nếu nó bằng 0 thì khóa vòng số 10 round_key_10[127. 0] sẽ kết nối đến key_in[127. 0] và được đưa vào mạch logic để tính ngược vòng quay số 9

Từ lần tính tiếp theo trở đi, round_num[3. 0] bằng 1 đến 10, giá trị được sử dụng để tính toán sẽ lấy từ thanh ghi round_key_reg[127. 0] để tính các vòng khóa số 8, số 7,. and key ban đầu

At here 32 bit last [31. 0] was XOR with 32 bit next [63. 32] before khi đi qua các bước tính toán sau

Thuật toán được đặt tên là "Rijndael" khi tham gia cuộc thi thiết kế AES. Rijndael được phát âm là "Rhine dahl" theo phiên bản quốc tế. Thuật toán được thiết kế bởi hai nhà mật mã học người Bỉ. Joan Daemen và Vincent Rijmen.  

Giống như tiêu chuẩn tiền nhiệm DES, AES được kỳ vọng áp dụng trên phạm vi thế giới và đã được nghiên cứu rất kỹ lưỡng. AES được chấp nhận làm tiêu chuẩn liên bang bởi Viện tiêu chuẩn và công nghệ quốc gia Hòa Kỳ [NIST] sau một quá trình tiêu chuẩn hóa kéo dài 5 năm. AES [viết tắt của từ tiếng Anh. Advanced Encryption Standard, hay Tiêu chuẩn mã hóa tiên tiến] là một thuật toán mã hóa khối được phủ chính Hoa kỳ áp dụng làm tiêu chuẩn mã hóa.  

Hãy sử dụng Python để mã hóa tệp bằng AES. ✨✨ Chúng tôi sẽ viết một số Mã Python để mã hóa tệp trên đĩa bằng AES, sau đó giải mã tệp để truy xuất tệp văn bản gốc 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] ban đầu được gọi là Rijndael 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 U. S. Viện Tiêu chuẩn và Công nghệ Quốc gia [NIST] năm 2001

AES có kích thước khối cố định là 128 bit [16 byte] và có ba độ dài khóa khác nhau. Dài 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ệ điều hành 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 chuẩn bị một tệp có tên infile. docx. Đây sẽ là tài liệu Word trong trường hợp này [hoặc bất kỳ tệp ưu tiên nào] có văn bản trong đó mà chúng tôi có thể xác minh trước và sau quá trình mã hóa/giải mã. Đảm bảo rằng nó tồn tại trong cùng thư mục với tập lệnh 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 do người dùng xác định, muối thêm bảo vệ bổ sung cho mật khẩu, key_length là độ dài của khóa mã hóa tính bằng byte và iv_length là độ dài tính bằng byte của vectơ khởi tạo của chúng tôi. Vector khởi tạo là một chuỗi các byte không thể đoán trước đối với tin tặc tiềm năng. Nó dài bằng kích thước khối [trong trường hợp này là 16 byte] và nó đảm bảo rằng các bản mã 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 với cùng một khóa. Chế độ mã hóa 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 hợp lý mạnh. Derive_key_and_iv[] sẽ trả về 2 giá trị. khóa 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.
  4. Chúng tôi xác định hàm thứ hai encrypt[] . 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 văn bản gốc mà chúng tôi sẽ mã hóa [Tài liệu Word trong trường hợp này], out_file sẽ là tệp được mã hóa mà bất kỳ ai không có mật khẩu đều không thể đọc được, mật khẩu do người dùng xác định và key_length .
    • 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 Ciphertext Block Chaining. Phương thức hoạt động này được phát minh vào những năm 1970 và hoạt động bằng cách “XORing” từng khối bản rõ với khối bản mã trước đó trước khi được mã hóa. Mật mã giá trị là một đối tượng mật mã CBC
    • Hãy nhớ lại rằng XOR có nghĩa là “độc quyền hoặc”, đó là một phép toán logic đúng khi và chỉ khi các đối số của nó khác i. e. một là đúng và một là sai
    • in_file được đọc từ đĩa và được mã hóa theo khối hoặ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 đủ độ dài. Tệp mã hóa out_file được ghi vào đĩa theo 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 bởi vì nó được mã hóa
  5. Chúng tôi xác định hàm thứ ba decrypt[] . Chức năng này sẽ chấp nhận 4 tham số. in_file, out_file, mật khẩu và key_length. Chức năng này thực hiện 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 là tệp được giải mã mà chúng ta có thể đọc được.
  6. Mật khẩu chúng tôi xác định ở đây là CRITICAL. Trên thực tế, mật khẩu của bạn phải 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 câu lệnh with để mở tệp văn bản gốc để mã hóa và chúng tôi cũng làm như vậy để giải mã nó

Khi đoạn 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 tệp tin. docx

  1. tệp ngoài. docx – Tệp này là tệp được mã hóa . Điều này sẽ không thể đọc được.
  2. outfile_decrypted. docx – Tệp này là tệp đã được giải mã . Tệp này phải giống với tệp gốc. docx và tất cả nội dung phải giống nhau và có thể đọc được.

Vậy là xong. Chúng tôi đã mã hóa và giải mã thành công một tệp bằng Python. Tuy nhiên, xin lưu ý rằng đây chỉ là một ví dụ . Trên thực tế, bạn hoàn toàn nên sử dụng các phương tiện mạnh mẽ và mạnh mẽ hơn để mã hóa dữ liệu của mình, cùng với mật khẩu mạnh hơn. Bạn tự chịu rủi ro khi sử dụng mã này. Đây chỉ là mục đích trình diễn.

Cảm ơn vì đã đọc. Xem Hướng dẫn mã hóa TwoFish của chúng tôi 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 lĩnh vực CNTT. Hiện đang chuyển đổi từ Quản trị hệ thống sang DevOps. Ham đọc sách, trí thức và mơ mộng. Vào tự do, đi an toàn, và để lại chút gì đó hạnh phúc mà bạn mang theo

Chủ Đề