Tải bản đầy đủ (.docx) (21 trang)

đồ án Mã hóa luồng dữ liệu với thuậ t toán NKBK

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (509 KB, 21 trang )

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN ĐIỆN TỬ - VIỄN THÔNG

BÁO CÁO THỰC TẬP TỐT NGHIỆP
Đề tài : Mã hóa luồng dữ liệu với thuật toán NKBK.
Giáo viên hướng dẫn: TS. Phạm Việt Thành
Sinh viên thực hiện: Nguyễn Ngọc Khá
Số hiệu sinh viên: 20091428
Lớp: Điện Tử - Viễn Thông 10
Khóa: 54
Hà nội, Tháng 3/2014
Nguyễn Ngọc Khá – SHSV: 20091428
Contents
Đại học Bách Khoa Hà Nội Page 2
Nguyễn Ngọc Khá – SHSV: 20091428
Phần 1: Lời mở đầu
Ngày nay, cùng với sự phát triển mạnh về công nghệ thông tin, thì công việc bảo
vệ, bảo mật dữ liệu cũng là mối lo đáng quan tâm với ngành. Việc bảo mật sẽ
chống lại các cuộc tấn công từ bên ngoài vào, giúp thông tin muốn được lưu trữ
hay gửi đi được an toàn hơn. Với nhiều hình thức tấn công tinh vi, thì song song
với chúng, chúng ta cũng cần phải có những biện pháp ngăn chặn lại tối ưu hơn.
Trong các công cụ để ngăn chặn những hành vi đó, thì việc mã hóa dữ liệu cũng là
một giải pháp mà rất nhiều người ưa dùng.
Mã hóa chia thành hai loại là mã hóa luồng và mã hóa khối. Trong khi đó, nguyên
tắc thiết kế và bảo mật của mật mã khối được hiểu khá rõ, thiết kế mật mã luồng
vẫn còn đòi hỏi nhiều nghiên cứu. Kể từ khi mật mã khối có thể chuyển đổi thành
mật mã luồng bằng cách sử dụng OFB hoặc chế độ CFB đã có nhiều cuộc tranh
luận liệu mật mã dòng có thực sự hữu ích không. Những ý kiến chung đã chỉ ra
rằng thuật toán mã hóa luồng vẫn còn nhiều hữu ích bởi hai lý do sau. Thứ nhất,
chúng có thể được thiết kế cho phép thực hiện nhanh hơn. Thứ hai, chúng có thể
được thiết kế nhỏ gọn hơn trong phần cứng. Do đó, đối với một mật mã luồng


muốn trở nên hiệu quả thì nó phải chạy rất nhanh trong phần mềm hoặc rất nhỏ
trong phần cứng. Các hoạt động mã hóa trong một mật mã luồng nhị phân rất đơn
giản. Dòng chính được XOR nhị phân với bản gốc để hình thành lên bản mã.
Tương tự như vậy, giải mã được thực hiện bằng cách dùng dòng chính XOR với
bản mã để trở về bản gốc. Điều quan trong nhất của một mật mã dòng là chống lại
các cuộc tấn công khác nhau.
Trong bản báo cáo này, em xin đề xuất một loại mã hóa luồng dữ liệu có tên gọi là
NKBK, một thuật toán mới về mật mã luồng. Thêm vào đó, với thuật toán đơn
giản, thiết kế nhỏ gọn, độ an toàn mang đến cao, em tin rằng NKBK sẽ rất được ưa
chuộng.
Đại học Bách Khoa Hà Nội Page 3
Nguyễn Ngọc Khá – SHSV: 20091428
Em xin gửi lời cảm ơn chân thành tới TS. Phạm Việt Thành - Giảng viên viện
Điện tử - Viễn thông, trường Đại học Bách Khoa Hà Nội đã tận tình hướng dẫn,
giúp đỡ em trong quá trình thực tập vừa qua.
Em xin chân thành cảm ơn!
Sinh viên thực hiện
Nguyễn Ngọc Khá
Đại học Bách Khoa Hà Nội Page 4
Nguyễn Ngọc Khá – SHSV: 20091428
Phần 2: Nội dung
1. Sơ lược về đề tài.
NKBK là một loại mã hóa luồng. Với thuật toán đơn giản cùng với khả năng
xử lý dữ liệu tốt, quá trình thiết kế sẽ rất đơn giản, nhỏ gọn và sẽ mang lại
hiệu quả cao. Đối với phần cứng, NKBK hỗ trợ kích thước thanh ghi chính
là 80 bit Key và 64 bit IV và 80 bit Key ảo. Với chiều dài của thanh ghi
ngắn, cùng với thuật toán thiết kế đơn giản quá trình thiết kế phần cứng sẽ
trở nên nhỏ gọn. Ngoài ra khi phát triển phần mềm, NKBK sẽ tự động mở
rộng kích thước thanh ghi tùy vào nhu cầu người sử dụng, độ dài thanh ghi
càng cao thì độ an toàn càng tốt nhưng tốc độ xử lý càng chậm, và ngược lại,

