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

BÀI TẬP LỚN MẬT MÃ VÀ AN TOÀN DỮ LIỆU Các phương pháp mã hóa âm thanh số

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 (359.79 KB, 20 trang )

ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
&&&
BÀI TẬP LỚN
MẬT MÃ VÀ AN TOÀN DỮ LIỆU
Đề tài: “Các phương pháp mã hóa âm thanh số”
Giảng viên: PGS.TS Trịnh Nhật Tiến
Học viên thực hiện: Bùi Hương Giang, K20
Lớp MH: INT6010 2
Mã HV: 13025155
Hà Nội, 05/2014
1
Mục lục
I. Phương pháp mã hóa Rijndael (AES)
1. Giới thiệu
Thuật toán Rijndael hay thường được gọi thay thế là AES là thuật toán được thiết
kế bởi hai nhà mật mã học người Bỉ: Joan Daemen và Vincent Rijmen.
Thuật toán được đặt tên là Rijndael khi họ tham gia cuộc thi thiết kế tiêu chuẩn mã hóa
tiến tiến AES (Advanced Encryption Standard).
Rijndael là thuật toán mã hóa khối được chính phủ Hoa Kỳ áp dụng làm tiêu
chuẩn mã hóa. Giống như tiêu chuẩn tiền nhiệm DES, AES được kỳ vọng áp dụng trên
phạm vi thế giới và đã được nghiên cứu rất kỹ lưỡng. AES được chấp thuận làm tiêu
chuẩn liên bang bời Viện tiêu chuẩn và công nghệ quốc gia Hoa Kỳ (NIST) sau một quá
trình tiêu chuẩn kéo dài 5 năm.
Khác với DES sử dụng mạng Feistel, Rijndael sử dụng mạng thay thế hoán vị.
AES có thể dễ dàng thực hiện với tốc độ cao bằng phần mềm hoặc phần cứng và không
2
đòi hỏi nhiều bộ nhớ. Đây là một tiêu chuẩn mã hóa mới, nó đang được triển khai sử
dụng đại trà.
Mặc dù 2 tên AES và Rijndael vẫn thường được gọi thay thế cho nhau nhưng trên
thực tế thì 2 thuật toán không hoàn toàn giống nhau. AES chỉ làm việc với các khối dữ


liệu (đầu vào và đầu ra) 128 bít và khóa có độ dài 128, 192 hoặc 256 bít trong khi
Rijndael có thể làm việc với dữ liệu và khóa có độ dài bất kỳ là bội số của 32 bít nằm
trong khoảng từ 128 tới 256 bít. Các khóa con sử dụng trong các chu trình được tạo ra
bởi quá trình tạo khóa con Rijndael. Mỗi khóa con cũng là một cột gồm 4 byte. Hầu hết
các phép toán trong thuật toán AES đều thực hiện trong một trường hữu hạncủa các byte.
Mỗi khối dữ liệu 128 bit đầu vào được chia thành 16 byte (mỗi byte 8 bit),có thể xếp
thành 4 cột, mỗi cột 4 phần tử hay là một ma trận 4x4 của các byte,nó được gọi là ma trận
trạng thái, hay vắn tắt là trạng thái (tiếng Anh:state, trang thái trong Rijndael có thể có
thêm cột). Trong quá trình thực hiện thuật toán các toán tử tác động để biến đổi ma trận
trạng thái này.
Chú ý:
- Thuật toán Rijndael hỗ trợ khối dữ liệu có độ dài 128, 160, 192, 224, và 256 bít;
còn AES chỉ hỗ trợ khối có độ dài 128 bít.
- Thuật toán Rijndael hỗ trợ khóa có độ dài 128, 160, 192, 224, và 256 bít; AES hỗ
trợ khóa có độ dài 128, 192, và 256 bít.
2. Mô tả thuật toán
Bao gồm các bước:
• Khởi động vòng lặp
AddRoundKey — Mỗi cột của trạng thái đầu tiên lần lượt được kết hợp với một khóa con
theo thứ tự từ đầu dãy khóa.
3
Trong bước AddRoundKey, mỗi byte được kết hợp với một byte trong khóa con của chu
trình sử dụng phép toánXOR (⊕).
• Vòng lặp
- SubBytes — đây là phép thế (phi tuyến) trong đó mỗi byte trong trạng thái sẽ
được thế bằng một byte khác theo bảng tra (Rijndael S-box).
- ShiftRows — dịch chuyển, các hàng trong trạng thái được dịch vòng theo số bước
khác nhau.
Trong bước ShiftRows, các byte trong mỗi hàng được dịch vòng trái. Số vị trí dịch
chuyển tùy thuộc từng hàng.

