Thuật toán băm

Một phần của tài liệu LUẬN văn THẠC sĩ NGHIÊN cứu cơ CHẾ xác THỰC, bảo mật TRONG CÔNG NGHỆ BLOCKCHAIN (Trang 57 - 64)

9. Đồng thuận chống gian lận Byzantine: Một trong những vấn đề cơ bản của việc tính toán phân tán được giải thích bởi bài toán những vị tướng Byzantine.

2.4.4 Thuật toán băm

Hiện nay có rất nhiều dạng Hash code khác nhau, nhưng phổ biến nhất có 3 loại:

CRC32: Chứa 8 ký tự, dựa trên thuật toán Cyclic Redundancy Check. Ưu điểm là tính toán nhanh và độ dài ngắn.

MD5: Dài 32 ký tự, sử dụng thuật toán Message Digest. Hiện nay được sử dụng khá phổ biến vì tính chính xác cao và không quá nhiều thao tác xử lý.

SHA-1: gồm 40 ký tự, dùng thuật toán Secure Hash Algorithm. Rất chính xác nhưng thời gian tính toán khá lâu.

Trong đó hàm SHA-1 là một trong những hàm được sử dụng rộng rãi nhất ở Việt Nam.

Năm 1990, Ron Rivest đã sáng tạo ra hàm băm MD4. Sau đó năm 1992, ông cải tiến MD4 và phát triển một hàm băm khác: MD5. Năm 1993, Cơ quan An ninh Quốc gia Hoa Kỳ/Cục an ninh Trung ương (NSA) đã công bố, một hàm băm rất giống với MD5 được gọi là SHA. Vào năm 1995, sau việc khắc phục những lỗ hỏng kỹ thuật, NSA đã thay đổi HSA trở thành một hàm băm mật mã khác gọi là SHA-1.

SHA-1 (Secure Hash Algorithm) là thuật toán cũng được xây dựng trên thuật toán MD4, đang được sử dụng rộng rãi. Thuật toán SHA-1 tạo ra chuỗi mã băm có chiều dài cố định 160 bit từ chuỗi bit dữ liệu đầu vào x có chiều dài tùy ý.

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) 160 bits. Giải thuật gồm 5 bước trên khối 512 bits.

Bước 1: Nhồi dữ liệu

Nhồi thêm các bits sao cho dữ liệu có độ dài l mod 512 luôn đồng dư là 448 (l nguyên).

Luôn thực hiện nhồi dữ liệu ngay cả khi dữ liệu ban đầu có độ dài mong muốn.

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 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 cuối chuỗi nhị phân mà ta thu được ở bước 1.

Độ dài được biểu diễn dưới dạng nhị phân 64 bit không dấu.

Kết quả thu được từ 2 bước là một khối dữ liệu có độ dài là bội số của 512. (Với cứ 512 bit là một khối dữ liệu)

Bước 3: Khởi tạo bộ đệm MD (MD buffer)

Như minh họa trong hình 2.11 dưới đây, 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 đặ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

H2 = EFCDAB89 H3 = 98BADCFE H4 = 10325476 H5 = C3D2E1F0

Bước 4: Xử lý khối dữ liệu 512 bit

Hình 2.11 Thuật toán SHA-1

Trọng tâm của giải thuật bao 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 ở hàm logic Ft.

Bảng 2.1 Minh họa 4 vòng lặp của giải thuật