độ dài thanh ghi càng ngắn thì độ an toàn càng thấp nhưng tốc độ xử lý càng
cao.
2. Thiết kế
Những quy định cụ thể chi tiết về thiết kế được trình bày như sau:
2.1. Thông số đầu vào và đầu ra
2.1.1. SecretKey (K), được gán với nhãn K(0) … K(ln-1) ( có nội dung
tương ứng với passwork người sử dụng nhập vào);
2.1.2. InitialValue (IV), có giá trị IV(0) … IV(m-1)( có nội dung tương
ứng với đoạn giá trị mà người lập trình cho trước);
Trong đó n và m lần lượt là chiều dài của 2 thanh ghi K và IV.
Đầu ra của NKBK là giá trị Z ( giá trị để mã hóa với bản gốc để
tạo thành bản mã hóa), thuật toán để tạo ra giá trị này sẽ được trình
bày ở phần sau.
2.2. Các thành phần trong bộ thiết kế Keystream.
Bộ thiết kế có tổng cộng 5 thanh ghi, trong đó có 3 thanh ghi thực và
2 thanh ghi ảo.
2.2.1. Thanh ghi thực.
 Thanh ghi IV.
Đại học Bách Khoa Hà Nội Page 5
Nguyễn Ngọc Khá – SHSV: 20091428
Thanh ghi IV có nội dung và chiều dài bằng chính giá trị
InitialValue mà người lập trình đưa vào trong chương
trình, được gán nhãn IV(0), IV(1), … IV(m-1);
 Thanh ghi A
Thanh ghi A có nội dung và chiều dài là một nửa của
SecretKey, chúng sẽ nhận thông tin từ các địa chỉ chẵn
của thanh ghi Key ( K(0), K(2), K(4), …  A(0), A(1),
A(2), … A(n-1) ), trong đó n = ln/2.
 Thanh ghi B
Tương tự như thanh ghi A với nội dung là các địa chỉ lẻ