4
- MixColumns — quá trình trộn làm việc theo các cột trong khối theo một phép
biến đổi tuyến tính.
Trong bước MixColumns, mỗi cột được nhân với một hệ số cố định c(x).
- AddRoundKey
-
• Vòng lặp cuối
- SubBytes
- ShiftRows
- AddRoundKey
Tại chu trình cuối thì bước MixColumns không thực hiện.
Bước SubBytes
Các byte được thế thông qua bảng tra S-box. Đây chính là quá trình phi tuyến của
thuật toán. Hộp S-box này được tạo ra từ một phép biến đổi khả nghịch trong trường hữu
hạn GF (2
8
) có tính chất phi tuyến. Để chống lại các tấn công dựa trên các đặc tính đại số,
hộp S-box này được tạo nên bằng cách kết hợp phép nghịch đảo với một phép biến đổi
affine khả nghịch. Hộp S-box này cũng được chọn để tránh các điểm bất động (fixed
point).
5
Trong bước SubBytes, mỗi byte được thay thế bằng một byte theo bảng tra, S; b
ij
= S(a
ij
).
Bước ShiftRows
Các hàng được dịch vòng một số bước nhất định. Đối với AES, hàng đầu được giữ
nguyên. Mỗi byte của hàng thứ 2 được dịch vòng trái một vị trí. Tương tự, các hàng thứ 3
và 4 được dịch vòng 2 và 3 vị trí. Do vậy, mỗi cột khối đầu ra của bước này sẽ bao gồm

các byte ở đủ 4 cột khối đầu vào. Đối với Rijndael với độ dài khối khác nhau thì số vị trí
dịch chuyển cũng khác nhau.
Bước MixColumns
Bốn byte trong từng cột được kết hợp lại theo một phép biến đổi tuyến tính khả
nghịch. Mỗi khối 4 byte đầu vào sẽ cho một khối 4 byte ở đầu ra với tính chất là mỗi byte
ở đầu vào đều ảnh hưởng tới cả 4 byte đầu ra. Cùng với bước ShiftRows, MixColumns đã
tạo ra tính chất khuyếch tán cho thuật toán. Mỗi cột được xem như một đa thức trong
trường hữu hạn và được nhân với đa thức (modulo ).
Vì thế, bước này có thể được xem là phép nhân ma trận trong trường hữu hạn.
Bước AddRoundKey
Tại bước này, khóa con được kết hợp với các khối. Khóa con trong mỗi chu trình
được tạo ra từ khóa chính với quá trình tạo khóa con Rijndael; mỗi khóa con có độ dài
giống như các khối. Quá trình kết hợp được thực hiện bằng cách XOR từng bít của khóa
con với khối dữ liệu.
6
Đối với các hệ thống 32 bít hoặc lớn hơn, ta có thể tăng tốc độ thực hiện thuật toán
bằng cách sát nhập các bước SubBytes, ShiftRows, MixColumns và chuyển chúng thành
dạng bảng. Có cả thảy 4 bảng với 256 mục, mỗi mục là 1 từ 32 bít, 4 bảng này chiếm
4096 byte trong bộ nhớ. Khi đó, mỗi chu trình sẽ được bao gồm 16 lần tra bảng và 12 lần
thực hiện phép XOR 32 bít cùng với 4 phép XOR trong bước AddRoundKey.
Trong trường hợp kích thước các bảng vẫn lớn so với thiết bị thực hiện thì chỉ dùng một
bảng và tra bảng kết hợp với hoán vị vòng quanh
3. Tính an toàn của thuật toán
Vào thời điểm năm 2006, dạng tấn công lên AES duy nhất thành công là tấn công
kênh bên (side channel attack]). Vào tháng 6 năm 2003, chính phủ Hoa kỳ tuyên bố AES
có thể được sử dụng cho thông tin mật.
"Thiết kế và độ dài khóa của thuật toán AES (128, 192 và 256 bít) là đủ an toàn để
bảo vệ các thông tin được xếp vào loại TỐI MẬT (secret). Các thông tin TUYỆT MẬT
(top secret) sẽ phải dùng khóa 192 hoặc 256 bít. Các phiên bản thực hiện AES nhằm mục
đích bảo vệ hệ thống an ninh hay thông tin quốc gia phải được NSA kiểm tra và chứng

