Tải bản đầy đủ
1 Mô tả yêu cầu

1 Mô tả yêu cầu

Tải bản đầy đủ

- 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

- 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
4|Page

- 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.

1.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.

5|Page

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ử
B1: 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 .
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
6|Page

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

2.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ừ đến và
q trong khoảng từ đến .
B3: Với cặp giá trị p và q, ta dễ dàng tính được giá trị và .
B4: Chọn số tự nhiên e sao cho và e là nguyên tố cùng nhau với
B5: Từ khóa công khai e, ta tính được khóa bí mật d sao cho
* 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.

7|Page

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.
B4: 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(subtree) 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)

8|Page

* 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
9|Page

Đố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.

2.

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.
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

Số chữ số của N
100
110
120
129
130
140
155
160
174
200
10 | P a g e

Số bit
322
365
398
428
431
465
512
530
576
633

Năm phá mã
1991
1992
1993
1994
1996
1999
1999
2003
2003
2005

Thuật toán
Quadratic sieve
Quadratic sieve
Quadratic sieve
Quadratic sieve
GNFS
GNFS
GNFS
Lattice sieve
Lattice sieve
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:
Áp dụng công thức trên, ta có thể dùng đoạn chương trình sau để tính:
__author__ = 'DuThien'
import math
Q = []
11 | P a g e

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
Class RSA_Decryptor

2.3.3 Giải thuật Huffman
Class HT_KeyGen
12 | P a g e

Class HT_Encryptor
Class HT_Decryptor

3. Đánh giá, thực nghiệm
3.1 Giải thuật thay thế
Cỡ file
5.96KB
366KB
1.62MB
15.7MB
85.9MB
1.4GB

Tạo key
2(ms)

Mã hóa
4(ms)
22(ms)
166(ms)
416(ms)
2135(ms)
75224(ms)

Giải mã
5(ms)
38(ms)
119(ms)
688(ms)
3694(ms)
112617(ms)

Mã hóa
190(ms)
11109(ms)
50210(ms)
491687(ms)
N/A
N/A

Giải mã
132(ms)
7807(ms)
30827(ms)
285474(ms)
N/A
N/A

Mã hóa
41(ms)
182(ms)
581(ms)
6102(ms)

Giải mã
36(ms)
198(ms)
600(ms)
6085(ms)

3.2 Giải thuật RSA
Cỡ file
5.96KB
366KB
1.62MB
15.7MB
85.9MB
1.4GB

Tạo key
2083(ms)

3.3 Giải thuật Huffman
Cỡ file
5.96KB
366KB
1.62MB
15.7MB
13 | P a g e

Tạo key
82(ms)
21(ms)
55(ms)
81(ms)