của thanh ghi Key (K(1), K(3), K(5), …  B(0), B(1),
B(2), … B(n-1), trong đó n = ln/2.
Hình 1: Quá trình tạo ra 2 thanh ghi A và B từ thanh ghi K (SecretKey)
2.2.2. Thanh ghi ảo.
 Thanh ghi A’
Thuật tuán tạo thanh ghi A’ từ thanh ghi A và thanh ghi
IV:
For( i = 0; I <n; i++)
{
A’(i) = A(n-1) + IV(0);
A(0), A(1), . . . , A(n-1) ← A(1), A(2), . . . , A(n-1), A(0)
}
 Thanh ghi B’
Quá trình tạo thanh ghi B’ cũng tương tự như tạo thanh
ghi A’ :
For( i = 0; I <n; i++)
{
B’(i) = B(n-1) + IV(0);
Đại học Bách Khoa Hà Nội Page 6
Nguyễn Ngọc Khá – SHSV: 20091428
B(0), B(1), . . . , B(n-1)} ← {B(1), B(2), . . . , B(n-1),
B(0)
}
Hình 2: Quá trình tạo ra 2 thanh ghi ảo A’ và B’
2.3. Thiết kế Keystream
Sau khi nạp và khởi động các thanh ghi, chúng ta thiết kế Keystreams
như sau:
2.3.1. If IV(0) = 0
Then
Z = A(0) + A’(0) . B(0) + B’(0) ;

Z’ = A(n/2 – 1) . B(n/2 -1) + A’(n/2 – 1) . B’(n/2 - 1) ;
For( i = 0; i < n; i++) A(i) = A(i) + Z’; B(i) = B(i) +Z’;
A’(0), A’(1), A’(2), . . . , A’(n-1) ← A’(1), A’(2), A’(3), . . . ,
A’(n-1), A’(0) ;
B’(0), B’(1), B’(2), . . . , B’(n-1) ← B’(1), B’(2), B’(3), . . . ,
B’(n-1), B’(0) ;
IV(0), IV(1), IV(2), . . . , IV(m-1)} ← {IV(1), IV(2),
IV(3), . . . , IV(n-1), IV(0) ;
Đại học Bách Khoa Hà Nội Page 7
Nguyễn Ngọc Khá – SHSV: 20091428
Hình 3: Quá trình tạo Z khi IV(0) =0.
2.3.2. If IV(0)=1
Then
Z = A(0) + B’(0) .B(0) +A’(0) ;
Z’ = A(n/2 – 1) . B(n/2 -1) + A’(n/2 – 1) . B’(n/2 - 1) ;
For( i = 0; i < n; i++) A’(i) = A’(i) + Z’; B’(i) = B’(i) +Z’;
A(0), A(1), A(2), . . . , A(n-1) ← A(1), A(2), A(3), . . . , A(n-1),
A(0);
B(0), B(1), B(2), . . . , B(n-1) ← B(1), B(2), B(3), . . . , B(n-1),
B(0) ;
IV(0), IV(1), IV(2), . . . , IV(m-1) ← !IV(0), !IV(1), !IV(2), !
IV(3), . . . , !IV(m-2), !IV(m-1) ;
Đại học Bách Khoa Hà Nội Page 8
Nguyễn Ngọc Khá – SHSV: 20091428
Hình 4: Quá trình tạo Z khi IV(0) =1.
3. Hoạt động của thuật toán NKBK
3.1. Mã hóa
Đại học Bách Khoa Hà Nội Page 9
Nguyễn Ngọc Khá – SHSV: 20091428
Quá trình mã hóa dữ liệu là quá trình thực hiện phép toán Xor giữa file

bản gốc với dòng khóa Keystream mà thuật toán mã hóa luồng tạo ra.
Các trình tự mã hóa sẽ được mô tả ở hình dưới sau đây:
Hình 6: Quá trình mã hóa 1 file dữ liệu
Đầu vào của chương trình là 1 file cần mã hóa và 2 giá trị InitialValue và
SecretKey để tạo khóa luồng. Điều cần lưu ý ở đây là quá trình mã hóa dựa
trên phép toán Xor giữa các bit dữ liệu, chính vì thế mà khi mã hóa tất cả
phải được đổi sang dạng nhị phân. Dưới đây là một ví dụ về sự mã hóa với 1
flie ảnh bitmap.
Đại học Bách Khoa Hà Nội Page 10
Nguyễn Ngọc Khá – SHSV: 20091428
Hình 7: Quá trình mã hóa 1 file ảnh.
Đại học Bách Khoa Hà Nội Page 11
Nguyễn Ngọc Khá – SHSV: 20091428
3.2. Giải mã
Quá trình giải mã là bước sau của quá trình mã hóa, sau khi một file nào đó
đã mã hóa thành công, chúng ta thu về một mảng nhị phân mã hóa và công
việc giải mã sẽ bắt đầu từ đây.
Cũng vẫn là phép toán Xor, chúng ta lấy mảng nhị phân đã mã hóa tương tác
với dòng khóa Keystream, kết quả là sẽ cho ta về một mảng nhị phân có giá
trị bằng đúng mảng nhị phân của file gốc khi chưa bị mã hóa. Quá trình thực
hiện được mô tả ở hình dưới sau:
Hình 8: Quá trình giải mã
5.
Đại học Bách Khoa Hà Nội Page 12
Nguyễn Ngọc Khá – SHSV: 20091428
4. Ứng dụng của thuật toán NKBK
4.1. Phần mềm
NKBK rất hiệu quả cho phát triển phần mềm. Điểm nổi bật nhất ở NKBK là
thuật toán thiết kế đơn giản, tốc độ xử lý cao và khả năng bảo mật rất tốt khi
được phát triển trên phần mềm. Người lập trình sẽ không gặp nhiều khó

khăn khi tiếp cận NKBK.
Với độ rộng thanh ghi được mở rộng một cách tùy biến, tùy thuộc vào giá
trị, độ dài ít hay nhiều khi người sử dụng đăng nhập 2 giá trị
InitializationVariable và SecretKey, ta có thể hiểu được chiều dài càng lớn
thì khả năng xử lý mã hóa càng tốt, thuật toán xử lý càng nhiều và tiêu tốn
thời gian, chiều dài thanh ghi càng nhỏ thì khả năng xử lý mã hóa càng thấp,
thuật toán xử lý ít và tiêu tốn ít thời gian.
Hình 5: Kết quả sau khi mã hóa 1 file ảnh với độ dài các key khác nhau.
Ngoài NKBK, cũng còn rất nhiều loại cùng họ mã hóa luồng, chúng ta có
thể kể đến như Trivium, Grain128 hay Mickey. Điểm khác biệt giữa chúng
là thuật toán để tạo ra dòng Keystream, chính từ sự khác nhau đó dẫn đến
khả năng xử lý mã hóa của chúng cũng khác nhau. Sau đây là bảng so sánh
giữa 4 loại trên khi đang xử lý 1 file ảnh bitmap có độ dài là 248624 bit.
Bảng thống kê số bit bị thay đổi so với bản gốc
Tên chương trình Số bit bị thay đổi Phần trăm
NKBK 124585 50.1%
Mickey 128971 51.6%
Trivium 126484 51.8%
Grain128 128564 51.7%
Đại học Bách Khoa Hà Nội Page 13
Nguyễn Ngọc Khá – SHSV: 20091428
Bảng thống kê thời gian mã hóa trên PC với Chip Intel® Core ™2 Duo
T6670
Tên chương trình Thời gian xử lý
NKBK 480 ms
Mickey 60 s
Trivium 600 ms
Grain128 560 ms
Từ bảng so sánh trên, chúng ta có thể thấy số bit bị thay đổi luôn tiệm cận
giá trị 50%, thời gian xử lý mã hóa của NKBK là ngắn nhất so với 3 loại mã

hóa luồng còn lại. Điều đó có thể thấy được NKBK rất tối ưu đối khi phát
triển định hướng phần mềm.
4.2. Phần cứng
Trong việc phát triển phần cứng, NKBK sẽ tối thiểu hóa độ dài thanh ghi lại
để tiết kiệm các chi tiết đầu vào, giúp cho việc thiết kế chip trở nên nhỏ gọn
hơn, tiêu thụ ít năng lượng hơn.
Cụ thể ở đây, thuật toán sẽ lấy 80 bit Key và 64 bit IV tương ứng với độ dài
thanh ghi A và B là 40 bit, 2 thanh ghi ảo cũng là 40 bit. Vậy khi xử lý, thuật
toán sẽ tổng sử dụng đến 160 bit A, B, A’, B’ và 64 bit IV. Dưới đây là bảng
thống kê tổng số lượng thanh ghi của từng loại mã hóa luồng khi phát triển
phần cứng.
Bảng thống kê tổng độ dài thanh ghi của một số loại khóa luồng
Chương trình Tổng số lượng thanh ghi
Trivium 288 bit
Grain128 234 bit
Mickey 200 bit
NKBK 200 bit
Đại học Bách Khoa Hà Nội Page 14
Nguyễn Ngọc Khá – SHSV: 20091428
Đại học Bách Khoa Hà Nội Page 15
Nguyễn Ngọc Khá – SHSV: 20091428
5. Kết quả
Để đánh giá khả năng mã hóa sử dụng thuật toán NKBK, em thực hiện xây
dựng một phần mềm mã hóa và giải mã file ảnh trên nền .NET Framework
sử dụng thuật toán NKBK.
Hình 9: Cửa sổ giao diện phần mềm.
Chức năng phần mềm:
• Lựa chọn khóa:
Phần mềm được thiết kế với 4 loại khóa khác nhau, tùy vào người sử
dụng lựa chọn 1 khóa nào đó ưa thích để mã hóa.

• Chọn và đọc file:
Bước này cho người sử dụng đường dẫn đến các thư mục chứa file
ảnh và lựa chọn ảnh.
Sau khi chọn ảnh xong, chương trình sẽ tự động đọc file ảnh đó và tạo
ra một mảng nhị phân có chứa thông tin về bức ảnh đó.
• Nhập Passwork:
Đại học Bách Khoa Hà Nội Page 16
Nguyễn Ngọc Khá – SHSV: 20091428
Thực ra passwork có liên quan rất lớn đến giá trị SecretKey, thông
thường người sử dụng sẽ nhập passwork bằng những ký tự, chính vì
vậy mà ở chức năng này, chúng sẽ tự gọi hàm Convert từ ký tự đó
sang mảng nhị phân rồi gán vào SecretKey. Initial Value cũng được
gán giá trị từ chức năng này, trước đó người lập trình đã nhập 1 đoạn
ký tự về giá trị Initial Value trong chương trình, đến bước này chỉ việc
gọi hàm Convert và thực hiện phép gán nhị phân vào Initial Value.
• Mã hóa:
Chức năng mã hóa là một trong những chức năng chủ đạo của chương
trình. Chúng thực hiện việc gọi hàm Keystream, thực hiện phép toán
Xor giữa Keystream với mảng nhị phân của file gốc.
• Lưu ảnh mã hóa:
Sau khi mã hóa thành công, bước tiếp theo là xuất ra 1 file ảnh mã
hóa. Mảng nhị phân sau khi mã hóa sẽ được convert sang mảng byte
rồi sau đó từ mảng byte đưa ra một dạng bitmap và xuất ra ảnh.
• Giải mã:
Chức năng giải mã luôn đi sau chức năng mã hóa, chúng sẽ thực hiện
lại phép Xor giữa Keystream với mảng nhị phân đã mã hóa.
• Lưu ảnh giải mã:
Công việc lưu ảnh giải mã tương tự như lưu ảnh mã hóa với mảng bit
đầu vào là Keystream với mảng nhị phân đã giải mã.
Một số hàm quan trọng sử dụng trong chương trình:

• Hàm StringToBinary:
Hàm có chức năng chuyển từ dạng string sang dạng nhị phân. Nó rất
hữu ích đối với phần mềm, khi muốn lấy một mảng nhị phân từ
Passwork hay Initial Value có sẵn nào đó thì phải gọi hàm này để
chuyển đổi.
• Hàm tạo khóa:
Như đã thấy ở trong chương trình có 4 loại khóa tương đương với 4
hàm để tạo ra những khóa đó.
 Hàm keyTrivium ( Hàm tạo khóa Trivium)
 Hàm keyNKBK ( Hàm tạo khóa NKBK)
 Hàm keyGrain128 ( Hàm tạo khóa Grain128)
 Hàm keyMickey ( Hàm tạo khóa Mickey).
Kết quả mã hóa:
Đại học Bách Khoa Hà Nội Page 17
Nguyễn Ngọc Khá – SHSV: 20091428
Initial Value: 01001110011001110110111101100011010010110110100001
Secret Key: 01100001011011000110010001101010011011100110010001
Keystream: 010101011000011000101001110100101010010101011110110
Initial Value: 0110111001100111011000100111001101110110011000
Secret Key: 01100110011000100111001101100011011000010110010
Keystream: 110111110100001101110100010111000001111000111001
Initial Value: 01101110011001110011001101100100011101100110011
Secret Key: 001100010111011000110100001100110110001101110011
Keystream: 00111101111100111011000111001101010110001101111
Initial Value: 001010100011010101100010011001100100000000100
Secret Key: 0110001001100111011100110100000000110001001100
Keystream: 0111110111111111011011011111001111011111001110
Initial Value: 010000100011010100110011011000110011010100110
Secret Key: 0110111001100111011011110110001101101011011010
Keystream: 01000100011101110001001001100001000110110010100

Initial Value: 0101011000110010011000110010010000100101011001
Secret Key: 0111011001100011011001000100000001100101011001
Keystream: 11010100111001101001010000110001111001110010011
Chú thích: Initial Value, SecretKey là hai giá trị đầu vào, còn Keystream là
đầu ra của khóa luồng.
Đại học Bách Khoa Hà Nội Page 18
Nguyễn Ngọc Khá – SHSV: 20091428
Ảnh gốc
Ảnh sau mã hóa
Đại học Bách Khoa Hà Nội Page 19
Nguyễn Ngọc Khá – SHSV: 20091428
Phần 3: Kết luận
NKBK là một mật mã luồng mà có thể phát triển được trên nền tảng cả phần cứng
và phần mềm. Thuật toán đơn giản, giúp người lập trình dễ tiếp cận được vấn đề và
lập trình ra nó, ngoài ra, tốc độ xử lý của NKBK là rất cao, nên việc ứng dụng vào
phần mềm sẽ không quá khó khăn. Còn về phần cứng, NKBK đã tối thiểu một
phần độ dài của các thanh ghi, giúp cho việc thiết kế trở nên nhỏ gọn, thuận tiện
hơn.
Quá trình nghiên cứu NKBK vẫn đang trong giai đoạn phát triển, tuy đã đạt được
kết quả khả quan nhưng sẽ vẫn còn một số hạn chế,cần khắc phục trong thời gian
sắp tới. Do đó Em rất mong nhận được ý kiến đóng góp quý báu từ các thầy cô để
em có thể hoàn thiện đề tài của mình trong tương lai.
Em xin chân thành cảm ơn!
Đại học Bách Khoa Hà Nội Page 20
Nguyễn Ngọc Khá – SHSV: 20091428
Tài liệu tham khảo
ECRYPT, “eSTREAM: ECRYPT Stream Cipher Project, IST-2002-507932,”
Available at />Học lập trình C#: />v=5Xeiy1TdBQQ&list=PLA22806302AD434C6
Đại học Bách Khoa Hà Nội Page 21

×