nhận trước khi sử dụng." Điều này đánh dấu lần đầu tiên công chúng có quyền tiếp xúc
với thuật toán mật mã mà NSA phê chuẩn cho thông tin TUYỆT MẬT. Nhiều phần
mềm thương mại hiện nay sử dụng mặc định khóa có độ dài 128 bít.
Phương pháp thường dùng nhất để tấn công các dạng mã hóa khối là thử các kiểu
tấn công lên phiên bản có số chu trình thu gọn. Đối với khóa 128 bít, 192 bít và 256 bít,
AES có tương ứng 10, 12 và 14 chu trình. Tại thời điểm năm 2006, những tấn công thành
công được biết đến là 7 chu trình đối với khóa 128 bít, 8 chu trình với khóa 192 bít và 9
chu trình với khóa 256 bít.
Một số nhà khoa học trong lĩnh vực mật mã lo ngại về an ninh của AES. Họ cho
rằng ranh giới giữa số chu trình của thuật toán và số chu trình bị phá vỡ quá nhỏ. Nếu các
kỹ thuật tấn công được cải thiện thì AES có thể bị phá vỡ. Ở đây, phá vỡ có nghĩa chỉ bất
7
cứ phương pháp tấn công nào nhanh hơn tấn công kiểu duyệt toàn bộ. Vì thế một tấn
công cần thực hiện 2
120
cũng được coi là thành công mặc dù tấn công này chưa thể thực
hiện trong thực tế. Tại thời điểm hiện nay, nguy cơ này không thực sự nguy hiểm và có
thể bỏ qua. Tấn công kiểu duyệt toàn bộ quy mô nhất đã từng thực hiện là
do distributed.net thực hiện lên hệ thống 64 bít RC5 vào năm 2002 (Theo định luật
Moore thì nó tương đương với việc tấn công vào hệ thống 66 bit hiện nay).
Một vấn đề khác nữa là cấu trúc toán học của AES. Không giống với các thuật
toán mã hóa khác, AES có mô tả toán học khá đơn giản. Tuy điều này chưa dẫn đến mối
nguy hiểm nào nhưng một số nhà nghiên cứu sợ rằng sẽ có người lợi dụng được cấu trúc
này trong tương lai.
Vào năm 2002, Nicolas Courtois và Josef Pieprzyk phát hiện một tấn công trên lý
thuyết gọi là tấn công XSL và chỉ ra điểm yếu tiềm tàng của AES. Tuy nhiên, một vài
chuyên gia về mật mã học khác cũng chỉ ra một số vấn đề trong cơ sở toán học của tấn
công này và cho rằng các tác giả đã có sai lầm trong tính toán. Việc tấn công dạng này có
thực sự trở thành hiện thực hay không vẫn còn để ngỏ và cho tới nay thì tấn công XSL
vẫn chỉ là suy đoán.

Phương pháp tấn công kênh bên (Side channel attacks)
Tấn công kênh bên không tấn công trực tiếp vào thuật toán mã hóa mà thay vào
đó, tấn công lên các hệ thống thực hiện thuật toán có sơ hở làm lộ dữ liệu.
Tháng 4 năm 2005, Daniel J. Bernstein công bố một tấn công lên hệ thống mã hóa AES
trong OpenSL gọi là. Một máy chủ được thiết kế để đưa ra tối đa thông tin về thời gian
có thể thu được và cuộc tấn công cần tới 200 triệu bản rõ lựa chọn. Một số người cho
rằng tấn công không thể thực hiện được trên Internet với khoảng cách vài điểm mạng.
Tháng 10 năm 2005, Adi Shamir và 2 nhà nghiên cứu khác có một bài nghiên cứu minh
họa một vài dạng khác. Trong đó, một tấn công có thể lấy được khóa AES với 800 lần ghi
8
trong 65 mili giây. Tấn công này yêu cầu kẻ tấn công có khả năng chạy chương trình trên
chính hệ thống thực hiện mã hóa.
4. Đánh giá thuật toán
Phương pháp Rijndael hay AES được đánh giá là có độ an toàn cao.
Hạn chế được các khóa yếu do sự khác nhau trong cấu trúc mã hóa, thông qua phép
XOR.
Thích hợp triển khai trên nhiều loại hệ thống khác nhau.
Tuy nhiên thời gian xử lý việc giải mã lớn hơn mã hóa, không tận dụng được toàn bộ
đoạn chương trình mã hóa
II. Phương pháp mã hóa DES
1. Giới thiệu thuật toán
DES (Data Encryption Standard) có tên chính thức là Federal Information
Processing Standard (FISP) (Tiêu chuẩn xử lý thông tin liên bang Hoa Kỳ), được công
nhận vào năm 1977 bởi Viện nghiên cứu quốc gia về chuẩn của Mỹ (NIST)
Nguyên bản DES đề ra giải pháp cho một khóa có chiều dài lên đến 128 bit. Tuy
nhiên, kích thước của khóa đã giảm xuống còn 56 bit bởi chính phủ Hoa Kỳ trong việc nỗ
lực tìm ra thuật toán nhanh hơn. Việc giảm chiều dài khóa xuống, phụ thuộc vào tốc độ
xử lý của bộ vi xử lý. Trong phương pháp tấn công Brute Force, các khóa sẽ phát sinh
ngẫu nhiên và được gửi đến đoạn văn bản nguyên mẫu cho tới khi xác định được từ khóa
chính xác. Với những khóa có kích thước nhỏ, sẽ dễ dàng phát sinh ra chính xác từ khóa

