ĐẠ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ữ
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
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.
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ã)
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
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
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
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()
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 = ""