Thứ Hai, 1 tháng 9, 2014

[Java Security] Phần 2 : Secret-key Cryptography (mã hóa khóa riêng)

Phần 2 : Secret-key Cryptography (mã hóa khóa riêng)
Thuật toán mã hóa có đặc điểm như sau : khóa mã hóa (encryption key) và khóa giải mã (decrytion key) phải giống nhau, hay khóa giải mã được tính toán theo một cách nào đó dựa trên khóa mã hóa. Những thuật toán như thế được gọi là thuật toán Secret-key hoặc thuật toán private-key (thuật toán mã khóa bảo mật ) hay thuật toán symmetric (thuật toán mã hóa đối xứng). Trong đó, khóa mã hóa và khóa giải mã đều được gọi chung là secret-key. DES (Data Encryption Standard – chuẩn mã hóa dữ liệu) là một ví dụ dành cho thuật toán Secret-key.
I. DES – Data Encryption Standard :
DES là 1 thuật toán secret-key, nghĩa là người gởi và người nhận phải biết cùng một khóa. Vấn đề chính trong thuật toán này là người nhận và người gởi phải trao đổi khóa một cách an toàn nhất.  DES được IBM phát triển vào những năm 1970, DES được chấp nhận bởi National Bureau of  Standards, ngày nay gọi là NIST. DES trở thành chuẩn mã hóa dữ liệu chính thức của chính phủ Hoa Kỳ năm 1977. NIST  kéo dài sử dụng chuẩn DES cho đến năm 1999. Tuy vậy, NIST cho rằng DES có thể không được kéo dài sau năm 1999.  DES đã trải qua nhiều năm đánh giá được xem là an toàn. Vào tháng 7/1997 DES bị tấn công thành công bởi nhiều máy tính nối qua Internet, nhưng ngay cả những kẻ tấn công cũng cho rằng DES vẫn an toàn đối với nhiều ứng dụng.
1. DES Modes (các tiêu chuẩn của DES):
Có 4 tiêu chuẩn được sử dụng kèm theo với thuật toán DES:
a. Tiêu chuẩn Electronic Codebook (ECB mode) :
ECB mode là tiêu chuẩn cơ bản nhất của DES. Plaintext (văn bản hay thông tin chưa mã hóa) được chia ra thành mỗi khối 8-byte và mỗi khối 8-byte này được mã hóa, hợp lại tất cả các khối 8-byte mã hóa này thành ciphertext (văn bản hay thông tin được mã hóa) hoàn chỉnh.   
Mỗi khối 8-byte khi được mã hóa sẽ tạo ra một bộ đệm 64-bit đầu vào. Từ đó, phát sinh ra một vấn đề “nếu khối cuối cùng của plaintext không đủ 8-byte thì sao ? ”.  Bằng cách nào đó phải làm cho khối cuối cùng này phải đủ 8-byte, thì cách làm cho khối cuối cùng này đủ 8-byte được gọi là PADDING. Vấn đề của padding là “khi ciphertext được giải mã, padding phải đưa được về đúng trạng thái ban đầu”.
Để giải quyết vấn đề về padding, công ty RSA Data Security phát triển 1 tiêu chuẩn gọi là Public Key Crytography Standard # 5 padding (viết tắt là PKCS#5 ). Cách làm việc của PKCS#5 padding như sau:
- Nếu n là số các byte cần thêm vào khối cuối cùng, thì giá trị của mỗi byte thêm vào đó là n.
- Nếu khối cuối cùng không cần thêm bất kỳ byte nào cả, thì một khối mới 8-byte được tạo ra và giá trị của mỗi byte là 8.
PCKPadding.png    
ECBMode.png
                                      Hình trên thể hiện làm việc của ECB mode