và phá vỡ hệ thống mật mã.
DES là hệ mã hóa khóa đối xứng hiện đại,mã hóa theo dạng khối. Xử lý thông tin
của bản rõ có độ dài xác định 64 bit. Trong khi đó độ dài khóa chỉ sử dụng 56 bit, với số
vòng lặp là 16 lần.
9
2. Mô tả thuật toán
• Nguyên lý:
- Sử dụng một khóa k tạo ra n khóa con k
1,
k
2, ,
k
n
- Hoán vị dữ liệu ban đầu
- Thực hiện n vòng lặp, ở mỗi vòng lặp
+ Dữ liệu được chia thành 2 phần
+ Áp dụng phép toán thay thế lên một phần, phần còn lại giữ nguyên
+ Sau đó, hoán vị 2 phần cho nhau
- Hoán vị dữ liệu bước cuối
Thuật toán xử lý với khóa là 56 bit = 7 bytes, 1 byte không được sử dụng mà chỉ để kiểm
tra tính chẵn lẻ. DES làm việc với khối dữ liệu 64 bít, sinh ra 16 khóa con và số vòng lặp
là 16.
Sơ đồ hoạt động như hình:
10
- Có 2 lần hoán vị đầu và cuối (IP & FP)
- Khối thông tin 64 bit trước khi vào chu trình và được chia làm 2 phần sau đó được
xử lý tuần tự thông qua hàm Feistel
- 56 bit khóa con cũng được chia làm 2 phần bằng nhau.
- Mỗi phần được xử lý độc lập và sau mỗi chu trình sẽ được dịch chuyển đi 1 hoặc 2
bit (dịch trái khi mã hóa, dịch phải khi giải mã)

- Khi giải mã các khóa con được thực hiện theo thứ tự ngược lại
• Giải thuật
- Tạo 16 khóa con:
C[0]D[0]=PC-1(KEY)
For i=1 to 16
11
C[i] = LeftShift[i](C[i-1])
D[i] = LeftShift[i](D[i-1])
K[i] = PC-2(C[i]D[i])
End for
- Mã hóa khối dữ liệu
L[0]R[0] = IP(plain block)
For i = 1 to 16
L[i] = R[i-1]
R[i] = L[i-1] XOR F(R[i-1], K[i])
End for
Cipher block = FP(R[16]L[16])
- Mã hóa khối dữ liệu
R[16]L[16] = IP(cipher block)
For i=1 to 16
R[i-1] = L[i]
L[i-1] = R[i] xor F(L[i], K[i])
End for
Plain block = FP(L[0]R[0])
3. Đánh giá thuật toán
Thuật toán mã hóa DES được đánh giá là kém an toàn vì khóa yếu, dễ bị bẻ khóa
trong chưa đầy 24h.
Hiện nay phương pháp này không còn được sử dụng nhiều, mà thường được thay thế
bằng phương pháp mã hóa 3DES.
12

