Assignment 1, môn Mật mã an ninh mạng, ĐH Bách khoa.Đề tài : Hiện thực chương trình áp dụng các thuật toán mã hóa3 giải thuật mã hóa : giải thuật thay thế, RSA, Huffman TreeProject mã hóa file tất cả các định dạng, sử dụng ngôn ngữ java với nền tảng JAVAFXCác chức năng chính: mã hóa file mọi định dạng với 3 thuật toán, lưu và mã hóa key file phục vụ mã hóa và giải mã, kiểm tra tính toàn vẹn của file bằng MD5
Trang 1Trường Đại học Bách Khoa TP.Hồ Chí Minh Khoa Khoa Học Và Kĩ Thuật Máy Tính
MẬT MÃ & AN NINH MẠNG
BÁO CÁO BÀI TẬP LỚN 1
Giáo viên hướng dẫn:
Sinh viên thực hiện:
1
2
3
Trang 21 Giới thiệu 3
1.1 Mô tả yêu cầu 3
1.2 Tổng quan 3
1.2.1 Ưu điểm 5
1.2.2 Hạn chế 5
2 Chi tiết ứng dụng 6
2.1 Các giải thuật 6
2.1.1 Giải thuật mã hóa thay thế 6
2.1.2 Giải thuật RSA 7
2.1.3 Giải thuật Huffman 8
2.2 Tính bảo mật 10
2.2.1 Giải thuật thay thế 10
2.2.2 Giải thuật RSA 10
2.2.3 Giải thuật Huffman 11
2.3 Áp dụng lên chương trình 12
2.3.1 Giải thuật thay thế 12
2.3.2 Giải thuật RSA 12
2.3.3 Giải thuật Huffman 13
3 Đánh giá, thực nghiệm 13
3.1 Giải thuật thay thế 13
3.2 Giải thuật RSA 13
3.3 Giải thuật Huffman 13
4 Khả năng mở rộng 14
PHỤ LỤC 1 14
PHỤ LỤC 2 14
Trang 31 Giới thiệu
1.1 Mô tả yêu cầu
Mã hoá là phương pháp giúp bảo vệ dữ liệu cá nhân nhạy cảm trên máy tính, cho dù đó là dữ liệu cá nhân, tổ chức nào đó qua mạng Internet, hay sao lưu dữ liệu
cá nhân trên các máy chủ, Cloud, , thì việc mã hoá sẽ ngăn chặn bất cứ ai có thể đọc được dữ liệu trước khi được sự cho phép của bạn Trong assignment này chúng
ta sẽ thực hiện một chương trình mã hóa để giữ cho các tập tin và thư mục trên máy tính được an toàn Cụ thể là xây dựng chương trình mã hóa các tập tin, thư mục sử dụng các giải thuật mã hóa phổ biến trong thực tế như DES, AES, RSA
và giải mã các tập tin và thư mục đó
1.2 Tổng quan
- Ngôn ngữ hiện thực : Java
- Nền tảng : Javafx
- Các định dạng file hỗ trợ: tất cả các file có dung lượng mà bộ nhớ cho phép Tổng quát về chương trình:
Chương trình thực hiện chức năng mã hóa và giải mã file, hiện thực trên 3 tab ứng với 2 giải thuật
* Subtitution Cipher
Trang 4- Tạo key mới : tạo một key ngẫu nhiên
- Import một file key có sẵn có định dạng *.sck
- Export file key dưới định dạng *.sck
- Mã hóa một file định dạng bất kì, dung lượng không giới hạn tạo thành file
*.sce
- Giải mã file đã mã hóa có định dạng *.sce, trả về file gốc đồng thời thêm mã thời gian vào tên để tránh trùng với file cũ, kiểm tra lại bằng MD5
* RSA
Trang 5- Tạo một bộ key RSA gồm n,e, d.
- Import RSA key từ file định dạng *.rsk
- Export key ra file định dạng *.rsk
- Mã hóa bất kì định dạng file nào tạo thành file *.rse
- Giải mã file đã mã hóa có định dạng *.rse, trả về file gốc đồng thời thêm mã thời gian vào tên để tránh trùng với file cũ, kiểm tra lại bằng MD5
* Huffman
- Tạo một cây huffman từ một file mẫu có sẵn, đồng thời hiển thị histogram của các giá trị trong file
- Import một cây Huffman từ file định dạng *.htk
- Export cây Huffman ra file định dạng *.htk
- Mã hóa một file định dạng bất kì, dung lượng không giới hạn tạo thành file
*.hte
- Giải mã file đã mã hóa có định dạng *.ht, trả về file gốc đồng thời thêm mã thời gian vào tên để tránh trùng với file cũ, kiểm tra lại bằng MD5
Trang 61.2.1 Ưu điểm
Tất cả các file key đều được lưu dưới dạng binary và được mã hóa bằng
password với giải thuật tương tự One-time pad
Chương trình xử lí được tất cả các định dạng file, kể cả file text lẫn file nhị phân
Ngay cả khi công khai giải thuật, người tấn công phải giải mã toàn bộ thì mới biết được key đã thử có đúng hay không
1.2.2 Hạn chế
Đối với giải thuật RSA, chỉ nên mã hóa và giải mã các file có dung lượng dưới 10MB nếu thời gian cho phép là 1 phút
Giao diện còn tương đối đơn giản
2 Chi tiết ứng dụng
2.1 Các giải thuật
2.1.1 Giải thuật mã hóa thay thế
* Giải thuật sinh key – giải thuật bánh xe sổ số(roulette wheel selection
algorithm)
Mục đích của giải thuật nhằm tạo ra key là một hóa vị 256 phần tử
Trang 7B1: Khởi tạo xác suất ban đầu bằng nhau cho 256 phần tử
B2 : Sinh một số ngẫu nhiên S trong khoảng từ 0 đến tổng xác suất các phần
tử trong tập
B3 : với pi là xác suất được chọn của phần tử thứ i, tìm k sao cho ∑
j=1
k
p j ≥ S
B4 : thêm k vào tập kết quả, cho pi = 0 và quay lại B2, giải thuật dừng khi
kết quả đã đủ 256 phần tử
* Mã hóa :
Đầu vào key là 1 chuỗi 256 kí tự và file input, kết quả trả về trong file output B1 : Tính MD5 và kích thước của file input, ghi vào file output
B2 : Lấy ra lần lược các khối dữ liệu có kích thước tối đa 64KB đưa vào
buffer, với mỗi phần tử c kiểu byte trong buffer thực hiện phép biến đổi cho ra e
tương ứng
e = key[c+128];// vì java dùng kiểu dữ liệu có dấu
B3: Ghi output, quay lại B2 đến khi hết dữ liệu
Giải mã :
Đầu vào key là 1 chuỗi 256 kí tự và file input, kết quả trả về trong file output B1: Tìm đảo của key theo công thức
key-1[key[i]+128] = i;
B2 : đọc mã MD5và kích thước file được lưu trong file input
B3 :Lấy ra lần lược các khối dữ liệu có kích thước tối đa 64KB đưa vào
buffer, với mỗi phần tử c kiểu byte trong buffer thực hiện phép biến đổi cho ra d
tương ứng
c = key-1[e+128];
B4: Ghi output, quay lại B2 đến khi hết dữ liệu
B5 : Kiểm tra file kết quả với mã MD5 để kiểm tra key có chính xác hay không cũng như this toàn vẹn của file
Trang 82.1.2 Giải thuật RSA
* Giải thuật sinh key:
Mục đích của giải thuật nhằm tạo ra một cặp key đóng vai trò là khóa công khai và khóa bí mật:
B1: Khởi tạo kích thước ban đầu của N (modulus) là 512 bit
B2: Sinh một cặp số nguyên tố ngẫu nhiên gồm p trong khoảng từ 2 256 đến
2257 và q trong khoảng từ 2255 đến 2256
B3: Với cặp giá trị p và q, ta dễ dàng tính được giá trị N= pq và
ϕ ( N )=( p−1)( q−1)
B4: Chọn số tự nhiên e sao cho 1<e <ϕ ( N ) và e là nguyên tố cùng nhau với
ϕ ( N )
B5: Từ khóa công khai e, ta tính được khóa bí mật d sao cho de ≡ 1(mod ϕ( N ))
* Mã hóa:
Đầu vào gồm key là khóa công khai e và file input, kết quả trả về là file output
B1 : Tính MD5 của file input, ghi vào file output
B2 : Đọc dữ liệu file input lần lượt từng khối dưới dạng byte có kích thước 64bit, sau đó mã hóa các khối dữ liệu đó
B3: Ghi dữ liệu mã hóa và kích thước khối dữ liệu sau mã hóa vào file output, quay lại B2 đến khi mã hóa hết dữ liệu
Giải mã :
Đầu vào key là khóa bí mật d và file input, kết quả trả về trong file output B1: Đọc dữ liệu dạng Integer của file input và giải mã để lấy kích thước của khối dữ liệu mã hóa
B2: Đọc tiếp dữ liệu của file input với kích thước ở bước trên, giải mã khối
dữ liệu đó và ghi vào file output
B3: Lặp lại các bước 1 và 2 cho đến khi đọc hết file input
Trang 9B4: Kiểm tra MD5 file output với file input đã được Hash trước khi mã hóa
để kiểm tra tính toàn vẹn của dữ liệu
2.1.3 Giải thuật Huffman
* Sinh key
B1 : Tính histogram của file mẫu hoặc file input
B2 : Tạo cây huffman, áp dụng giải thuật tham lam
B2.1 : Khởi tạo heap rỗng, độ ưu tiên của một cây huffman con(sub-tree) trong heap bằng tổng xác suất của giá trị mà các node lá trong sub-tree nắm giữ
B2.2 : Cho toàn bộ các node lá vào heap, mỗi node lá nắm giữ giá trị
và xác suất của giá trị tương ứng
B2.3 : Lấy 2 sub-tree từ heap, kết hợp chúng thành một sub-tree lớn hơn thông qua một node mới, hoán vị thứ tự 2 node lấy ra để tạo ra cây ngẫu nhiên,
để tránh từ một file có thể tạo cây giống nhau trong các lần tạo key khác nhau
B2.4: Nếu trong heap còn ít hơn 2 sub-tree, tức lúc này ta đã có 1 cây huffman tree hoàn chỉnh, ngược lại tiếp tục B2.3
* Lưu trữ key
Cách 1: Danh sách cạnh
Cách 2: Các theo tác duyệt cây NLR, nếu quy ước
L : duyệt qua trái
R : duyệt qua phải E(X) : gặp lá mang giá trị X
Ví dụ : CRYPTTOOL LE(O) RE(C)E(L)RE(T)RE(Y)RE(P)E(R)
Trang 10* Mã hóa :
Đầu vào key là 1 cây huffman và file input, kết quả trả về trong file output B1 : Tính MD5 và kích thước của file input, ghi vào file output
B2 : Tạo từ điển, với mỗi giá trị c mã hóa, ta có 1 chuỗi bit là các đi từ gốc đến node có giá trị c Ví dụ ở trên, C : 101.
B3 : Với mỗi byte trong input, tra trong từ điển giá trị chuỗi bit tương ứng và ghi nó vào output
* Giải mã :
Đầu vào key là 1 cây huffman và file input, kết quả trả về trong file output B1 : đọc mã MD5 và kích thước file được lưu trong file input
B2 : Nếu số byte đã giải mã bằng kích thước file thì tới B5,Khởi tạo con trỏ vào node gốc của cây huffman
B3 : với mỗi bit đọc ra từ input, nếu là 0, đưa con trỏ về node trái của con trỏ, ngược lại đưa con trỏ về node phải của con trỏ
B4 : nếu con trỏ đang trỏ về node lá, ghi giá trị của node lá ra file output, tăng số byte đã giải mã lên 1 và quay về bước 2
B5 : kiểm tra file output với mã MD5
2.2 Tính bảo mật
2.2.1 Giải thuật thay thế
Trong mã hóa file text, tập giá trị nhỏ, xác suất phân bố tập trung vào các kí tự, dấu space, tab, nên khả năng bị phá giải cao hơn
Trang 11Đối với các file mà giá trị phân bố đều, số lượng key cần thử sẽ rất lớn, và dần tiến tới 256!~8E506
2.2.2 Giải thuật RSA
Sau đây ta sẽ xem xét một số các tấn công phương pháp RSA
1 Vét cạn khóa: cách tấn công này thử tất cả các khóa d có thể có để tìm ra
bản giải mã có ý nghĩa, tương tự như cách thử khóa K của mã hóa đối xứng Với N lớn, việc tấn công là bất khả thi
2 Phân tích N thành thừa số nguyên tố N = pq : Chúng ta đã nói rằng việc
phân tích phải là bất khả thi thì mới là hàm một chiều, là nguyên tắc hoạt động của RSA Tuy nhiên, nhiều thuật toán phân tích mới đã được đề xuất, cùng với tốc độ xử lý của máy tính ngày càng nhanh, đã làm cho việc phân
tích N không còn quá khó khăn như trước đây Năm 1977, các tác giả của RSA đã treo giải thưởng cho ai phá được RSA có kích thước của N vào
khoảng 428 bít, tức 129 chữ số Các tác giả này ước đoán phải mất 40 nghìn triệu triệu năm mới có thể giải được Tuy 71 nhiên vào năm 1994, câu đố
này đã được giải chỉ trong vòng 8 tháng Bảng sau liệt kê kích thước N của
các RSA đã phá mã được cho đến hiện nay
Bảng liệt kê các mốc phá mã RSA
Trang 12200 633 2005 Lattice sieve
Dĩ nhiên là việc phá mã trên chỉ được thực hiện trong phòng thí nghiệm Tuy
nhiên người ta cho rằng kích thước của N phải khoảng 1024 bít (309 chữ số) thì
mới bảo đảm an toàn thật sự
3 Đo thời gian: Đây là một phương pháp phá mã không dựa vào mặt toán học
của thuật toán RSA, mà dựa vào một “hiệu ứng lề” sinh ra bởi quá trình giải
mã RSA Hiệu ứng lề đó là thời gian thực hiện giải mã Giả sử người phá mã
có thể đo được thời giải mã dùng thuật toán bình phương liên tiếp Trong
thuật toán bình phương liên tiếp, nếu một bít của d là 1 thì xảy ra hai phép
modulo, nếu bít đó là 0 thì chỉ có một phép modulo, do đó thời gian thực hiện giải mã là khác nhau Bằng một số phép thử chosen-plaintext, người
phá mã có thể biết được các bít của d là 0 hay 1 và từ đó biết được d
Phương pháp phá mã này là một ví dụ cho thấy việc thiết kế một hệ mã an toàn rất phức tạp Người thiết kế phải lường trước được hết các tình huống có thể xảy ra
2.2.3 Giải thuật Huffman
Mỗi key là một trạng thái của cây huffman, trong mã hóa tập gồm 256 giá trị, key là một cây huffman có 256 lá, và các lá mang giá trị cần mã hóa, đường đi từ gốc đến lá cho biết giá trị sau khi mã hóa
Nếu không quan tâm đến các giá trị trên node lá, chỉ quan tâm đến hình dạng của cây huffman
Gọi Q(k) là số hình dạng của cây huffman có k lá, khi đó
Q(1) = 1
Q(2) = 1
Q(3) = 2
Công thức quy hoạch động tổng quát: Q (k )=∑
i=1
k−1
Q(i)∗Q(k −i)
Áp dụng công thức trên, ta có thể dùng đoạn chương trình sau để tính:
Trang 13author = 'DuThien'
import math
Q = []
for i in range(257):
Q.append(0)
Q[1] = 1
Q[2] = 1
for n in range(3, 257):
for k in range(1, n):
Q[n] = Q[n] + Q[k] * Q[n - k]
print(Q[256])
Kết quả : Q(256)~4.6E149
Vậy key có thể có tối đa Q(256)*256 ! ~ 4E657
Trong trường hợp cây huffman trở thành cây cây nhị phân đầy đủ, tức khi các giá trị của file mã hóa phân bố đều, thì số trạng thái cần thử là 256 ! ~ 8E506
2.3 Áp dụng lên chương trình
2.3.1 Giải thuật thay thế
Class SC_KeyGen
Class SC_Encryptor
Class SC_Decryptor
2.3.2 Giải thuật RSA
Class RSA_KeyGen
Class RSA_Encryptor
Trang 142.3.3 Giải thuật Huffman
Class HT_KeyGen
Class HT_Encryptor
Class HT_Decryptor
3 Đánh giá, thực nghiệm
3.1 Giải thuật thay thế
3.2 Giải thuật RSA
3.3 Giải thuật Huffman
Trang 15366KB 21(ms) 182(ms) 198(ms)
4 Khả năng mở rộng
Các chức năng chưa thực hiện:
- Giải thuật thay thế: sử dụng 1 block dữ liệu lớn hơn thay vì 1 byte
- Giải thuật RSA: cho phép người dùng thay đổi kích thước block cũng như tùy chỉnh thay vì khối 512bit và key sinh ngẫu nhiên, sử dụng multi-thread
để tăng tốc xử lí
- Giải thuật Huffman: xử lí các block dữ liệu lớn hơn và có kích thước khác nhau, nhằm tìm ra các block có dữ liệu giống nhau, giúp tăng hiệu quả nén
dữ liệu Nén dữ liệu trên tập chữ cái
Source code : https://github.com/duthienkt/MiniCryptool
5 Tham khảo
https://vi.wikipedia.org/wiki/RSA_(m%C3%A3_h%C3%B3a)
https://vi.wikipedia.org/wiki/M%C3%A3_h%C3%B3a_Huffman
Trang 16PHỤ LỤC 1
Phạm Quốc Du Thiên
(51303834)
- Thiết kế giải thuật
- Giải thuật Huffman(Báo cáo, code)
- Báo cáo giải thuật thay thế
- Tổng hợp báo cáo
- Hiện thực giao diện
- Viết các thư viện hỗ trợ:
nhập suất file, cấu trúc dữ liệu
- Hiện thực mã hóa file ứng với mỗi module thuật toán
- Hiện thực lưu trữ và mã hóa file key bằng
password với One-time pad
- Fix bug, cải tiến, tăng hiệu năng cho giải thuật
50%
Nguyễn Hoàng Đức
Tâm
(51303513)
- Giải thuật RSA(Báo cáo, code)
30%
Nguyễn Thanh Hải
(51301050)
- Giải thuật thay thế(code)
- Tiêu đề báo cáo
20%
Trang 17PHỤ LỤC 2
* Lưu một khóa:
- Tạo một key mới hoặc import một key đã có sẵn
- Chọn Export, cửa sổ chọn file xuất hiện, chọn đường dẫn muốn lưu
- Nhập password để mã hóa dữ liệu OK
Lưu ý: Các định dạng file key và file được mã hóa chỉ phân biệt bằng tên phần mở rộng, nên có thể bị lỗi nếu mở file sai định dạng
* Mã hóa một file
Đối với giải thuật thay thế và RSA
B1: import key hoặc tạo key mới bằng cách bấm Generate, nếu tạo key mới, sau đó cần chọn Export và lưu key để giải mã
B2: chọn đường dẫn cho file input
B3: chọn Encrypt
Đối với giải thuật Huffman
Trang 18Lư ý: trên cùng một file mẫu để tạo cây Huffman, mỗi lần tạo key sẽ có kết quả khác nhau
* Mã hóa thay thế
Trang 19* Huffman