b. Tiêu chuẩn Cipher Block Chaining Mode (CBC) :
CBC mode làm việc như sau:
- Khối đầu tiên (8 Bytes) của plaintext (đặt tên là P1) sử dụng phép toán XOR với INITIALIZATION VECTOR (IV) để mã hóa, tạo thành khối đầu tiên của ciphertext (đặt tên là C1).
-  Mỗi khối của ciphertext (Cn) sử dụng phép toán XOR với khối kế tiếp của plaintext (Pn+1) để mã hóa, tạo thành khối kế tiếp của ciphertext (Cn+1)
- Khi đến khối cuối cùng, PKCS#5 padding sẽ được thực hiện như trong ECB mode.
* INITIALIZATION VECTOR (IV) :là một khối bits, được tạo ra theo sự ngẫu nhiên (random) của CBC mode để tạo thành 1 ciphertext khác biệt. Có nghĩa là cùng 1 plaintext, nhưng bạn muốn tạo ra 2 ciphertext bởi CBC mode, thì 2 ciphertext này hoàn toàn khác nhau bởi IV khác nhau.
CBCModeEncrypt.png
Mô hình CBC mã hóa từ Plaintext thành ciphertext
CBCModeDerypt.png
Mô hình CBC giải mã từ ciphertext thành Plaintext
c. Propagating Cipher Block Chanining mode (PCBC):
PCBC mode cũng tương tự CBC mode ngoại trừ sau khối đầu tiên trở đi, cả khối plaintext (Pn) và khối ciphertext (Cn) sử dụng phép toán XOR với plaintext (Pn+1)  trước khi được mã hóa.
PCBCMode
d. Cipher Feedback Mode (CFB):
Với một số ứng dụng thời gian thực yêu cầu dòng dữ liệu truyền đến phải liên tục hơn là gián đoạn (như là chuỗi ký tự truyền giữa host và terminal phải tạo thành dòng ký tự liên tục). Do đó các chế độ mật mã khối xử lývà truyền theo từng khối một trở nên không thích hợp; các mã stream cipher với đơn vị xử lý là ký tự - khối 8 bit sẽ là thích hợp hơn với dạng ứng dụng này. Chế độ CFB là một cải tiến cho phép tạo ra khả năng truyền khối nhỏ k-bit (với k tùy ý) trong khi vẫn dùng thuật toán mã khối. Và 8-bit(one byte) là phổ biến nhất khi dùng CFB mode, được gọi là CFB8.
*  Cách hoạt động mã hóa của CFB8 như sau:
- Bước 1 : IV 8-byte được khởi tạo một giá trị (mỗi plaintext stream sẽ có IV khác nhau).
- Bước 2 : IV được mã hóa và giá trị 8-bytes này được đưa vào shift register 8-byte (thanh ghi dịch chuyển).  
- Bước 3 : 8 bits đầu tiên của plaintext được XOR với 8 bits bên trái nhất trong shift register, tạo thành 8bits đầu tiên của ciphertext. (Trong shift register, 8bit của ciphertext này chiếm 8 bits bên trái nhất)
- Bước 4 : Dịch chuyển 8bits trong shift register về phía trái, để 8bits của ciphertext trong shift register thành 8 bits bên phải nhất.
- Bước 5 : Mã hóa shift register.
- Bước 6 : 8 bits kế tiếp của plaintext được XOR với 8 bits bên trái nhất trong shift register, tạo thành 8 bits kế tiếp của ciphertext.
Bước 4 đến bước 6 được lặp lại cho đến khi tất cả các plaintext được mã hóa.
CFBMode_encrypt
* Cách giải mã của CFB8 như sau:
- Bước 1: IV 8-byte được khởi tạo (cùng giá trị với IV lúc mã hóa), IV được mã hóa và giá trị 8-bytes này được đưa vào shift register 8-byte (thanh ghi dịch chuyển).  
- Bước 2: 8bits đầu tiên của ciphertext được XOR với 8bits bên trái nhất trong shift register, tạo thành 8 bits đầu tiên của plaintext.
- Bước 3: Dịch chuyển 8bits trong shift register về phía trái, để 8bits của plaintext trong shift register thành 8 bits bên phải nhất.
- Bước 4: Mã hóa shift register.
- Bước 5: 8 bits kế tiếp của ciphertext được XOR với 8 bits bên trái nhất trong shift register, tạo thành 8 bits kế tiếp của plaintext.
Bước 3 đến bước 5 được lặp lại cho đến khi tất cả các ciphertext được giải mã hết.
CFBMode_Decryption

e. Output Feedback Mode (OFB):
OFB tương tư CFB, ngoại trừ ciphertext không đưa giá trị phản hồi vào trong shift register. Thay vào đó, kết quả đầu ra của shift register thì được phản hồi thành chính nó.
OFBMode
Lưu ý :
- ECB, CBC, PCBC, CFB mode dùng cho block cipher – được thiết kế để mã hóa các khối văn bản hay chuỗi ký tự.
- OFB mode dùng cho stream cipher – mã hóa 1 luồng bit như audio, video stream.
II. DESede
Bởi sự phổ biến của DES và sự giới hạn của nó được vạch trần vào cuối những năm 1990, các nhà nghiên cứu đã tìm ra một cách khác để cải tiến vấn đề bảo mật của DES mà vẫn giữ được tính cơ bản của DES. Thuật toán mã hóa DESede ra đời, tên gọi khác là Triple DES. DESede sử dụng 3 vòng lặp của DES, cách thực hiện như sau:
- b1: Plaintext được mã hóa bằng DES, sử dụng key1 cho ra ciphertext (C1).
- b2: C1 tiếp tục được mã hóa bằng DES, sử dụng key2 cho ra ciphertext (C2).
- b3: C2 tiếp tục được mã hóa bằng DES, sử dụng key3 cho ra ciphertext cuối cùng (C3).
DESede   
III. Blowfish
Blowfish là thuật toán dành cho Secret-key Crytography, được xây dựng bởi Bruce Schneier, một chuyên gia trong lãnh vực mã hóa. Thuật toán Blowfish miễn phí, không đòi hỏi bản quyền sử dụng.
Blowfish khối mã hóa 64-bit với ý định thay thế cho DES, Blowfish là một thuật toán mã hóa nhanh và mạnh hơn DES, key của nó chiều dài từ 32bits đến 448bits.
Tương tự như DES, Blowfish hoàn toàn tương thích với các DES mode (tiêu chuẩn của DES) mà chúng ta đã được giới thiệu trong thuật toán DES.
IV. Rivest Ciphers
Các chuẩn của Rivest Ciphers là RC2,RC4,RC5,RC6. Hiện tại, Sun chưa hổ trợ cho Rivest Ciphers, nên tôi không tìm hiểu. Nếu muốn tìm hiểu bạn có thể dùng google để tìm kiếm hay vào wikipedia để tìm hiểu.

Không có nhận xét nào:

Đăng nhận xét