III. Phương pháp mã hóa RC4
1. Giới thiệu thuật toán
RC4 được phát triển bởi Ron Rivest, thuật toán này sử dụng những từ khóa với
chiều dài có thể biến đổi lên đến 256 bytes. Vì chiều dài của khóa, RC4 được phân loại là
một cơ chế mã hóa mạnh. Nó cũng tương đối khá nhanh. RC4 tạo ra một dòng bytes ngẫu
nhiên và XOR chúng với văn bản nguyên mẫu. Bởi các byte được phát sinh ngẫu nhiên
RC4 đòi hỏi một khóa mới cho cho mỗi lần gửi thông tin ra ngoài.
Hệ thống mã hóa đồng bộ đưa ra hai vấn đề chính. Đầu tiên, bởi vì một khóa vừa
được dùng để mã hóa vừa được dùng để giải mã, nếu nó bắt đầu trở thành kẻ xâm nhập
thì tất cả những thông tin sử dụng khóa này sẽ bị hủy. Vì thế khóa nên thường xuyên thay
đổi theo định kỳ.
Một vấn đề khác là khi hệ thống mã hóa đồng bộ xử lý một lượng thông tin lớn,
việc quản lý các khóa sẽ trở thành một công việc vô cùng khó khăn. Kết hợp với việc
thiết lập các cặp khóa, phân phối và thay đổi theo định kỳ đều đòi hỏi thời gian và tiền
bạc.
Hệ thống mã hóa khóa đối xứng đã giải quyết vấn đề đó bằng việc đưa ra hệ thống mã
hóa đối xứng. Đồng thời, họ cũng tăng tính bảo mật trong suốt quá trình chuyển vận.
2. Mô tả thuật toán
RC4 thuộ nhóm mã dòng với độ dài khóa không cố định. Trong sơ đồ của RC4 có
sử dụng 2 thanh ghi 8 bits (bộ đếm) là Q1 và Q2 và một khối thay thế (S-block) có kích
thước 256 x 8 (256 phần tử, kích thước mỗi phần tử là 8 bits). Giá trị của khối S là một
hoán vị nào đó của các số từ 0 đến 255.
13
• Sinh Gamma
Thủ tục cơ bản nhất trong một hệ mã dòng bất kỳ là thủ tục sinh Gamma. Bởi khi đã
có được chuỗi gama rồi thì phép mã hóa chỉ là phép cộng từng bit (XOR) bản rõ với
chuỗi gama này. Ký hiệu S[i] là giá trị phần tử thứ i của khối S; γ là giá trị của kế tiếp
(cần được sinh) của chuỗi Gamma. Trong RC4, để sinh chuỗi Gamma thi mỗi khi xuất
hiện một xung cần thực hiện các thao tác sau đây:
1.Tăng Q

1
lên 1: Q
1
= (Q
1
+ 1) mod 256
2.Thay đổi giá trị của Q
2
: Q
2
= (Q
2
+ S[Q
1
]) mod 256
3.Hoán đổi giá trị của 2 phần tử: S[Q
1
] ↔ S[Q
2
]
4.Tính trổng T của 2 phần tử này: T = (S[Q
1
] + S[Q
2
]) mod 256
5.Gán giá trị cho γ: γ = S[T]
Trong quá trình sử dụng, bộ đếm Q
1
sẽ làm cho nội dung của khối S thay đổi chậm, còn
bộ đếm Q

2
sẽ đảm bảo sự thay đổi này là ngẫu nhiên
14
• Khởi tạo khối S
Ta đã nói rằng giá trị của khối S là một hoán vị nào đó của 256 số từ 0 255. Sau đây
là thuật toán để xác định hóan vị đó.
1. Gán cho mỗi phần tử giá trị bằng chỉ số của nó: S[i] = i; i=0 255
2. Tạo một mảng k gồm 256 phần tử, mỗi phần tử có kích thước 1 byte. Điền đầy
bảng k bằng các byte của khóa K: k[0]=K[0], k[1]=K[1], Trong trường hợp cần
thiết, khóa K đựoc dùng lặp lại.
3. Khởi tạo biến đếm j: j=0;
4. Xáo trộn khối S:
a. i = 0 255
b. j = (j + S[i] + k[i]) mod 256
c. Hóan đổi giá trị: S[i] ↔ S[j]
• Mã hóa và giải mã
Khi đã có được Gamma rồi thì việc mã hóa và giải mã là vô cùng đơn giản. Nhận xét
rằng Gamma được tạo ra theo từng khối 8 bits nên kích thước của mỗi ký tự (symbol)
trong alphabet mà chúng ta sẽ sử dụng là 8. Quá trình mã hóa được thực hiện như sau:
• Sinh một giá trị Gamma: γ
• Đọc một ký tự X
i
từ bản tin.
• Thực hiện phép XOR giữa X
i
và γ sẽ thu được một ký tự của bản mã Y
i
: Y
i
= X

