1
HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG
Trần Thị Kim Thùy
NGHIÊN CỨU VỀ ỨNG DỤNG CHUẨN MẬT MÃ NÂNG CAO
(AES) TRONG XÂY DỰNG HÀM BĂM
Chuyên ngành: Kỹ thuật điện tử
Mã số: 60.52.70
TÓM TẮT LUẬN VĂN THẠC SĨ
HÀ NỘI - 2012
2
Luận văn được hoàn thành tại:
HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG
Người hướng dẫn khoa học: GS.TS.NGUYỄN BÌNH
Phản biện 1: …………………………………………………………
Phản biện 2: ………………………… ……………………………
Luận văn sẽ được bảo vệ trước Hội đồng chấm luận văn thạc sĩ tại Học
viện Công nghệ Bưu chính Viễn thông
Vào lúc: giờ ngày tháng năm
Có thể tìm hiểu luận văn tại:
- Thư viện của Học viện Công nghệ Bưu chính Viễn thông
3
MỞ ĐẦU
Với tốc độ và khả năng xử lý ngày càng được nâng cao của các bộ vi xử lý hiện
nay, phương pháp mã hóa chuẩn (DES - Data Encryption Standard) đã trở nên không
an toàn trong bảo mật thông tin. Do đó, Viện tiêu chuẩn và công nghệ Hoa kỳ (NIST
- National Institute Standards of Technology) đã quyết định chọn một chuẩn mã hóa
mới với độ an toàn cao nhằm phục vụ nhu cầu bảo mật thông tin liên lạc của Chính
phủ Hoa Kỳ cũng như trong các ứng dụng dân sự. Thuật toán Rijndael do Vincent
Rijmen và Joan Daeman đã được chính thức chọn trở thành chuẩn mã hóa nâng cao
(AES - Advanced Encryption Standard) từ ngày 02 tháng 10 năm 2000.
Ngày nay, ứng dụng của chuẩn mật mã nâng cao đang được sử dụng ngày càng
phổ biến trong các lĩnh vực khác nhau trên thế giới. Chuẩn mật mã nâng cao không
chỉ đơn thuần là mã hóa và giải mã thông tin mà còn bao gồm nhiều vấn đề khác
nhau cần được nghiên cứu và giải quyết như ứng dụng xây dựng các hàm băm phục
vụ việc chứng thực nguồn gốc nội dung thông tin (kỹ thuật chữ ký điện tử), xác thực
tính nguyên vẹn dữ liệu
Với sự phát triển ngày càng nhanh chóng của Internet và các ứng dụng giao
dịch điện tử trên mạng, nhu cầu bảo vệ thông tin trong các hệ thống và ứng dụng điện
tử ngày càng được quan tâm và có ý nghĩa hết sức quan trọng. Vì thế việc nghiên cứu
về chuẩn mật mã nâng cao và ứng dụng nó trong các lĩnh vực bảo mật thông tin là rất
cần thiết.
Ngoài phần mở đầu, kết luận và danh mục tài liệu tham khảo luận văn được kết
cấu thành 3 chương:
Chương 1: Sơ lược về chuẩn mật mã nâng cao (AES)
Chương 2: Hàm băm mật mã
Chương 3: Ứng dụng chuẩn mật mã nâng cao để xây dựng một vài hàm băm cụ
thể
Trong quá trình thực hiện Luận văn, do thời gian cũng như trình độ của tác giả
có những hạn chế nhất định nên không thể tránh khỏi những sai sót. Rất mong nhận
được sự góp ý của các thầy, cô giáo và các bạn để Luận văn hoàn thiện hơn. Tôi xin
chân thành cám ơn sự hướng dẫn, và giúp đỡ tận tình của GS.TS Nguyễn Bình, các
thầy trong khoa Quốc tế và Đào tạo sau đại học – Học viện Công nghệ Bưu chính
Viễn thông đã giúp đỡ tôi trong quá trình học tập cũng như trong quá trình làm Luận
văn.
4
CHƯƠNG 1: SƠ LƯỢC VỀ CHUẨN MẬT MÃ NÂNG CAO
1.1. Đặt vấn đề
Hiện nay với tốc độ và khả năng xử lý của các bộ vi xử lý ngày càng được
nâng cao, phương pháp mã hóa chuẩn DES, Tri DES đã trở nên không an toàn trong
bảo mật thông tin. Vì thế cần nghiên cứu chuẩn mật mã đáp ứng được nhu cầu bảo
mật thông tin, chuẩn mật mã nâng cao AES ra đời.
Sau khi thực hiện hai lần tuyển chọn công khai, có năm thuật toán được vào
vòng chung kết, gồm có: Mars, RC6, Serpent, Twofish và Rijndael. Các thuật toán
này đều đạt các yêu cầu của AES nên được gọi chung là các thuật toán ứng viên AES.
Các thuật toán ứng viên AES có độ an toàn cao, chi phí thực hiện thấp. Tuy nhiên với
thiết kế đẹp và đơn giản thuật toán Rijndael do hai nhà mật mã học người Bỉ thiết kế
đã được chọn là thuật toán của AES.
1.2. Cơ sở toán học của AES
AES sử dụng trường hữu hạn Galois (GF(2
8
) để thực hiện các phép toán: phép
cộng, phép trừ, phép nhân, và phép chia. Các phần tử của trường GF(2
8
) được xem
như là các đa thức.
1.3. Các thuật toán ứng viên AES
1.3.1. Thuật toán Marc
1.3.2. Thuật toán RC6
1.3.3. Thuật toán Rijndael
1.3.4. Thuật toán Serpent
1.3.5. Thuật toán TwoFish
1.3.6. Nhận xét các thuật toán ứng viên AES
Quy trình mã hóa gồm: khởi tạo, phân bố khóa và mã hóa.
Quy trình giải mã gồm: khởi tạo, phân bố khóa và giải mã.
Phân bố khóa được thực hiện dựa trên khóa người sử dụng cung cấp để phát sinh
bộ subkey phục vụ cho việc mã hóa và giải mã.
Dữ liệu vào và ra trong quy trình mã hóa, giải mã là khối dữ liệu 128 bit.
1.4. Mô tả AES theo Rijndael
1.4.1. Đầu vào và đầu ra của phép mã và giải mã
AES là một trường hợp riêng của Rijndael. AES có độ dài khối bằng 128 bit và
hỗ trợ các độ dài khóa bằng 128, 192, hay 256 bit. Đầu vào và đầu ra của Rijndael
được xem như là mảng một chiều của các byte 8bit. Đối với phép mã, đầu vào là khối
rõ và khóa, đầu ra là bản mã. Đối với phép giải mã, đầu vào là khối mã và khóa, đầu
5
ra là khối rõ. Biến đổi vòng của Rijndael và các bước của nó, thao tác trên một kết
quả trung gian, được gọi là trạng thái. Trạng thái có thể được vẽ như là một mảng chữ
nhật các byte với 4 dòng. Số các cột trong trạng thái được ký hiệu bởi N
b
và bằng độ
dài khối chia cho 32 (đối với AES thì N
b
bằng 4).
1.4.2. Cấu trúc AES
Rijndael là một mã khối khóa - lặp: nó bao gồm việc áp dụng lặp một ánh xạ
vòng trên trạng thái. Số các vòng được ký hiệu bởi N
r
và phụ thuộc vào độ dài khối
và độ dài khóa. Hình vẽ 1.8 trên minh họa cấu trúc cơ sở của thuật toán AES.
Hình 1.8: Cấu trúc cơ sở của thuật toán AES
Tầng phi tuyến: Áp dụng song song của các S - box mà có các tính chất phi tuyến
trong trường hợp tồi nhất tối ưu.
Tầng trộn tuyến tính: Đảm bảo khuyếch tán cao qua nhiều vòng
Tầng cộng khóa: Là phép XOR từng bit của Round key và trạng thái trung gian.
Trong thực tế, tầng trộn tuyến tính của Rijndael lại bao gồm hai tầng con, đó là
ShiftRows và MixColumns
1.4.3. Quy trình mã hóa và giải mã
Quy trình mã hóa và giải mã AES sử dụng một hàm lặp là kết hợp của bốn hàm
biến đổi (đơn vị xử lý là byte) sau: 1) biến đổi thay thế byte sử dụng một bảng thế (S-
box), 2) dịch các hàng của mảng trạng thái với số lần dịch của mỗi hàng là khác nhau,
3) kết hợp dữ liệu của mỗi cột trong mảng trạng thái và 4) cộng một khóa RoundKey
vào trạng thái. Giải mã AES bằng cách thực hiện biến đổi ngược của các biến đổi ở
6
phép mã hóa AES hoặc bằng cách biến đổi tương đương. Các biến đổi này được minh
họa bằng hình vẽ 1.10 dưới đây:
Hình 1.10. Quy trình mã hóa và giải mã AES
1.4.3.1. Quy trình mã hóa
Toàn bộ của phép mã hóa có thể mô tả như sau:
(1) S = AddRoundKey (P,W
0
)
(2) For i = 1 to N
r
-1
S = SubBytes (S)
S = ShiftRows (S)
S = MixColumns (S)
S = AddRoundKey (S, W)
(3) S = SubBytes (S), S = ShiftRows (S)
(4) C = AddRoundKey (SubBytes, W
Nr
)
1.4.3.2. Giải mã Rijndael
Giải mã Rijndael có 2 cách giải mã đó là: giải mã trực tiếp và giải mã bằng
thuật toán giải mã tương đương.
7
Giải mã trực tiếp: Mọi biến đổi được dùng trong các phép tính mã hóa là khả
nghịch. Cài đặt phép tính giải mã là giữ nguyên các thứ tự các biến đổi đã dùng trong
phép mã hóa, chỉ thay các phép biến đổi bằng các biến đổi ngược của chúng.
Giải mã tương đương: được thực hiện bằng cách đảo ngược thứ tự của hàm
SubByte
-1
() và ShiftRows
-1
(), thay đổi thứ tự của AddRoundKey(), MixColumns
-1
()
trong các lần lặp sau khi thay đổi khóa cho giá trị Round = 1 to N
r-1
bằng cách sử
dụng biến đổi MixColumns(). Các word đầu tiên và cuối cùng của danh sách khóa
không bị thay đổi khi ta áp dụng phương pháp này.
1.4.3.2.Các phép biến đổi trong mã hóa và giải mã AES
a) Biến đổi SubBytes()
Biến đổi SubBytes() thay thế mỗi byte riêng rẽ của state s
r,c
bằng một giá trị
mới s
’
r,c
sử dụng bảng thay thế (S - box), nó là bảng có ngược. Hình 1.13 chỉ ra ảnh
hưởng của biến đổi SubBytes() trên state
Hình 1. 13. SubBytes() áp dụng S - box cho mỗi byte của state
S - box dùng trong biến đổi SubBytes() được trình bày ở dạng cơ số 16 như
bảng 3.1 sau:
b) Biến đổi ShiftRows(): Hình 1.14 chỉ ra biến đổi ShiftRows().
Hình 1.14. Dịch vòng ShiftRows() ba hàng cuối cùng trong state
8
Trong biến đổi ShiftRows(), các byte trong ba hàng cuối cùng của trạng thái
được dịch vòng đi các số byte khác nhau (độ lệch) . Cụ thể, biến đổi ShiftRows(), xử
lý như sau:
s’
rc
= s
r(c+r)
mod 4, với 0<r<4 và 0
c<4 (trong đó r là số hàng)
Biến đổi này có tác dụng dịch chuyển các byte sang bên trái, trong khi đó các
byte bên trái nhất được chuyển vòng về các vị trí bên phải nhất của hàng.
Bảng 1.1. S - box được dùng trong biến đổi SubBytes ()
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
00 63 7c 77 7b f2 6b 6f c5 30 01 67 2b fe d7 ad 76
10 ca 82 c9 7d fa 59 47 f0 ad d4 a2 af 9c a4 72 c0
20 b7 fd 93 26 36 3f f7 cc 34 a5 e5 f1 71 d8 31 15
30 04 c7 23 c3 18 96 05 9a 07 12 80 e2 eb 27 b2 75
40 09 83 2c 1a 1b 6e 5a a0 52 3b d6 b3 29 e3 2f 84
50 53 d1 00 ed 20 fc b1 5b 6a cb be 39 4a 4c 58 cf
60 d0 ef aa fb 43 4d 33 85 45 f9 02 7f 50 3c 9f a8
70 51 a3 40 8f 92 9d 38 f5 bc b6 da 21 10 ff f3 d2
80 cd 0c 13 ec 5f 97 44 17 c4 a7 7e 3d 64 5d 19 73
90 60 81 4f dc 22 2a 90 88 46 ee b8 14 de 5e 0b db
a0 0e 32 3a 0a 49 06 24 5c c2 d3 ac 62 91 95 e4 79
b0 e7 c8 37 6d 8d d5 4e a9 6c 56 f4 ea 65 7a ae 08
c0 ba 78 25 2e 1c a6 b4 c6 e8 dd 74 1f 4b bd 8b 8a
d0 70 3e b5 66 48 03 f6 0e 61 35 57 b9 86 c1 1d 9e
e0 e1 f8 98 11 69 d9 8e 94 9b 1e 87 e9 ce 55 28 df
f0 8c a1 89 0d bf e6 42 68 41 99 ad 0f b0 54 bb 16
c. Biến đổi MixColumns()
Biến đổi MixColumns() tính toán trên từng cột của state. Biến đổi này có thể
được trình bày như phép nhân một ma trận, mà mỗi byte được hiểu như là một phần
tử trong trường GF(2
8
):
c
s
c
s
c
s
c
s
c
s
c
s
c
s
c
s
xsxaxs
,3
,2
,1
,0
02010103
03020101
01030201
01010302
,3
'
,2
'
,1
'
0
'
:)()()('
với
40
c
Vì kết quả của phép nhân này, bốn byte trong một cột được thay thế như sau:
9
)
,3
}02({
,2,1
)
,0
}03({
,3
'
)
,3
}03({)
,2
}02({
,1,0,2
'
,3
)
,2
}03({)
,1
}02({
,0,1
'
,3,2
)
,1
}03({)
,0
}02({
,0
'
c
s
c
s
c
s
c
s
c
s
c
s
c
s
c
s
c
s
c
s
c
s
c
s
c
s
c
s
c
s
c
s
c
s
c
s
c
s
c
s
Phép
trong biểu thức này ký hiệu phép cộng trong GF(2
8
), mà tương ứng
với phép XOR từng bit. Các phép nhân được thực hiện theo modulo với đa thức bất
khả quy của trường. Với thuật toán AES đa thức này là x
8
+ x
4
+ x
3
+ x+1. Hình 1.16
chỉ ra biến đổi MixColumns ()
Hình 1.16. MixColumns() tính toán trên từng cột của state
d. Biến đổi Addroundkey()
Trong biến đổi Addroundkey(), một khóa vòng được cộng với state bằng một
phép XOR theo từng bit đơn giản. Mỗi khóa vòng gồm có 4 từ (128 bit) được lấy từ
lược đồ khóa. 4 từ đó được cộng vào mỗi cột của state, sao cho:
cicccccccc
wssssssss
4(,3,2,1,0,3,2,1,0
',',','',',','
với 0
c
<4.
Trong đó
)4( ci
w
là các từ thứ c của khóa vòng thứ i
)34(
,
)24(
,
)14(
,
)4(
i
w
i
w
i
w
i
w
i
W
của lịch trình khóa và i là một giá trị nằm trong khoảng 0
i
N
r
. Trong phép mã hóa,
phép cộng khóa vòng khởi đầu thực hiện với i = 0, trước khi áp dụng đầu tiên của
hàm vòng. Việc áp dụng biến đổi Addroundkey() vào N
r
vòng của phép mã hóa xày ra
khi 1
i
N
r.
Các phép biến đổi SubBytes
-1
(), ShiftRows
-1
(), MixColumns
-1
() trong giải mã
AES là các phép biến đổi ngược của SubBytes(), ShiftRows(), MixColumns().
1.4.4. Biến đổi vòng và số các vòng
Biến đổi vòng của Rijndael và các bước của nó, thao tác trên một kết quả trung
gian, được gọi là trạng thái. Trạng thái có thể được vẽ như là một mảng chữ nhật các
10
byte với 4 dòng. Số các cột trong trạng thái ký hiệu bởi N
b
và bằng độ dài khối chia
cho 32 (đối với AES thì N
b
bằng 4).
Số vòng biến đổi, ký hiệu là N
r
theo công thức: N
r
= max {N
b
, N
k
} + 6
Biến đổi vòng được ký hiệu là Round và là một dãy của 4 phép biến đổi
AddRoundKey, SubBytes, ShiftRows, MixColumns chúng được gọi là các bước
(Steps). Vòng cuối cùng của phép mã có khác đi một chút, nó không có phép
MixColumns.
1.4.5. Lịch trình khóa
Lịch trình khóa bao gồm 2 thành phần: mở rộng khóa (Key Expansion) và
chọn khóa vòng (Round Key Selection). Mở rộng khóa chỉ ra các ExpandedKey
nhận được từ khóa mã. Nguyên tắc chính như sau:
- Tổng số các bit trong ExpandedKey bằng độ dài khối nhân với số các vòng cộng
thêm một, (ví dụ độ dài khóa là 128 bit và 10 vòng lặp thì khóa kéo dài có 1408 bit).
- Cipher Key được kéo dài thành ExpandedKey
- Chú ý rằng ExpandedKey luôn nhận được từ khóa mã, nó không bao giờ chỉ ra một
cách trực tiếp: Round Key đầu tiên bao gồm N
b
từ đầu tiên, Round Key thứ hai bao
gồm N
b
từ tiếp theo, và tương tự đối với Round Key thứ ba…
Việc kéo dài khóa đã được chọn phải theo tiêu chuẩn về tính hiệu quả, loại bỏ
tính đối xứng, khuếch tán, phi tuyến. Ngoài ra còn một vài tiêu chuẩn khác cho lịch
trình khóa như sau:
- Nó sử dụng một biến đổi có ngược, tức là việc biết bất kỳ N
k
từ liên kết của
ExpandedKey sẽ cho phép tạo lại toàn bộ bảng.
- Việc biết một phần các bit của Cipher Key hoặc Roundkey sẽ không cho phép
tính được nhiều bit Roundkeys khác.
- Chống lại được các tấn công trong đó một phần Cipher Keys là được biết bởi kẻ
mã thám.
- Các tấn công mà Cipher Keys là được biết hoặc có thể được chọn, ví dụ như khi
mã pháp được sử dụng như hàm nén (hàm vòng) của hàm băm.
Để có tính hiệu quả đối với các bộ xử lý 8 bit, lược đồ kéo dài đơn giản, định
hướng byte đã được chấp nhận. Việc áp dụng phép thế S
RD
phi tuyến đảm bảo tính
phi tuyến của lược đồ, không cần phải thêm nhiều các yêu cầu lưu trữ tạm thời trên
bộ xử lý 8 bit.
Thuật toán AES lấy khóa mã K và thực hiện một thủ tục mở rộng khóa để tạo
ra một lược đồ khóa. Việc mở rộng khóa tạo ra tổng số 4(N
r
+1) từ, thuật toán yêu cầu
một tập 4 từ khởi đầu, và mỗi vòng trong N
r
vòng yêu cầu 4 từ dữ liệu khóa. Lược đồ
11
khóa kết quả gồm một mảng tuyến tính của các từ 4 byte, được ký hiệu là w
j
, với j
nằm trong khoảng 0
j
4(N
r
+1)
1.4.6. Kéo dài khóa
Trong khi kéo dài khóa, khóa mã được kéo dài thành mảng khóa kéo dài, bao
gồm 4 dòng và N
b
(N
r
+ 1) cột. Mảng này được ký hiệu bởi W[4][N
b
(N
r
+1)]. Hàm
kéo dài khóa phụ thuộc vào giá trị của N
k
: Có một phiên bản cho N
k
bằng hoặc nhỏ
hơn 6, và một phiên bản cho N
k
lớn hơn 6.
1.5. Phạm vi, ý nghĩa và ứng dụng của AES
1.5.1. Phạm vi và ý nghĩa của AES
Phạm vi chính thức của một chuẩn FIPS là tương đối hạn chế: FIPS chỉ áp dụng
cho hành chính liên bang. Hơn thế nữa, AES mới chỉ được sử dụng cho các tài liệu
chứa thông tin nhạy cảm nhưng không mật. AES từ khi được chấp nhận đã được sử
dụng như một chuẩn mật mã ngầm định trên toàn thế giới. Việc chấp nhận Rijndael
như một chuẩn chính phủ đã đem đến cho nó một bố sự chứng thực về chất lượng
Các nhân tố chính làm cho sự chấp nhận nhanh chóng đối với Rijndael là sự
kiện nó không có bản quyền, nó có thể được cài đặt một cách dễ dàng
1.5.2. Ưu, nhược điểm của AES
1.5.2.1. Ưu điểm
+) AES đã được chính phủ Hoa kỳ tuyến bố là có độ an toàn cao, và đã được sử dụng
thông tin mật;
+) AES có mô tả toán học đơn giản;
+) Cấu trúc rõ ràng đơn giản.
1.5.2.2. Nhược điểm
+) AES không đủ an toàn đối với dạng tấn (side channel attack]).
+) Cấu trúc toán học của 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.
1.5.3. Ứng dụng của AES
+) Hiện nay, AES được sử dụng phổ biến trên toàn thế giới để bảo vệ dữ liệu ở các tổ
chức ngân hàng, tài chính, chính phủ, thương mại điện tử, chữ ký điện tử;…
+) Mã hóa AES được ứng dụng nhanh đối với cả phần cứng và phần mềm, và chỉ yêu
cầu một không gian lưu trữ nhỏ, lý tưởng để sử dụng cho việc mã hóa những thiết bị
cầm tay nhỏ như ổ USB flash, ổ đĩa CD;…
+) Sử dụng như một hàm băm;
+) Xây dựng các hàm băm. Hàm băm Whilrpool là một ví dụ điển hình.
1.6. Kết luận chương 1
12
CHƯƠNG 2: HÀM BĂM MẬT MÃ
2.1. Đặt vấn đề
2.2. Khái niệm, tính chất cơ bản, phân loại hàm băm mật mã
2.2.1. Khái niệm
Hàm băm mật mã là hàm toán học chuyển đổi một thông điệp có độ dài bất kỳ
thành một dãy bit có độ dài cố định (tùy thuộc vào thuật toán băm). Dãy bit này được
gọi là thông điệp rút gọn (message digest) hay giá trị băm (hash value), đại diện cho
thông điệp ban đầu. Các hàm băm đóng vai trò cơ bản trong mật mã hiện đại.
2.2.2. Tính chất cơ bản của hàm băm mật mã
c. Tính khó va chạm.
b. Khó tìm nghịch ảnh thứ hai
c. Tính khó tính toán nghịch ảnh
2.2.3. Phân loại hàm băm mật mã
Hình 2.1: Sơ đồ phân loại hàm băm
2.2.3.1.Hàm băm mật mã có khóa
Hàm băm mật mã có khóa là hàm băm có dữ liệu đầu vào ngoài thông điệp ra
còn có thông điệp khác là một khóa bí mật, nếu không có khóa bí mật này thì không
thể băm thông điệp đầu vào theo đúng yêu cầu. Các hàm băm có khoá được sử dụng
để xác thực thông báo và thường được gọi là các thuật toán tạo mã xác thực thông
báo (MAC).
2.2.3.2 Hàm băm mật mã không khóa (các hàm băm dựa trên mật mã khối)
Hàm băm không khóa là hàm băm có dữ liệu đầu vào chỉ là thông điệp, không
chứa khóa. Hàm băm không khóa có một số tính chất như sau:
a. Tính khó tính toán nghịch ảnh
b. Khó tìm nghịch ảnh thứ hai
c. Tính khó va chạm
Hàm băm
Không có khóa
Có khóa
MDC
Các ứng dụng khác
Các ứng dụng khác
MAC
OWHF
CRHF
13
Hàm băm không khóa bao gồm các lớp con MDC. Các MDC được sử dụng để
tạo ra ảnh đặc trưng của thông điệp, đảm bảo sự toàn vẹn của dữ liệu. Bản thân MDC
lại được chia thành hai lớp hàm sau:
+) Hàm băm một chiều (OWHF - One Way Hash Function) có nghĩa là với một mã
băm biết trước, khó có thể tính toán để tìm ra thông điệp đầu vào có mã băm bằng với
mã băm đã cho. Hàm băm một chiều thoả mãn tính chất:
- Khó tìm nghịch ảnh
- Khó tìm nghịch ảnh thứ hai
+) Hàm băm khó va chạm (CRHF - Collision Resistant Hash Function) có nghĩa là
khó có thể tính toán để tìm ra hai thông điệp khác nhau và có cùng giá trị mã băm.
Hàm băm khó va chạm ngoài hai tính chất cơ bản còn thoả mãn các tính chất sau:
- Khó tìm nghịch ảnh thứ hai
- Khó và chạm
Mã phát hiện sự sửa đổi MDC được chia thành MDC độ dài đơn và MDC độ dài kép.
2.3. Giới thiệu cấu trúc, vai trò hàm băm mật mã
2.3.1. Cấu trúc của hàm băm mật mã
Thành phần chính của một hàm băm là một hàm nén và các hàm biến đổi khác.
Hàm nén được thực thi nhiều lần để băm thông điệp ban đầu của hàm băm thành một
chuỗi có chiều dài cố định. Các hàm biến đổi khác (có thể có hoặc không) nhận vào
chuỗi bít sau lần cuối cùng thực thi hàm nén và cho kết quả chính là mã băm cuối
cùng của hàm băm. Hình 2.3 dưới đây là cấu trúc tổng quát của hàm băm.
Hình 2.3: Cấu trúc tổng quát của hàm băm.
Có rất nhiều thuật toán hàm băm cho đến nay sử dụng chung một cấu trúc cơ
bản. Cụ thể, một hàm băm thường gồm các bước như sau:
Bước 1: Phân chia thông điệp đầu vào chiều dài hữu hạn thành các khối thông điệp
con liên tiếp có chiều dài cố định r (giả sử là m
1
, m
2
,
,
m
3
,,
m
k
)
14
Bước 2: Do m có độ dài bất kỳ nên luôn có một bước thêm các bit phụ sao cho chiều
dài chuỗi mới m
’
chia hết cho r. (trong các bit thêm thường thêm 64 bit để lưu lại
chiều dài ban đầu của chuỗi trước khi chèn).
Bước 3: Đưa khối thông điệp con m
1
, m
2
,
,
m
3
,…,
m
k
sẽ lần lượt đi qua một hàm nén f
của hàm băm h(m).
Bước 4: Kết quả của khối thứ m
i-1
sau khi đi qua hàm nén f sẽ là nguồn dữ liệu đầu
vào cho bước thứ i tiếp theo.
2.3.2. Ứng dụng của hàm băm mật mã
a. Vai trò của hàm băm trong toàn vẹn của dữ liệu
b. Vai trò của hàm băm trong chứng nhận nguồn gốc dữ liệu
c. Vai trò của hàm băm trong xác thực tính nguyên vẹn dữ liệu
2.4. Một số hàm băm mật mã thông dụng
2.4.1. Hàm băm MD4
Hàm MD4 (Message Digest Algorithm 4): Là một hàm băm 128 bit được thiết
kế bởi Ronald Rivest vào năm 1990. Mục tiêu thiết kế của MD4 là để tìm được hai
thông điệp có cùng mã băm thì cần khoảng 2
64
phép toán, và để tìm được tiền ảnh của
một mã băm thì cần khoảng 2
128
phép toán. Nhưng đến nay mục tiêu đó đã bị thất bại.
Xung đột của MD4 có thể tìm thấy với khoảng 2
20
phép toán.
2.4.2. Hàm băm MD5
a) Đặc điểm
Hàm MD5 là một hàm băm độ dài 128 bit. Nó là hàm băm cải tiến của MD4.
Đầu vào là những khối 512 bit, được chia cho 16 khối con 32 bit. Đầu ra của thuật
toán là một thiết lập của 4 khối 32 bit để tạo thành một hàm băm 128 bit duy nhất.
Bước 1: Chia thông điệp đầu vào thành những khối 512 bit, được chia thành 16 khối
con 32 bit, với khối cuối cùng (đặt là x và x < 512 bit) của bức điện, chúng ta cộng
thêm một bit 1 vào cuối của x, theo sau đó là các bit 0 để được độ dài cần thiết (512
bit). Kết quả là bức điện vào là một chuỗi M có độ dài chia hết cho 512, vì vậy ta có
thể chia M ra thành các N word 32 bit (N word này sẽ chia hết cho 16).
Bước 2: Tìm cốt của bức điện với 4 khối 32 bit A, B, C, D (được xem như thanh ghi).
Người ta thường gọi A, B, C, D là các chuỗi biến số:
A = 0x01234567
B = 0x89abcdef
C = 0xfedcba98
D = 0x76543210.
15
Thông điệp đầu vào được chia thành 16 khối 32 bit đi vào bốn vòng lặp của
MD5. Giả sử ta đặt a, b, c, d thay cho A, B, C, D đối với khối 512 bit đầu tiên của
bức điện. Bốn vòng lặp trong MD5 đều có cấu trúc giống nhau. Mỗi vòng thực hiện
16 lần biến đổi: thực hiện với một hàm phi tuyến của 3 trong 4 giá trị a, b, c, d, sau đó
nó cộng kết quả đến giá trị thứ 4, tiếp đó cộng với một khối con 32 bit và một hằng
số. Sau đó, nó dịch trái một lượng bit thay đổi và cộng kết quả vào một trong 4 giá trị
a, b, c, d. Kết quả cuối cùng là một giá trị mới được thay thế một trong 4 giá trị a, b,
c, d. Tương tự đối với các khối 512 bit tiếp theo của bức điện sẽ được thực hiện qua 4
vòng lặp và thực hiện các phép biến đổi ở trong 4 vòng lặp đó để tìm cốt của bức điện
với 4 khối 32 bit A, B, C,D.
Hình 2.8: Sơ đồ vòng lặp chính của MD5
b. Nhận xét về MD5
Về tốc độ sinh ra chuỗi cốt yếu thì MD5 chậm hơn so với MD4 nhưng nó lại an
toàn hơn rất nhiều so với MD4. Thuật toán số hóa thông điệp MD5 khá đơn
giản để thực hiện, cung cấp một giá trị băm của thông điệp với độ dài tùy ý.
Người ta cho rằng độ khó để tìm được 2 thông điệp có cùng giá trị băm là khoảng
2
64
bước tính, và độ khó để tìm được một thông điệp với giá trị băm cho trước
là 2
128
bước tính. Tuy nhiên lỗ hổng mới phát hiện trong thuật toán MD5 sẽ cho
phép kẻ tấn công có thể tạo ra file giả mạo trong vòng vài giờ với loại máy tính đạt
chuẩn. Hàm băm MD5 với độ dài băm nhỏ là 128 bit độ dài này sẽ không đủ an toàn
đối với một số tấn công đặc biệt là tấn công ngày sinh nhật.
2.4.3. Họ hàm băm SHA
a) Đặc điểm
Thuật toán SHA là thuật toán băm mật được phát triển bởi cục an ninh quốc
gia Mỹ (NSA: National Security Agency) và được xuất bản thành chuẩn của chính
phủ Mỹ bởi viện công nghệ và chuẩn quốc gia Mỹ (NIST: National Institute of
Standards and Technology). Họ hàm băm SHA bao gồm 5 thuật toán băm an toàn là:
16
SHA - 1, SHA - 224, SHA - 256, SHA - 384 và SHA - 512. Bốn thuật giải sau
thường được gọi chung là SHA - 2. Bảng 2.1 dưới đây thể hiện các tính chất cơ bản
của bốn thuật toán băm an toàn.
Bảng 2.1: Các tính chất cơ bản của bốn thuật toán băm an toàn
Kích thước (đơn vị: bit)
Thuật toán
Thông điệp
Khối Từ
Thông điệp
rút gọn
Độ an toàn
(đơn vị: bit)
SHA-1 <2
64
512 32 160 80
SHA-224 <2
64
512 32 224 112
SHA-256 <2
64
512 32 256 128
SHA-384 <2
128
1024 64 384 192
SHA-512 <2
128
1024 64 512 256
Các bước thực hiện hàm băm SHA gồm: tiền xử lý và tính toán giá trị băm
Bước 1: Tiền xử lý bao gồm các thao tát:
Mở rộng thông điệp
Phân tích thông điệp đã mở rộng thành các khối m bit
Khởi tạo giá trị băm ban đầu
Bước 2: Tính toán giá trị băm
Làm N lần các công việc sau:
Tạo bảng phân bố thông điệp từ khối thứ i
Dùng bảng phân bố thông điệp cùng với các hàm, các hằng số các thao tác trên
word để tạo ra giá trị băm i
Sử dụng thông điệp băm cuối cùng để tạo thông điệp rút gọn
a. Mở rộng thông điệp
Thông điệp M được mở rộng trước khi thực hiện băm. Mục đích của việc mở
rộng này là để đảm bảo thông điệp mở rộng có độ dài là bội số của 512 hoặc 1024 bit
tùy thuộc vào thuật toán.
Đối với SHA - 1, SHA - 224 và SHA - 256:
Giả sử độ dài của thông điệp M là l bit. Thêm bit 1 vào cuối thông điệp, theo
sau là k bit 0 (k là số không âm nhỏ nhất sao cho l + 1 + k = 448(mod 512). Sau đó
thêm khối 64 bit là biểu diễn nhị phân của l.
Đối với SHA - 384 và SHA - 512:
Giả sử độ dài của thông điệp M là l bit. Thêm bit 1 vào cuối thông điệp, theo
sau là k bit 0 (k là số không âm nhỏ nhất sao cho l + 1 + k = 896(mod 1024) sau đó
thêm khối 128 bit là biểu diễn nhị phân của l.
17
b. Phân tích thông điệp đã mở rộng
Sau khi thông điệp đã được mở rộng, thông điệp cần được phân tích thành N
khối m bit trước khi thực hiện băm.
Đối với thông điệp SHA - 1, SHA - 256, thông điệp mở rộng được phân tách
thành N khối 512 bit M
(1)
, M
(2)
…, M
(N)
do đó 512 bit của khối dữ liệu đầu vào có thể
được thể hiện bằng 16 từ 32 bit, M
0
(i)
chứa 32 bit đầu của khối thông điệp i, M
1
(i)
chứa
32 bit đầu của khối thông điệp tiếp…
Đối với thông điệp SHA - 384, SHA - 512, thông điệp mở rộng được phân tách
thành N khối 1024 bit M
(1)
, M
(2)
…, M
(N)
do đó 1024 bit của khối dữ liệu đầu vào có
thể được thể hiện bằng 16 từ 64 bit, M
0
(i)
chứa 64 bit đầu của khối thông điệp i, M
1
(i)
chứa 64 bit đầu của khối thông điệp tiếp…
c. Khởi tạo giá trị băm
Giá trị băm là một chuỗi bit có giá trị bằng message digest (trừ SHA 384) gồm
các words ghép lại. Trong đó H
i
(j)
là word j trong giá trị băm ở lần lặp i với 0
j
số
word trong giá trị băm - 1. Trước khi thực hiện băm, với mỗi thuật toán băm an toàn,
giá trị băm ban đầu H
(0)
phải được thiết lập. Kích thước và số lượng từ trong H
(0)
tùy
thuộc vào kích thước thông điệp rút gọn.
d. Thuật toán của các bước tính toán giá trị băm: trong khuôn khổ của luận văn chỉ
trình bày về SHA - 512 bit.
SHA - 512 được sử dụng để băm thông điệp M dài l bit 0
l
<2
128
. Thuật toán
sử dụng:
Một bảng phân bố gồm 80 từ 64 bit
8 biến 64 bit
Một giá trị băm gồm 8 từ 64 bit
Kết quả của SHA - 512 là thông điệp rút gọn 512 bit.
b. Nhận xét về họ hàm băm SHA
+) Ưu điểm: SHA là họ hàm băm được coi là an toàn bởi:
Thứ nhất: Cho một giá trị băm nhất định được tạo nên bởi một trong những thuật giải
SHA, việc tìm lại được đoạn dữ liệu gốc là không khả thi.
Thứ hai: Việc tìm được hai đoạn dữ liệu nhất định có cùng kết quả băm tạo ra bởi
một trong những thuật giải SHA là không khả thi. Bất cứ thay đổi nào trên đoạn dữ
liệu gốc, dù nhỏ, cũng sẽ tạo nên một giá trị băm hoàn toàn khác với xác suất rất cao.
SHA - 1 được sử dụng rộng rãi trong nhiều ứng dụng và giao thức an ninh khác nhau.
SHA - 1 được coi là thuật giải thay thế cho MD5, một thuật giải băm 128 bit khác
18
+) Nhược điểm: Hiện nay, SHA-1 không còn được coi là an toàn bởi đầu năm 2005,
ba nhà mật mã học người Trung Quốc đã phát triển thành công một thuật toándùng để
tìm được hai đoạn dữ liệu nhất định có cùng kết quả băm tạo ra bởi SHA-1. Mặc dù
chưa có ai làm được điều tương tự với SHA-2, nhưng vì về thuật toán, SHA-2 không
khác biệt mấy so với SHA-1 nên nhiều nhà khoa học đã bắt đầu phát triển một thuật
toán khác tốt hơn SHA. NIST cũng đã khởi đầu một cuộc thi phát triển thuật toán
băm mới an toàn hơn SHA, giống như quy trình phát triển chuẩn mã hóa nâng cao
AES.
2.4.4. Hàm băm xây dựng dựa trên thuật toán Rijndael mở rộng
2.4.4.1. Lý do chọn xây dựng hàm băm dựa trên dựa trên AES sử dụng thuật
toán Rijndael mở rộng
Một trong những ứng dụng của hàm băm là biến đổi chuỗi mật khẩu có độ dài
bất kỳ của người dùng thành mảng các byte có kích thước cố định để sử dụng làm
khóa đối xứng. Đối với các thuật toán mở rộng dựa trên thuật toán Rijndael, bao gồm
thuật toán mở rộng 256/384/512 - bit và thuật toán mở rộng 512/768/1024 - bit,
chúng ta cần sử dụng mã khóa có kích thước là 256 bit, 384 bit, 512 bit, 768 bit hoặc
1024 bit. Nếu sử dụng các hàm băm thông thường (như nhóm các hàm băm SHA
hoặc AES - Hash) thì chưa đáp ứng được tất cả các trường hợp kích thước mã khóa
của các thuật toán mở rộng này. Việc ghép nối hay biến đổi giá trị băm của các hàm
băm thông thường để kéo dài chuỗi bit nhận được ra đủ độ dài đòi hỏi của khóa
không phải là giải pháp tối ưu. Do đó, giải pháp được đề nghị là sử dụng chính các
thuật toán mở rộng để xây dựng các hàm băm có không gian giá trị băm rộng hơn,
đồng thời có khả năng phục vụ cho việc tạo khóa cho chính các thuật toán này từ
chuỗi mật khẩu của người dùng.
2.4.4.2. Nguyên tắc xây dựng hàm băm dựa trên các thuật toán mở rộng
Rijndael
Theo Bram Cohen, hàm băm AES (AES - Hash) đảm bảo các tính chất của một
hàm băm, vì thế nguyên tắc xây dựng hàm băm dựa trên các thuật toán mở rộng
Rijndael hoàn toàn tương tự như hàm băm AES chỉ thay đổi độ dài của khối và thao
tác mã hóa thông tin được sử dụng trong thuật toán.
2.5. Kết luận chương 2
19
CHƯƠNG 3: ỨNG DỤNG CHUẨN MẬT MÃ NÂNG CAO ĐỂ XÂY DỰNG
MỘT VÀI HÀM BĂM CỤ THỂ
3.1. Đặt vấn đề
Các hàm băm đóng vai trò cơ bản trong mật mã hiện đại. Ứng dụng chính của
các hàm băm là sử dụng trong xây dựng các hệ chữ ký điện tử, ngoài ra hàm băm còn
được sử dụng vào các mục đích khác như: Xác thực hóa thông điệp, xác thực hóa
người dùng, xác thực tính toàn vẹn của dữ liệu.
Một trong các hàm băm được nhắc đến hiện nay đó là hàm băm Whirlpool.
Whirlpool được thiết kế bởi Vincent Rijmen và Paulo S. L. M. Barreto. Hàm băm
Whirlpool được công nhận cùng với phương pháp mã hoá AES là những nền tảng
bảo mật mạnh mẽ tại Hội thảo về Bảo Mật NESSIE tại Lund, Thụy Điển vào ngày
26/2/2003. Hàm băm Whirlpool được chọn trong danh sách các hàm băm chống xung
đột và được xếp vào chuẩn ISO/IEC 10118-3 cho các hàm băm. Hàm băm Whirlpool
cũng đã được chính phủ Việt Nam chọn là bộ chuẩn mật mã quốc gia.
Hàm băm Whirlpool có cấu trúc giống với hàm băm thông, có khối mã hóa
(hàm nén) Whirlpool tương tự như thuật toán của AES nhưng với kích thước khối, số
vòng, lịch trình khóa và S - box ban đầu khác nhau. Dưới đây xin trình bày cụ thể về
hàm băm Whirlpool.
3.2. Các cơ sở toán học của hàm băm Whirlpool
3.2.1. Trường Galois (sự biểu diễn nhị phân)
Ký hiệu trường Galois GF(2
4
) là GF(2)[x] / p
4
(x) với p
4
(x) = x
4
+ x + 1 và
trường GF(2
8
) như GF(2)[x] / p
8
(x) với p
8
(x) = x
8
+ x
4
+ x
3
+ x
2
+ 1. Đa thức p
4
(x) và
p
8
(x) là các đa thức chính đầu tiên ở bậc 4 và 8, và được chọn sao cho g(x) = x là
phần tử sinh của GF(2
4
) /{0} và GF(2
8
) /{0} tương ứng. Các phần tử thuộc trường
Galois được biểu diễn dưới dạng một đa thức
1
0
)2(
m
i
xGF
i
x
i
uu
, trong đó u
i
Є
GF(2) với mọi i = 0,…,m -1 sẽ được ghi chú giá trị số
1
0
2.
m
i
i
i
u
hay được viết dưới
dạng thập lục phân, ví dụ 13
x
để ký hiệu cho p4(x).
3.2.2. Các lớp ma trận
3.3. Mô tả hàm băm Whirlpool
Hàm băm chuyên dụng Whirlpool nhận đầu vào là một thông điệp dữ liệu có
độ dài không quá 2
256
- 1 bit và cho ra giá trị băm có độ dài 512 bit. Hàm băm
Whirlpool được mô tả dựa trên kiến trúc hàm băm Davies - Mayer, sử dụng thuật
toán Rijndael với kích thước khối và khóa đều là 512 bit.
Đầu vào: Giả sử chuỗi dữ liệu đầu vào đã được đệm tới hàm băm là ở dạng
một dãy các byte. Nếu chuỗi dữ liệu đã được đệm ở dạng một dãy của 8n bit, x
0
,
20
x
1
…, x
8n-1
, thì nó sẽ được hiểu như là một dãy của n byte, B
0
, B
1
,…B
n-1
theo cách sau.
Mỗi nhóm của 8 bit liên tiếp được xem là một byte, bit thứ nhất của nhóm là bit có
giá trị cao nhất của byte đó. Tức là: B
i
= 2
7
x
8i
+ 2
6
x
8i+1
+ ….+ 2x
8i + 7
cho mỗi i (0 ≤ i
< n). Biến đổi đầu ra cho hàm băm là: mã băm H nhận được bằng cách lấy L
H
bit trái
nhất của chuỗi đầu ra H
q
cuối cùng có L
2
bit. Việc lựa chọn L
H
ảnh hưởng tới độ an
toàn của hàm băm.
3.3.2. Cấu trúc của Whirlpool
Trước khi được băm, thông điệp M có chiều dài L < 2
256
được thêm một bit ‘1’
và một số bit ‘0’ được thêm vào để được chuỗi bit có chiều dài là bội số lẻ của 256 và
cuối cùng là 256 bit nhị phân chứa chiều dài L của thông điệp trước khi thêm các bit
được thêm vào tạo thành một thông điệp m, thông điệp kết quả này được chia thành t
khối m
1
,…,m
t
. Các khối này được xem như là các mảng byte bằng cách nhóm liên tục
các bit thành các đoạn 8 - bit.
Hàm nén Whirlpool lặp chiến lược băm Miyaguchi Preneel trên t khối thông
điệp thêm bit m
i
, 1 ≤ i ≤ t, dùng mật mã toàn bộ khối 512 - bit W.
H
0
= Initial Value
H
i
= W(H
i-1
, m
i
) + H
i-1
+ m
i
= Intermediate Value
Hình 3.2: Cấu trúc của Whirlpool
3.3.3. Khối mã hóa Whirlpool (hàm nén Whirlpool)
Mã khối Whirlpool có cấu trúc và các hàm biến đổi giống như AES. Nhưng
Whirlpool sử dụng độ dài khóa 512 bit và độ dài khối là 512 bit, trong khi độ dài khối
của AES là 128 bit, và độ dài khóa là 128 bit, có thể hỗ trợ đến 192 bit hoặc 256 bit.
Whirlpool làm việc với ma trận có kích thước 8*8, AES làm việc với ma trận 4*4. Số
vòng trong AES là 10, 11, 12, 13 hoặc 14, trong khi đó Whirlpool số vòng chỉ là 10.
21
3.3.3.1. Các hàm trong khối mã hóa Whirlpool
Thuật toán mã hóa Whirlpool có đầu vào là khối bản rõ độ dài 512 bit, và độ
dài khóa là 512 bit, đầu ra là khối bản mã đã được mã hóa với độ dài là 512 bit. Thuật
toán mã hóa Whirlpool sử dụng 4 hàm (phép biến đổi) đó là: AddRoundKey (AK),
hàm SubBytes (SB), hàm ShiftColumns (SC), và MixRows (MR). Quy trình mã hóa
Whirlpool bao gồm 10 vòng. Mỗi vòng có 1 khóa vòng được thêm vào ở biến đổi
AddRoundKey. Cấu trúc khối mã hóa Whirlpool được chỉ ra ở hình 3.3 dưới đây.
Hình 3.3: Cấu trúc khối mã hóa Whirlpool
Để hỗ trợ cài đặt phần mềm một dãy các hàm trên được ký hiệu thành c
0
, c1,
c
2
, c
3
, c
4
. Đối với c
0
hàm nhận đầu vào
là một chuỗi 64 phần tử của GF(2
8
), và đưa ra
ma trận 8*8 với các phần tử GF(2
8
). Đối với c
1
, c
2
, c
3
hàm nhận đầu vào
là một ma
trận 8*8 gồm các phần tử từ GF(2
8
) và đưa ra một ma trận 8*8 gồm các phần tử từ
GF(2
8
). Đối với c
4
hàm nhận đầu vào
là 2 ma trận 8*8 gồm các phần tử từ GF(2
8
) và
đưa ra 1 ma trận 8*8 gồm các phần tử từ GF(2
8
). Cả 4 hàm trên đều được sử dụng 64
byte, dùng trong việc định ra hàm vòng. Dưới đây trình bày cụ thể về các hàm này:
Hàm c
0
: nhận một dãy 64 byte, B = (B
0
, B
1
, … B
63
) như đầu vào, và tạo ma trận
Z
’
= (z’
ij
) như đầu ra với: z’
ij
= B
8i+j
(0
i, j
7).
Điều này có nghĩa rằng Z
’
= c
0
(B) khi và chỉ khi z
’
ij
= B
8i+j
(0
i, j
7).
Hàm c
1
: nhận ma trận X
’’
= (x
’’
ij
) như đầu vào và tạo ra một ma trận khác
W
’
= c
1
(X
’’
) khi và chỉ khi w
’
ij
= s[x
’’
ij
] (0
i, j
7). Hàm cụ thể được cho ở dạng bảng
3.1. Hộp s thay thế mỗi phần tử x
GF(2
8
) bằng một phần tử khác s[x]
GF(2
8
), như
22
được chỉ ra ở bảng 3.1 (các phần tử trong cột đầu tiên là “một nửa có nghĩa lớn nhất”
của x và phần tử trong dòng đầu tiên là “một nửa có nghĩa nhỏ nhất” của x). Ví dụ,
nếu x = 01010110 = 56 (hệ hexa), s[x] = 49 (hệ hexa) = 01001001.
Bảng 3.1. S - box trong Whirlpool
00 01 02 03 04 05 06
07 08 09 0A
0B
0C 0D
0E
0F
00
18 23 C6 E8
87 B8
01
4F 36 A6
D2
F5
79 6F
91 52
10
60 BC
9B 8E
A3
0C
7B
35 1D
E0 D7
C2
2E 4B
FE
57
20
15 77 37 E5
9F F0 4A
DA
58 C9
29 0A
B1 A0
6B
84
30
BD
5D
10 F4 CB
3E 05
67 E4 27 41 8B
A7
7D
95 D8
40
FB
EE
7C 66 DD
17 47
9E CA
2D
BF
07 AD
5A
83 33
50
63 02 AA
71 C8 19 49
D9
F2 E3 5B
88 9A
26
32 B0
60
E9 0F D5
80 BE
CD
34
48 FF
7A
90 5F
20 68
1A
AE
70
B4
54 93 22 64 F1 73
12 40 08 C3
EC
DB
A1
8D
3D
80
97 00 CF
2B
76 82 D6
1B B5
AF
6A
50 45 F3
30 EF
90
3F 55 A2
EA
65 BA
2F
C0 DE
1C
FD
4D
92 75
05 8A
A0
B2
E6
0E 1F 62 D4
A8
96 F9 C5
25 59 84 72
39 4C
B0
5E 78 38 8C
D1
A5
E2
61 B3
21 9C
1E
43 C7
FC
04
C0
51 99 6D
0D
FA
DB
7E
24 3B
AB
CE
11 8F 4E
B7
EB
D0 3C
81 94 F7 B9 13 2C
D3
E7 6E C4
03 56 44
7F
A9
E0
2A
BB
C1 53 DC
0B
9D
6C 31 74 F6
46 AC
89
14 E1
F0
16 3A
69 09 70 B6
D0
ED
CC
42 98 A4
28 5C
F8
86
Hàm c
2
: nhận đầu vào là ma trận X
’’
= (x
’’
ij
) và tạo ra ma trận khác W
’
=(w
’
ij
)
như là đầu ra với w
’
ij
= x’’
(i+j)mod8,j
(0
i, j
7).
Điều đó có nghĩa rằng W
’
= c
2
(X
’’
) khi và chỉ khi w
’
ij
= x’’
(i+j)mod 8
(0
i, j
7).
Hàm c
3
: nhận ma trận X
’’
như là đầu vào và tạo ra ma trận khác W
’
ở đầu ra với
W
’
= X’’
C’’ ở đây C
’’
là ma trận luân hoàn 8*8 với các thành phần được chọn từ
GF(2
8
), như được chỉ ra ở dưới đây:
xxxxxxxx
xxxxxxxx
xxxxxxxx
xxxxxxxx
xxxxxxxx
xxxxxxxx
xxxxxxxx
xxxxxxxx
C''
0109020508010401
0101090205080104
0401010902050801
0104010109020508
0801040101090205
0508010401010902
0205080104010109
0902050801040101
Điều này có nghĩa là W
’
= c
2
(X
’’
) khi và chỉ khi W
’
= X
’’
C
’’
23
3.3.3.2. Mô tả mã hàm vòng
Hàm vòng
(.,.) mà biến đổi hai chuỗi nhị phân có độ dài L
1
và L
2
vào một
chuỗi nhị phân có độ dài L
2
, nó được sử dụng lặp đi lặp lại như một phần của hàm
băm, nó kết hợp chuỗi dữ liệu có độ dài L
1
với đầu ra trước đó có độ dài L
2
.
Hàm vòng
hoạt động như sau. Trong mô tả này, chúng ta sử dụng các ký
hiệu W
’
, X
’’
, K
0
, K
10
để kí hiệu 13 ma trận khác nhau, mỗi ma trận có các phần tử
được chọn từ GF(2
8
), chúng chứa các giá trị được yêu cầu trong các tính toán.
a) Giả sử 512 bit đầu vào đầu tiên đối với
là được chứa trong ma trận Z
’
với các
phần tử được chọn từ GF(2
8
), ma trận này được tạo nên nhờ phương pháp quy ước
sắp xếp byte. Cũng giả sử 512 bit đầu vào thứ hai đối với
là được chứa trong ma
trận Y
’
với các phần tử được chọn từ GF(2
8
).
b) Đặt K
0
:= Y
’
và i có giá trị từ 1 đến 10, ta lấy: K
i
= c
4
(c
3
(c
2
(c
1
(K
i-1
)))), A
i
). Bước này
mở rộng ma trận Y
’
thành dãy các khóa vòng K
0
,….K
10
cho mã khối W.
c) Đặt X
’’
:= c
4
(Z
’
, K
0
) và với j có giá trị từ 1 đến 10 làm các bước sau:
i) W
’
:= c
4
(c
3
(c
2
(c
1
(X
’’
))),K
j
); ii) X
’’
= W
’
Chú ý: Đây chính là mã khối W
Lấy Y
’
:= W
’
K
0
Z
’
. Đây chính là chế độ băm Miyaguchi-Preneel
Ma trận Y
’
biểu diễn đầu ra của hàm vòng
. Sau vòng lặp cuối cùng của hàm
vòng, ma trận Y
’
sẽ được chuyển thành một dãy có 64 byte nhờ phép đảo ngược của
thủ tục đã được chỉ ra ở trên, khi đó phần tử ở dòng đầu tiên và cột đầu tiên của ma
trận sẽ dẫn tới byte đầu tiên, phần tử ở dòng đầu tiên và cột thứ hai của ma trận sẽ
dẫn tới byte tiếp theo, phần tử ở dòng thứ 8 và cột thứ 8 của ma trận dẫn tới byte
cuối cùng. 64 byte sẽ được chuyển thành 512 bit nhờ phép ngược của thủ tục đã được
chỉ ra ở trên, tức là, bit thứ nhất (ngoài cùng bên trái) sẽ tương ứng với bit có nghĩa
cao nhất của byte thứ nhất ngoài cùng bên trái, và bit thứ 512 (ngoài cùng bên phải)
sẽ tương ứng với bit nhỏ nhất của byte thứ 64 (ngoài cùng bên phải).
Hình vẽ 3.4 dưới đây chỉ ra các bước con a), và b) của bước thứ 3 trong hàm vòng
của Whirlpool, chúng được thực hiện 10 lần.
Hình 3.4. Một phần của hàm vòng trong Whirlpool
3.3.4. Các bước thực hiện Whirlpool
Giá trị băm H của dữ liệu D sẽ được tính trong 4 bước như sau:
24
a. Bước 1: Đệm dữ liệu (Padder)
Chuỗi dữ liệu D cần phải được đệm để làm cho nó chứa một số bit là bội nguyên của
512. Thủ tục đệm hoạt động như sau:
1. D được nối với một bit ‘1’;
2. Kết quả của bước trước được nối với một số bit ‘0’ (giữa 0 và 511) sao cho độ
dài (theo bit) của chuỗi kết quả là bội lẻ của 256.
3. Nếu độ dài ban đầu của D là L
D
, nói chuỗi thu được từ bước trước với biểu
diễn nhị phân 256 bit của L
D
, bit có nghĩa lớn nhất ở đầu.
Trong mô tả của hàm vòng sau đây, mỗi khối dữ liệu 512 bit D
i
, 1
i
q, được
coi như ma trận Z
’
= (z
’
ij
) (0
i, j
7), tức là z
’
00
tương ứng với 8 bit ngoài cùng bên
trái của D
i
và z
’
77
tương ứng với 8 bit ngoài cùng bên phải của D
i
.
b. Bước 2: Phân chia
Phiên bản đã được đệm của chuỗi dữ liệu D được phân chia thành các khối D
1
,
D
2,
D
3
D
q
có L
1
bit, với D
1
biểu diễn L
1
bit đầu tiên của phiên bản đã được đệm của
D
1
, D
2
biểu diễn L
1
bit tiếp theo và,… Các quá trình đệm và phân chia được minh họa
như hình vẽ 3.5 dưới đây:
Hình 3.5: Các quá trình đệm và phân chia
c. Bước 3: Lặp
Giả sử D
1
, D
2
D
q
là các khối L
1
bit của dữ liệu sau khi đệm và phân chia. Giả
sử H
0
là chuỗi bit bằng với IV. Các chuỗi bit L
2
bit, H
1
, H
2
,…, H
q
được tính bằng lặp
theo lược đồ băm Miyaguchi - Preneel.
Với i bằng 1 tới q ta có:
iiiiiii DHDHWHDH
111, )]([)(
Trong đó:
: là hàm vòng
D
i
là chuỗi nhận được sau quá trình đệm, H
i
: Mã băm tại thời điểm i
L
1
= 512 bit, là độ dài (theo bit) của chuỗi đầu tiên trong hai chuỗi đầu vào của
hàm vòng
.
L
2
= 512 bit, là độ dài (theo bit) của chuỗi thứ hai trong hai chuỗi đầu vào của
hàm vòng
, đó cũng là độ dài của chuỗi đầu ra của hàm vòng
và của giá trị khởi
điểm.
Quá trình lặp của Whirlpool được minh họa ở hình 3.6
25
Hình 3.6: Quá trình lặp của Whirlpool
d. Bước 4: Biến đổi đầu ra
Mã băm H nhận được bằng cách thực hiện biến đổi T trên H
q
là đầu ra của
bước 3, để nhận được L
H
bit của mã băm cuối cùng. Ví dụ, biến đổi T có thể là phép
toán chặt cụt.
3.4. Một số ứng dụng của hàm băm Whirlpool
Hàm băm mật mã học được sử dụng trong nhiều ứng dụng bảo mật thông tin
đa dạng như trong các hệ chữ ký điện tử, xác thực hóa thông điệp, xác thực hóa người
dùng, xác thực tính toàn vẹn của dữ liệu.
Hàm băm Whirlpool không yêu cầu không gian lưu trữ lớn vì thế việc cài đặt
ứng dụng bảo mật thông tin trong các thẻ thông minh, các thiết bị cầm tay đạt được
hiệu quả cao.
Hàm băm Whirlpool được công nhận cùng với phương pháp mã hoá AES là
những nền tảng bảo mật mạnh mẽ tại Hội thảo về Bảo Mật NESSIE vào ngày
26/2/2003. Hàm băm Whirlpool đã được chính phủ Việt Nam chọn là bộ chuẩn mật
mã quốc gia.
3.5. Đánh giá hàm băm Whirlpool
Hàm băm Whirlpool có khả năng mở rộng phạm vi sử dụng hơn các hàm băm
khác;
Hiệu quả trên đa số phần cứng (hỗ trợ cho các bộ xử lý 8 bit cũ, các bộ xử lý
32 bit hiện tại và bộ xử lý 64 bit trong tương lai);
Không yêu cầu không gian lưu trữ quá lớn cho cả mã và S-box;
Được cài đặt hiệu quả cho môi trường có những ràng buộc như thẻ thông minh,
các thiết bị cầm tay… và hoạt động hiệu quả rất cao đối với các bộ nhớ cache lớn hơn
của các bộ xử lý hiện tại;
Chỉ sử dụng những lệnh đơn giản có sẵn trong bộ xử lý máy tính;
Kích thước các bản tóm lược thông báo của Whirlpool bằng 512 bit, vì thế nó
có khả năng chống lại các tấn công, đặc biệt là tấn công ngày sinh nhật.
3.6. Kết luận chương 3