Có rất nhiều thuật tố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, m2, m3, … mk)
Bước 2: Do m có độ dài bất kỳ nên ln 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 m1, m2, m3,.., mk 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ứ mi-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.3. Một số hàm băm mật mã thông dụng
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 264 phép tốn và để tìm được tiền ảnh của một mã băm thì cần khoảng 2128 phép tố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 220 phép tốn.
Được phát triển bởi Ron Rivest tại đại học MIT. 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. Giải thuật được thực hiện theo 5 bước như sau:
Bước 1: Nhồi dữ liệu
+ Nhồi thêm các bits sao cho dữ liệu có độ dài I=n*512 +448
+ Việc thực hiện nhồi dữ liệu ngay cả khi dữ liệu ban đầu có độ dài mong muốn tức là nếu dữ liệu có độ dài 448 thì cũng được nhồi thêm 512 để thu được độ dài 960 bits.
+ Số lượng các bits nhồi thêm nằm trong khoảng từ 1 đến 512 + Các bits được nhồi gồm bít 1 và các bits 0 theo sao.
Bước 2: Thêm vào độ dài
+ Độ dài của khối dữ liệu ban đầu được biểu diễn dưới dạng nhị phân 64 bit và được thêm vào cuối chuỗi nhị phân kết quả của bước 1
+ Nêó đội dài của khối dữ liệu >264, thì chỉ 64 bits thấp nhất được sử dụng nghĩa là giá trị thêm vào bằng K mod 264
+ Kết quả có được từ 2 bước đầu là một khối dữ liệu có độ dài là bội số của 512. Khối dữ liệu được biểu diễn
Bằng một dãy L khối 512 bit Y0, Y1,…,YL-1 Bằng một dãy N từ 32 bit M0, M1, …, MN-1
Bước 3: Khởi tạo bộ đệm MD (MD buffer)
+ Một bộ đệm 128 bit được dùng để lưu trữ các giá trị băm trung gian và kết quả. Bộ đệm được biểu diễn bằng 4 thanh ghi 32 bit với các giá trị khởi thạo ở dạng little-endian (byte có trọng số nhỏ nhất trong từ nằm ở địa chỉ thấp nhất) như sau:
A=67 45 23 01
B=EF CD AB 89
C=98 BA DC FE
D=10 32 54 76
+ Các giá trị này tương ứng với các từ 32 bit như sau
A=01 23 45 67
B=89 AB CD EF
D=76 54 32 10
Bước 4: Xử lý các khối dữ liệu 512 bit
+ Trọng tâm của giải thuật là hàm nén (Compression function) gòm 4 vịng xử lý, các vịng này có cấu trúc khác nhau nhưng sử dụng các hàm logic khác nhau. Đó là các hàm F x y z x y x z G x y z x z y z x y z x y z x y z y x z ( , , ) = Ù Ú Ù ( , , ) = Ù Ú Ù H( , , ) = + + I( , , ) = + ( Ú )
+ Mảng 64 phần từ được tính theo cơng thức T(i)=232xabs(sin(i)) theo radian + Kết quả của 4 vòng được cộng vào theo modulo 232 với đầu vào CVq để tạo ra CVq+1
Bước 5: Xuất kết quả
Sau khi xử lý hết L khối 512 bit, đầu ra của lần xử lý thứ L là giá trị băm 128 bits
Giải thuật MD5 được tóm tắt như sau
+ CV0=IV
+ CVq+1=Sum32[CVq,RFI(Yq,RFH(Yq,RFG(Yq,RFF(Yq,CVq))))] Trong đó
IV là bộ đệm gồm 4 thanh ghi ABCD Yq là khối dữ liệu thứ q gồm 512 bits L là số khối 512 bit sau khi nhồi dữ liệu
CVq là đầu ra của khối thứ q sau khi áp dụng hàm nén RFx là hàm luận lý sử dụng trong các vòng (F,G,H,I) MD là giá trị băm (message digest)
Sum32 là hàm cộng modulo 232
Họ hàm băm SHA
+ Đặc điểm
Thuật toán SHA Secure Hash Algorithm 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
lại kết quả dài 224 bit), SHA-256 ( trả lại kết quả dài 256 bit), SHA-384 và SHA- 512 ( trả lại kết quả dài 512 bit). Bốn thuật giải sau thường được gọi chung là SHA- 2. Bảng dưới đây thể hiện các tính chất cơ bản của bốn thuật tốn băm an toàn.
+ Nhận xét về họ hàm băm SHA
Ưu điểm Nhược điểm
SHA là họ hàm băm được coi là an toàn bởi:
+ 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.
+ 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ụngvà 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
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 tốn dù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 tố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 tốn băm mới an tồn hơn SHA, giống như quy trình phát triển chuẩn mã hóa nâng cao AES.
Thuật tốn mã hóa SHA-1
Giới thiệu chung:
SHA-1 là một thuật toán được sử dụng rộng rãi trong nhiều ứng dụng và giao thức an ninh khác nhau, bao gồm TLS và SSL, PGP, SSH, S/MIME và IPSec. SHA-1 được coi là giải thuật thay thế MD5. Ba thuật tốn SHA có cấu trúc khác nhau và được phân biệt là: SHA-0, SHA-1, và SHA-2. SHA-1 gần tương tự như
SHA-0, nhưng sửa chữa một lỗi trong các đặc tả kỹ thuật gốc của hàm băm SHA dẫn đến những điểm yếu quan trọng. Các thuật tốn SHA-0 đã khơng được sử dụng trong nhiều ứng dụng. SHA-2 mặt khác có những điểm khác biệt quan trong so với hàm băm SHA-1. Việc phân loại các hàm băm SHA được đưa ra trong bảng sau đây: Thuật tốn Kích thước đầu ra Kích thước Kích thước tin nhắn tối đa Kích thước từ Xung quanh Các va chạm tìm thấy? SHA-0 160 512 264 − 1 32 80 Có SHA-1 Tấn cơng lí thuyết? SHA-2 SHA- 224/256 224/256 512 2 64 − 1 32 64 Không SHA- 384/512 384/512 1024 2 128 − 1 64 80
SHA-1 là 1 phần trong các ứng dụng bảo mật được sử dụng rộng rãi trong các giao thức như: TLS và SSL, PGP, SSH và IPSEC. Các SHA-1 có thể được sử dụng với các DSA trong thư điện tử, chuyển tiền điện tử, phân phối phần mềm, lưu trữ dữ liệu và các ứng dụng khác cần đảm bảo tính tồn vẹn DL và xác thực nguồn gốc DL. Các SHA-1 cũng có thể sử dụng bất cứ khi nào nó là cần thiết để tạo ra 1 phiên bản đặc biệt của tin nhắn. Hàm SHA-1 còn được sử dụng trên Wii của Nintendo để xác minh chữ ký thời gian khởi động.
SHA-1 và SHA-2 là những thuật tốn băm an tồn theo u cầu của pháp luật để sử dụng trong một số ứng dụng của Chính Phủ Hoa Kỳ, bao gồm cả sử dụng trong các thuật tốn mã hóa khác và các giao thức, để bảo vệ thông tin mật nhạy cảm.
Sau đây là các bước tiến hành trong thuật toán SHA-1
Input: thông điệp với độ dài tối đa 264 bits
Output: giá trị băm (message digest) có độ dài 160 bits
Giải thuật gồm 5 bước thao tác trên các khối 512 bits
Bước 1: Nhồi dữ liệu
Thông điệp được nhồi thêm các bit thỏa mãn các yêu cầu: + Độ dài L mod 512 luôn đồng dư là 448 hay I=n*512+448.
+ Việc thực hiện nhồi dữ liệu ngay cả khi dữ liệu ban đầu có độ dài mong muốn tức là nếu dữ liệu có độ dài 448 thì cũng được nhồi thêm 512 để thu được độ dài 960 bits.
+ Số bit nhồi thêm phải nằm trong khoảng [1-512].
+ Phần thêm vào cuối dữ liệu gồm 1 bit 1 và theo sau là các bit 0.
Bước 2: Thêm độ dài
+ Độ dài của khối dữ liệu ban đầu sẽ được biểu diễn dưới dạng nhị phân 64 bit và được thêm vào cuối chuỗi nhị phân mà ta thu được của bước 1.
+ Kết quả thu được từ bước 2 là 1 khối dữ liệu có độ dài là bội số của 512 (với cứ 512 bit là 1 khối dữ liệu). Khối dữ liệu được biểu diễn
Bằng một đãy L khối 512 bit Y0, Y1, YL-1 Bằng một dãy N từ 32 bit M0, M1, … MN-1
Bước 3: Khởi tạo bộ đệm MD
Một bộ đệm 160-bit được dùng lưu trữ các giá trị băm trung gian và kết quả. Bộ đệm được biểu diễn bằng 5 thanh ghi 32-bit với các giá trị khởi tạo ở dạng big- endian (byte có trọng số lớn nhất trong từ nằm ở địa chỉ thấp nhất) và có 2 bộ đệm 5 thanh ghi của bộ đệm đầu tiên được đánh đặt tên là A, B, C, D, E và tương tự cho bộ đệm thứ 2 là H0, H1, H2, H3, H4. Có giá trị như sau (theo dạng Hex):
H0=67452301 H1=EFCDAB89 H2=98BADCFE H3=10325476 H4=C3D2E1F0.
+ Được thực hiện gồm 4 vòng lặp thực hiện tất cả 80 bước, 4 vịng lặp có cấu trúc như nhau, chỉ khác nhau ở các hàm logic ft. Thuật tốn được thực hiện theo các bước mơ tả trong bảng sau:
Bước Hàm Giá trị
(0 ≤ t ≤ 19) ft = f(B,C,D) (B AND C) OR ((NOT B) AND D) (20 ≤ t ≤ 39) ft = f(B,C,D) B XOR C XOR D
(40 ≤ t ≤ 59) ft = f(B,C,D) (B AND C) OR (B AND D) OR (C AND D) (60 ≤ t ≤ 79) ft = f(B,C,D) B XOR C XOR D
+ Mỗi vịng có đầu vào gồm khối 512-bit hiện thời và một bộ đệm 160-bit A,B,C,D,E. Các thao tác sẽ cập nhật giá trị bộ đệm .
+ Chia khối dữ liệu đã nhồi thêm (cuối bước 2) thành 16 nhóm (mỗi nhóm gồm 32 bit) và đặt theo thứ tự là: W0, W1,..., W15.
+ Mở rộng từ 16 nhóm 32 bit lên 80 nhóm 32 bit bằng vòng lặp: For t = 16 to 79 let
Wt = S1(Wt-3 XOR Wt-8 XOR Wt- 14 XOR Wt-16). + Gán A = H0, B = H1, C = H2, D = H3, E = H4.
+ Mỗi vịng lập sử dụng theo cơng thức chung với một hằng số Kt (0 ≤ t ≤ 79) như sau: For t = 0 to 79 do TEMP = S5(A) + ft (B, C, D) + E + Wt + Kt; E = D; D = C; C = S30(B); B = A; A = TEMP; Với: Kt = 5A827999 (0 ≤ t ≤ 19) Kt = 6ED9EBA1 (20 ≤ t ≤ 39) Kt = 8F1BBCDC (40 ≤ t ≤ 59) Kt = CA62C1D6 (60 ≤ t ≤ 79)
+ Đầu ra của 4 vòng (bước 80) được cộng với giá trị của bộ đệm để tạo ra 1 chuỗi kết quả dài 160 bit.
H0 = H0 + A H1 = H1 + B
H2 = H2 + C H3 = H3 + D H4 = H4 + E.
Bước 5: Xuất kết quả
Sau khi thao tác trên toàn bộ N khối dữ liệu (blocks). Kết quả của khối thứ N là chuỗi băm 160-bit
H=H0 H1 H2 H3 H4
Giải thuật SHA-1 được tóm tắt như sau
+ CV0=IV
+ CVq+1=Sum32(CVq,ABCDEq) Trong đó
- IV là giá trị khởi tạo của bộ đệm ABCDE - ABCDEq là đầu ra của hàm nén trên khối thứ q - L là số khối thông điệp 512 bit
- Sum32 là phép công modulo 232 trên từng từ của đầu vào - MD là giá trị của hàm băm
2.3.4. Các ứng dụng cơ bản của hàm băm
+ Tạo khóa bí mật từ mật khẩu (Key Stretching) + Kiểm tra tính tồn vẹn dữ liệu (Integrity checking)
+ Mã chứng thực thông điệp sử dụng hàm băm (HMAC - Hashed Message Authencation Code)
+ Chữ kí điện tử
2.4 Một số phương pháp sinh OTP
2.4.1. Phương pháp sinh theo thời gian
Theo phương pháp sinh OTP theo thời gian, người dùng sẽ được cấp một thiết bị sinh mã được gọi là token. Token gồm có ba thành phần chính: một mã seedcode, một đồng hồ đếm thời gian, và một thuật tốn mã hóa một chiều. Mã seedcode là mã được nhà sản xuất cài đặt sẵn trong token. Mỗi token có một mã seedcode khác nhau. Và mã seedcode này cũng được lưu lại trong hệ thống của nhà cung cấp dịch vụ tương ứng với tên truy nhập của người dùng. Đồng hồ đếm thời gian là đồng hồ của token, nó được đồng bộ với đồng hồ của hệ thống trước khi giao cho người dùng. Mỗi khi người dùng bấm nút sinh mã, token sẽ lấy biến thời gian của đồng hồ. Biến thời gian được lấy chi tiết đến từng phút, hoặc 30 giây.
Thuật toán Time-based One-Time Password (TOTP) là một ví dụ cụ thể của những giải thuật sinh mật khẩu một lần dựa trên thời gian như vậy. Sau đây sẽ là phần mơ tả thuật tốn này.
Bước 1: Thiết lập
- Đưa ra một số nguyên bí mật K được chia sẻ giữa bên xác thực và người sử dụng.
- Thống nhất một giá trị bước nhảy thời gian X và thời gian ban đầu T0.
Bước 2: Xác thực
- Người sử dụng tính giá trị 𝑇=[Current Time - To
X ].
- Người sử dụng gửi cho bên xác thực HOTP(K,T) trong đó HOTP là thuật toán sinh OTP dựa trên các hàm băm.
Bên xác thực có thể xác nhận mật khẩu đó hợp lệ hay khơng, vì bất kỳ mật khẩu nào được sinh ra bên ngoài khoảng thời gian từ T0 đến thời gian hiện tại đều khác nhau. Và vì có một khóa được dùng chung nên nhà xác thực có thể chắc chắn rằng mật khẩu được sinh ra bởi một người đang sở hữu khóa chia sẻ đó.