i

γ
Do tính chất đối xứng của phép XOR, quá trình giải mã sẽ hòan tòan trùng với quá
trình mã hóa. Trong thủ tục mã hóa ở trên, cho đầu vào là bản mã thì đầu ra sẽ thu được
bản tin ban đầu.
3. Đánh giá thuật toán
• Thuật toán đơn giản. Ý nghĩa của từng bước rõ ràng, logic.
15
• RC4 tỏ ra an toàn đối với cả 2 phương pháp thám cơ bản là thám tuyến tính và
thám vi phân (chưa có công trình nào về thám RC4 được công bố) [2]. Số trạng
thái mà RC4 có thể có là 256!×256×256  2
1700
.
• Có thể thay đổi kích thước của alphabet. Trên đây ta xét trường hợp alphabet có
256 symbols (kích thước mỗi symbol là 8 bits). Ta hòan tòan có thể áp dụng thuật
toán RC4 cho alphabet với symbol 4 bits, 16 bits,
IV. Demo mã hóa âm thanh bằng phương pháp Rijndael
1. Cài đặt
1- Tạo khóa
Private Function CreateKey(ByVal strPassword As String) As Byte()
'Convert strPassword sang kiểu mảng char
Dim chrData() As Char = strPassword.ToCharArray
'Lấy độ dài của mảng
Dim intLength As Integer = chrData.GetUpperBound(0)
'tạo biến chứa kích thước mảng
Dim bytDataToHash(intLength) As Byte
For i As Integer = 0 To chrData.GetUpperBound(0)
bytDataToHash(i) = CByte(Asc(chrData(i)))
Next

Dim SHA512 As New System.Security.Cryptography.SHA512Managed
Dim bytResult As Byte() = SHA512.ComputeHash(bytDataToHash)
'Khai báo biến bytKey(31). Nó chứa 256 bits.
Dim bytKey(31) As Byte
'Gán giá trị cho bytKey bằng for
' chạy từ 0 đến 31 và gán 256 bits đầu tiên trong 512 bits
For i As Integer = 0 To 31
bytKey(i) = bytResult(i)
Next
Return bytKey 'Return the key.
End Function
2- Tạo Vector khởi tạo IV(Initial Vector)
Private Function CreateIV(ByVal strPassword As String) As Byte()
Dim chrData() As Char = strPassword.ToCharArray
Dim intLength As Integer = chrData.GetUpperBound(0)
Dim bytDataToHash(intLength) As Byte
16
For i As Integer = 0 To chrData.GetUpperBound(0)
bytDataToHash(i) = CByte(Asc(chrData(i)))
Next
Dim SHA512 As New System.Security.Cryptography.SHA512Managed
Dim bytResult As Byte() = SHA512.ComputeHash(bytDataToHash)
'Biến bytIV(15). Nó chứa 128 bits.
Dim bytIV(15) As Byte
' Để gán 128 bits kích thước trong bytResult
'256 bits đầu tiên chạy từ 0 đến 30 của password,
' 128 bits tiếp theo sẽ chạy từ 32 đến 47 trong bytIV
For i As Integer = 32 To 47
bytIV(i - 32) = bytResult(i)
Next

Return bytIV 'return the IV
End Function
3- Hàm mã hóa và giải mã
Sử dụng thuật toán Rijndael để mã hóa/ giải mã
Trong chương trình này sử dụng 256 bit khóa và 128 bit cho Vector khởi tạo
Private Sub EncryptOrDecryptFile(ByVal strInputFile As String, _
ByVal strOutputFile As String, _
ByVal bytKey() As Byte, _
ByVal bytIV() As Byte, _
ByVal Direction As CryptoAction)
Try
fsInput = New System.IO.FileStream(strInputFile,
FileMode.Open, FileAccess.Read)
fsOutput = New System.IO.FileStream(strOutputFile,
FileMode.OpenOrCreate, FileAccess.Write)
fsOutput.SetLength(0)
'Khởi tạo biến cho quá trình mã hóa/ giải mã
Dim bytBuffer(4096) As Byte
Dim lngBytesProcessed As Long = 0
Dim lngFileLength As Long = fsInput.Length
Dim intBytesInCurrentBlock As Integer
Dim csCryptoStream As CryptoStream
Dim cspRijndael As New
System.Security.Cryptography.RijndaelManaged
'Tạo thanh process bar để hiện thị quá trình xử lý file
pbStatus.Value = 0
pbStatus.Maximum = 100
Select Case Direction
Case CryptoAction.ActionEncrypt
17

