> ## Documentation Index
> Fetch the complete documentation index at: https://support.locker.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Thuật toán mã hóa AES-256-CBC

> Giới thiệu về thuật toán mã hóa AES-256-CBC và cách Locker áp dụng để bảo vệ dữ liệu người dùng

## Thuật toán mã hóa AES-256-CBC

AES-256-CBC (Cipher Block Chaining), thuật toán được sử dụng để mã hóa dữ liệu người dùng, là một mật mã tiêu chuẩn và được triển khai bởi chính phủ Hoa Kỳ và các cơ quan chính phủ khác trên toàn thế giới để bảo vệ dữ liệu tối mật. Với việc triển khai đúng cách và Khóa mã hóa đủ mạnh (từ Mật khẩu chính của người dùng), thuật toán AES-256-CBC được đánh giá là không thể bị phá vỡ.

AES-256-CBC là hệ thống mã hóa sử dụng thông số AES, khóa $K$ dài 256 bit và ở chế độ hoạt động CBC. Dữ liệu đầu vào được mở rộng và chia thành các khối có độ dài cố định $P_i$, trong đó

<img src="https://mintcdn.com/locker/ZpQHj9IjHy-TnRFC/images/vi/locker-whitepaper/security-fundamentals/aes_encrypt.png?fit=max&auto=format&n=ZpQHj9IjHy-TnRFC&q=85&s=54629064c888aeae239a701041d4079f" alt="Sơ đồ mã hóa AES-256-CBC" width="1190" height="680" data-path="images/vi/locker-whitepaper/security-fundamentals/aes_encrypt.png" />

1. Với khối $P_1$, thực hiện phép $XOR$ với $P_1$ và vector khởi tạo $VI$:

   $PP_1 = P_1 \oplus VI$

2. Mã hóa kết quả $PP_1$ từ bước 1 bằng $AES$ với khóa $K$:

   $C_1 = AES_E(PP_1, K)$

3. Từ khối $P_2$ trở đi, $P_i$ sẽ được $XOR$ với kết quả mã hóa của khối trước:

   $PP_i = P_i \oplus C_{i-1}$

   $C_i = AES_E(PP_i, K)$

4. Các khối mã hóa $C_i$ sẽ ghép lại với nhau thành dữ liệu mã hóa cuối cùng:

   $C = C_1 \| C_2 \| ...$

Quy trình giải mã sẽ diễn ra theo chiều ngược lại, dữ liệu đã được mã hóa $C$ được chia thành các khối $C_i$.

<img src="https://mintcdn.com/locker/ZpQHj9IjHy-TnRFC/images/vi/locker-whitepaper/security-fundamentals/aes_decrypt.png?fit=max&auto=format&n=ZpQHj9IjHy-TnRFC&q=85&s=4b2d84e41dc9fae3a3abb231ee3c370a" alt="Sơ đồ giải mã AES-256-CBC" width="1190" height="686" data-path="images/vi/locker-whitepaper/security-fundamentals/aes_decrypt.png" />

1. Giải mã khối $C_1$ bằng $AES$ với khóa $K$:

   $PP_1 = AES_D(C_1, K)$

2. Thực hiện $XOR$ với $PP_1$ và vector khởi tạo $VI$ để thu hồi khối dữ liệu gốc $P_1$:

   $P_1 = PP_1 \oplus VI$

3. Từ khối $C_2$ trở đi, $PP_i$ sẽ được $XOR$ với dữ liệu đã được giải mã của khối trước:

   $PP_i = AES_D(C_i, K)$

   $P_i = PP_i \oplus C_{i-1}$

4. Các khối dữ liệu đã giải mã $P_i$ ghép lại với nhau để tái tạo thành dữ liệu gốc:

   $P = P_1 \| P_2 \| ...$
