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.. Với chiều dài của thanh ghi ngắn, cùng với thuật toán thiết k
Trang 1BÁ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
Trang 2Contents
Trang 3Phầ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
Trang 4Em 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á
Trang 5Phầ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
Trang 6Thanh 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 AThanh 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 BTươ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);
Trang 7B(0), B(1), , B(n-1)} ← {B(1), B(2), , B(n-1), B(0)
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) ;
Trang 8Hì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) ;
Trang 9Hình 4: Quá trình tạo Z khi IV(0) =1.
Trang 10Quá 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
Trang 11Hình 7: Quá trình mã hóa 1 file ảnh.
Trang 123.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
Trang 134.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
Trang 14Bảng thống kê thời gian mã hóa trên PC với Chip Intel® Core ™2 Duo
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
Trang 16Sau 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:
Trang 17thườ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
• 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)
Trang 18Initial Value: 01001110011001110110111101100011010010110110100001Secret Key: 01100001011011000110010001101010011011100110010001Keystream: 010101011000011000101001110100101010010101011110110
Initial Value:0110111001100111011000100111001101110110011000
Secret Key: 01100110011000100111001101100011011000010110010Keystream: 110111110100001101110100010111000001111000111001
Initial Value: 01101110011001110011001101100100011101100110011Secret Key: 001100010111011000110100001100110110001101110011Keystream: 00111101111100111011000111001101010110001101111
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.
Trang 19Ảnh gốc
Ảnh sau mã hóa
Trang 20Phầ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!
Trang 21Tài liệu tham khảo
ECRYPT, “eSTREAM: ECRYPT Stream Cipher Project, IST-2002-507932,” Available at http://www.ecrypt.eu.org/stream/
Học lập trình C#: http://www.youtube.com/watch?
v=5Xeiy1TdBQQ&list=PLA22806302AD434C6