csCryptoStream = New CryptoStream(fsOutput, _
cspRijndael.CreateEncryptor(bytKey, bytIV), _
CryptoStreamMode.Write)
Case CryptoAction.ActionDecrypt
csCryptoStream = New CryptoStream(fsOutput, _
cspRijndael.CreateDecryptor(bytKey, bytIV), _
CryptoStreamMode.Write)
End Select
While lngBytesProcessed < lngFileLength
'Đọc file
intBytesInCurrentBlock = fsInput.Read(bytBuffer, 0,
4096)
'Ghi ra file mã hóa
csCryptoStream.Write(bytBuffer,
0,intBytesInCurrentBlock)
'Cập nhật qá trình xử lý
lngBytesProcessed = lngBytesProcessed +
Lng(intBytesInCurrentBlock)
'Đưa giá trị vào thanh process bar
pbStatus.Value = CInt((lngBytesProcessed /
lngFileLength) * 100)
End While
'ĐÓng filestreame sau khi xử lý
csCryptoStream.Close()
fsInput.Close()
fsOutput.Close()
'Sau khi mã hóa thì xóa bản rõ đi
If Direction = CryptoAction.ActionEncrypt Then
Dim fileOriginal As New FileInfo(strFileToEncrypt)
fileOriginal.Delete()

End If
'Sau khi giải mã thì cũng xóa bản mã đi
If Direction = CryptoAction.ActionDecrypt Then
Dim fileEncrypted As New FileInfo(strFileToDecrypt)
fileEncrypted.Delete()
End If
'Thông báo khi mã hóa thành công
Dim Wrap As String = Chr(13) + Chr(10)
If Direction = CryptoAction.ActionEncrypt Then
MsgBox("Mã hóa thành công." + Wrap + Wrap + _
"Tổng số bytes xử lý = " + _
lngBytesProcessed.ToString, _
MsgBoxStyle.Information, "Mã Hóa")
'Cập nhật thanh process bar
pbStatus.Value = 0
18
txtFileToEncrypt.Text = "Chọn file để mã hóa."
txtPassEncrypt.Text = ""
txtConPassEncrypt.Text = ""
txtDestinationEncrypt.Text = ""
btnChangeEncrypt.Enabled = False
btnEncrypt.Enabled = False
Else
'Thông báo khi giải mã thành công
MsgBox("Giải mã thành công." + Wrap + Wrap + _
"Tổng số bytes xử lý = " + _
lngBytesProcessed.ToString, _
MsgBoxStyle.Information, "Giải Mã")
'Cập nhật thanh process bar
pbStatus.Value = 0

txtFileToDecrypt.Text = "Chọn file để giải mã."
txtPassDecrypt.Text = ""
txtConPassDecrypt.Text = ""
txtDestinationDecrypt.Text = ""
btnChangeDecrypt.Enabled = False
btnDecrypt.Enabled = False
End If
'Bắt lỗi khi sai đường dẫn file
Catch When Err.Number = 53
MsgBox("File không tìm thấy. Hãy kiểm tra lại đường dẫn hoặc
tên file", MsgBoxStyle.Exclamation, "Invalid Path or Filename")
'Bắt lỗi khác
Catch
fsInput.Close()
fsOutput.Close()
If Direction = CryptoAction.ActionDecrypt Then
Dim fileDelete As New
FileInfo(txtDestinationDecrypt.Text)
fileDelete.Delete()
pbStatus.Value = 0
txtPassDecrypt.Text = ""
txtConPassDecrypt.Text = ""
MsgBox("Password không đúng.", MsgBoxStyle.Exclamation,
"Invalid Password")
Else
Dim fileDelete As New
FileInfo(txtDestinationEncrypt.Text)
fileDelete.Delete()
pbStatus.Value = 0
txtPassEncrypt.Text = ""

19
txtConPassEncrypt.Text = ""
MsgBox("Mã hóa không thành công.", _
MsgBoxStyle.Exclamation, "Lỗi File")
End If
End Try
End Sub
2. Demo
20

×