(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ỗi bộ đệm 160 bit A, C, B, 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 đến 80 nhóm 32 bit bằng vòng lặp For 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 1 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

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

2.4.4.2 Giới thiệu thuật toán băm SHA-2

Hàm băm SHA-1 có nhiều ứng dụng quan trọng trong việc đảm bảo an toàn và bảo mật hệ thống thông tin, được sử dụng rộng rãi trong một thời gian. SHA-1 từng là tiêu chuẩn công nghiệp, nhưng hiện đã được loại bỏ và SHA-2 được sử dụng thay thế vì nó được nhận dạng là có các khiếm khuyết an ninh và được đề xuất là không đủ an toàn để tiếp tục sử dụng vào năm 2005. SHA-2 hiện được hầu hết các môi trường và thiết bị nhận dạng. SHA-2 là một họ bao gồm 6 hàm băm với các digests dài 224, 256, 384 hoặc 512 bits: SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, SHA-512/256. SHA-256 được tính toán với các từ 32 bits, 64 vòng lặp, còn SHA-512 được tính toán với các từ 64 bits, 80 vòng lặp. SHA-224 với digest dài 224 bits, là phiên bản rút gọn của SHA-256. SHA-384 với digest dài 384 bits, là phiên bản rút gọn của SHA-512. SHA-512/224 và SHA-512/256 đều là các phiên bản rút gọn của SHA-512 với các digests dài tương ứng là 224 bits và 256 bits. Việc chọn SHA-2 sẽ cấp chứng chỉ bằng SHA-256 được kết nối với trung gian SHA-256. SHA256 là viết tắt của Secure Hash Algorithm 256-bit (Thuật toán băm bảo mật 256 bit) và được sử dụng để bảo mật bằng mật mã. Thuật toán băm mật mã tạo ra các hàm băm không thể đảo ngược và duy nhất. Số lượng hàm băm có thể có càng lớn, thì xác suất để hai giá trị sẽ tạo ra cùng một giá trị băm càng nhỏ

2.4.4.3 Giới thiệu hàm băm SHA-256

Chú ý: Tất cả các biến đều là 32 bit không dấu quay vòng modulo 232 khi tính

(32 bit đầu tiên của phần phân số của căn bậc 2 của 8 số nguyên tố đầu tiên 2..19): h0:= 0x6a09e667 h1:= 0xbb67ae85 h2:= 0x3c6ef372 h3:= 0xa54ff53a h4:= 0x510e527f h5:= 0x9b05688c h6:= 0x1f83d9ab h7:= 0x5be0cd19

Bước 2: Khởi tạo hằng số

(32 bit đầu tiên của phần phân số của căn bậc 3 của 64 số nguyên tố đầu tiên 2..311):

k[0..63] := 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2

Thêm k bit '0', trong đó k là số nhỏ nhất >= 0 sao cho chiều dài của đoạn dữ liệu gốc (tính bằng bit) đồng dư với 448 (mod 512)

Thêm độ dài của đoạn dữ liệu gốc (trước giai đoạn tiền xử lý), tính băng bits thể hiện bằng một số 64 bit big endian vào cuối đoạn dữ liệu.

Xử lý đoạn dữ liệu từng 512 bit một:

Tách đoạn dữ liệu ra thành từng nhóm 512 bit. Với mỗi nhóm, tách nhóm ra thành 16 nhóm 32 bit big endian w[0..15], mở rộng 16 nhóm này thành 64 nhóm 32 bit:

for i từ 16 đến 63

s0:= (w[i-15] quay vòng phải 7) xor (w[i-15] quay vòng phải 18) xor (w[i-15] dịch phải 3)

s1:= (w[i-2] quay vòng phải 17) xor (w[i-2] quay vòng phải 19) xor (w[i-2] dịch phải 10)

w[i]:= w[i-16] + s0 + w[i-7] + s1 Khởi tạo giá trị băm cho nhóm này: a:= h0 b:= h1 c:= h2 d:= h3 e:= h4 f:= h5 g:= h6 h:= h7 Vòng lặp chính: for i từ 0 đến 63

s0:= (a xoay vòng phải 2) xor (a xoay vòng phải 13) xor (a xoay vòng phải 22)

maj:= (a and b) xor (a and c) xor (b and c) t2:= s0 + maj

s1:= (e xoay vòng phải 6) xor (e xoay vòng phải 11) xor (e xoay vòng phải 25)

ch:= (e and f) xor ((not e) and g) t1:= h + s1 + ch + k[i] + w[i] h:= g g:= f f:= e e:= d + t1 d:= c c:= b b:= a a:= t1 + t2

Cộng giá trị băm vừa tính vào kết quả: h0:= h0 + a h1:= h1 + b h2:= h2 + c h3:= h3 + d h4:= h4 + e h5:= h5 + f h6:= h6 + g h7:= h7 + h

Tạo kết quả cuối cùng (big endian): digest = hash = h0 nối với h1 nối với h2 nối với h3 nối với h4 nối với h5 nối với h6 nối với h7.

Một phần của tài liệu LUẬN văn THẠC sĩ NGHIÊN cứu cơ CHẾ xác THỰC, bảo mật TRONG CÔNG NGHỆ BLOCKCHAIN (Trang 57 - 64)

Tải bản đầy đủ (DOCX)

(87 trang)
w