LỜI MỞ ĐẦUNgày nay với sự phát triền nhanh chóng của công nghệ thông tin, đa số cáchoạt động đều thực hiện qua mạng internet thì vấn đề bảo mật và an toàn thông tinngày càng trở nên quan
Tổng quan về hàm băm
Giới thiệu
Trong lĩnh vực mật mã học, hàm băm là một hàm với một số tính chất bảo mật nhất định để phù hợp với việc sử dụng trong nhiều ứng dụng bảo mật thông tin đa dạng như chứng thực (authentication) và kiểm tra tính toàn vẹn của thông tin (message integrity) Một hàm băm nhận đầu vào là một khối thông tin có chiều dài tùy ý và tạo ra kết quả là một đoạn thông tin có chiều dài cố định.
Hàm băm (hash function) là hàm một chiều mà nếu đưa một lượng dữ liệu bất kì qua hàm này sẽ cho ra một chuỗi có độ dài cố định ở đầu ra.
Hình 1 Mô hình thuật toán băm
Một hàm h được gọi là hàm băm nếu nó có ít nhất hai tính chất sau:
- Tính chất nén: H sẽ ánh xạ một đầu vào x có độ dài bit hữu hạn tùy ý tới một đầu ra H(x) có độ dài bit là một số n hữu hạn.
- Tính chất dễ dàng tính toán: Với H cho trước và một đầu vào x, có thể dễ dàng tính được H(x).
Các tính chất của hàm băm
Các hàm băm được thiết kế với xâu đầu vào có độ dài tùy ý và kết quả đầu ra là một giá trị băm có độ dài cố định Hàm băm phải có khả năng chống lại được tất cả các kiểu tấn công phân tích Ba tính chất quan trọng nhất của hàm băm là:
- Tính một chiều: Cho trước giá trị băm y, việc tìm được một khối thông tin x sao cho H(x) = y là điều bất khả thi.
- Tính chống xung đột yếu: Cho trước khối thông tin x, không thể tìm được một khối thông tin x’ ≠ x sao cho h(x) = h(x’).
- Tính chống xung đột mạnh: Không thể tìm được hai khối thông tin x và x’ khác nhau sao cho h(x) = h(x’).
Khái niệm “không thể” trong các thuộc tính của hàm băm nói riêng và trong mật mã nói chung không có nghĩa là “không thể thực hiện được trên lý thuyết”, mà chỉ biểu diễn tính khó thực hiện bằng tay hoặc bằng máy tính với chi phí thời gian chấp nhận được Ví dụ, để tìm ra một trường hợp xung đột của một hàm băm h, cần phải thực hiện nhiều phép thử với thời gian hàng trăm thậm chí hàng nghìn năm,hành động này có thể được xem là “không thể” thực hiện được.
Phân loại hàm băm
Các hàm băm có khóa đượ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 – Message Authentication Code) MAC dựa trên các mật mã khối.
MAC nhận hai giá trị đầu vào:
- Đoạn bản tin cần tính giá trị băm.
- Khóa bí mật để băm bản tin theo đúng chuẩn quy định.
MAC có những yêu cầu bảo mật khác nhau, nó khá giống với các hàm mã hóa MAC, phải có khả năng chống lại sự giả mạo, tức là ngay cả khi hacker truy cập vào cả khóa thì cũng không thể phát sinh ra được MAC giống như MAC bên gửi tính toán.
MAC khác chữ ký số vì MAC được sinh ra và kiểm định bằng việc sử dụng cùng một khóa Điều đó có nghĩa là bên gửi và bên nhận phải thống nhất một khóa chung trước khi thực hiện việc trao đổi thông tin Như vậy thì MAC khác với chữ ký số vì MAC không đảm bảo được tính chất chống chối bỏ vì bên nhận cũng có thể sinh ra MAC bằng thông tin đã nhận được kết hợp với khóa chia sẻ.
1.3.2 Hàm băm không có khóa
Hàm băm không có khóa chỉ nhận duy nhất một giá trị đầu vào là bản tin. Phân làm hai nhóm chính như sau:
- Hàm băm một chiều (One-Way Hash Function – OWHF): Các hàm trong nhóm này đều thỏa mãn tính chất là với mọi giá trị băm biết trước, không thể tính toán để tìm được chuỗi bit đầu vào có giá trị băm bằng với giá trị băm đã cho.
- Hàm băm chống xung đột (Collision Resistant Hash Function – CRHF):Các hàm trong nhóm này thỏa mãn tính chất không thể tính toán để tìm ra hai chuỗi bit khác nhau mà có cùng giá trị băm.
Các ứng dụng của hàm băm
- Bảo vệ tính toàn vẹn
Một ứng dụng quan trọng của các hàm băm là kiểm tra tính toàn vẹn của bản tin Chẳng hạn như việc xác định xem một bản tin có bị sửa đổi hay không có thể thực hiện bằng cách so sánh giá trị băm được tính trước và sau khi gửi
Một bản tin kích thước tùy ý sau khi băm sẽ được thu gọn thành những bản băm – được gọi là các giá tri băm có kích thước cố định Với mỗi bản tin đầu vào chỉ có thể tính ra được một văn bản đại diện có giá trị băm tương ứng duy nhất Hai bản tin khác nhau chắc chắn có hai văn bản đại diện khác nhau Khi đã có văn bản đại diện duy nhất cho bức bản tin, kết luận được trên đường truyền đi bản tin có còn được toàn vẹn hay không.
Một ứng dụng tiêu biểu của hàm băm như sau: Alice đặt ra một bài toán khó cho Bob và tuyên bố rằng cô ấy đã giải được Bob sẽ phải cố gắng tự thực hiện, nhưng chưa dám chắc chắn rằng Alice không giải sai Do đó, Alice viết ra lời giải của mình, gắn thêm một giá trị nonce ngẫu nhiên, tính giá trị băm của nó và cho Bob biết giá trị băm đó (giữ bí mật lời giải và giá trị nonce) Bằng cách này, khi Bob tìm ra lời giải của mình vào vài ngày sau đó, Alice có thể chứng minh rằng cô ấy có lời giải sớm hơn bằng cách tiết lộ giá trị nonce cho Bob.
Khi người sử dụng đăng kí mật khẩu, giá trị băm của mật khẩu được tính bằng một hàm băm nào đó Giá trị băm được lưu trữ vào tập tin hay cơ sở dữ liệu.
Vì hàm băm là hàm một chiều nên từ giá trị băm được lưu trữ không thể suy ra được mật khẩu Khi người sử dụng đăng nhập, mật khẩu đăng nhập được tính toán giá trị băm và so sánh với giá trị băm đang được lưu trữ Do tính chống xung đột, chỉ có một mật khẩu duy nhất có giá trị băm tương ứng nên không ai khác ngoài người sử dụng có mật khẩu mới có thể đăng nhập được ứng dụng.
- Ứng dụng chữ ký số
Một số hàm băm thông dụng…
Bảng 1 Một số hàm băm được sử dụng
MD5 SHA-1 RIPEMD-160 Độ dài giá trị băm 128 bit 160 bit 160 bit Đơn vị xử lý cơ bản 512 bit 512 bit 512 bit
Kích thước bản tin tối đa
Hàm băm SHA-512
Tổng quan về SHA
SHA (Secure Hash Function) là hàm băm được Viện Tiêu chuẩn và Công nghệ Hoa Kỳ (NIST) chuẩn hóa năm 1993, sau đó được chỉnh sửa năm 1995 và đặt tên là SHA-1, từ đó phiên bản cũ được gọi là SHA-0 và gần như không được dùng đến SHA-1 dựa chủ yếu vào cấu trúc của hàm băm MD4.
SHA-1 tạo ra giá trị băm có chiều dài cố định là 160 bit Năm 2002, xuất hiện thêm một số phiên bản khác của SHA, chủ yếu là tăng chiều dài giá trị băm, như SHA-256 (giá trị băm dài 256 bit), SHA-384 (giá trị băm dài 384 bit) và SHA-
512 (giá trị băm dài 512 bit).
Bảng 2 Các phiên bản SHA
Thông số SHA-1 SHA-256 SHA-384 SHA-512
Kích thước giá trị băm 160 bit 256 bit 384 bit 512 bit Kích thước thông tin gốc < 2 64 bit < 2 64 bit < 2 128 bit < 2 128 bit Kích thước khối 512 bit 512 bit 1024 bit 1024 bit Độ dài từ 32 bit 32 bit 64 bit 64 bit
Trong đề tài của chúng em chỉ tìm hiểu thuật toán băm SHA-512, các phiên bản khác của SHA cũng được thiết kế theo nguyên lý tương tự.
Thuật toán băm SHA-512
SHA-512 là một phiên bản của SHA với đầu ra là giá trị băm có độ dài 512 bit Phiên bản này cũng giống như những phiên bản khác của SHA, được dựa trên nguyên lý Merkle-Damgard.
Hình 2 Nguyên lý Merkle-Damgard 2.2.1 Tiền xử lý khối tin
SHA-512 tạo ra một giá trị băm ở đầu ra có chiều dài 512 bit từ một bản tin gồm nhiều khối Mỗi khối có kích thước 1024 bit.
Cấu trúc của một khối tin đưa vào hàm băm SHA-512 gồm 2 phần: phần đầu là bản tin gốc và phần sau là 128 bit biểu diễn độ dài của bản tin gốc Tuy nhiên, do bản tin gốc có chiều dài bất kỳ (tối đa 2 128 – 1 bit) nên để đảm bảo khối tin đầu vào của hàm băm SHA-512 gồm một số nguyên lần các khối 1024 bit, ta cần phải gắn thêm một chuỗi bit đệm (padding) trước 128 bit độ dài Chuỗi bit đệm này luôn có bit đầu tiên là 1 và các bit còn lại là 0 Độ dài của chuỗi bit đệm phải thỏa mãn:
|M| là chiều dài của bản tin gốc
|P| là chiều dài của chuỗi bit đệm
|L| = 128 là chiều dài của chuỗi bit biểu diễn độ dài bản tin gốc
Hình 3 Cấu trúc của khối tin đưa vào SHA-512
2.2.2 Thực hiện thuật toán băm
Sau khi tiền xử lý khối tin (gắn chuỗi bit đệm và 128 bit chiều dài), ta thu được khối tin gồm t khối 1024 bit (M1,M2,…,Mt) Khối tin này sẽ được đưa vào thực hiện thuật toán băm.
Hình 4 Sơ đồ quá trình thực hiện băm khối tin Ở sơ đồ trên, ta quan tâm tới các hàm nén Mỗi hàm nén f sẽ thực hiện xử lý khối tin nhỏ Mi Đầu vào của hàm này là khối tin Mi (1024 bit) và giá trị Hi-1 (512 bit), đầu ra là giá trị Hi (512 bit) Ta sẽ đi tìm hiểu kĩ hơn về hàm nén này. a Hàm nén
SHA-512 thực hiện trên các từ (words) Một từ được định nghĩa là một chuỗi gồm 64 bit Điều đó có nghĩa là một khối tin Mi có 16 từ và giá trị Hi có 8 từ
Hình 5 Các từ trong khối tin M i và giá trị băm H i
Hàm nén f thực hiện xử lý một khối tin Mi Đầu vào của hàm f là khối tin
Mi (gồm 16 từ) và giá trị Hi-1 (gồm 8 từ) Trong đó, Hi-1 là đầu ra của hàm nén thực hiện xử lý khối tin Mi-1 Nếu ta đang xử lý khối tin đầu tiên (M1) thì Hi-1 là giá trị khởi tạo H0 8 từ của H0 được định nghĩa từ trước:
H0(4) = A54FE53A5F1D36F1 H0(8) = 5BE0CD19137E2179 Đầu ra của hàm nén f là giá trị Hi (gồm 8 từ) được đưa làm đầu vào của hàm nén xử lý khối tin tiếp theo (Mi+1) Nếu ta đang xử lý khối tin cuối cùng (Mt) thì giá trị đầu ra Ht chính là giá trị băm của bản tin gốc ta cần tìm.
Cấu trúc bên trong của hàm nén như sau:
Hình 6 Cấu trúc bên trong của hàm nén
Giá trị đầu vào Hi-1 (gồm 8 từ) được đưa vào thực hiện 80 vòng lặp (0 ÷ 79) sau đó kết quả thu được ở vòng 79 được đem cộng với giá trị đầu vào Hi-1 để thu được giá trị đầu ra Hi (gồm 8 từ) Phép cộng ở đây được thực hiện trong modulo 2 64 Để hiểu rõ hơn về các vòng lặp, ta sẽ đi tìm hiểu hoạt động bên trong của các vòng lặp. b Vòng lặp
Đầu vào của mỗi vòng lặp trong mạng Hash là giá trị có độ dài 512 bit, và đầu ra là giá trị mới có độ dài không đổi Giá trị của các từ được tính bằng công thức đã cung cấp.
+ Hàm RotR(x, n) thực hiện dịch xoay vòng số x sang phải n bit
+ Phép cộng ở đây được thực hiện trong modulo 2 64
Trong quá trình thực hiện một vòng lặp, ta thấy xuất hiện hai từ Ki và Wi (i ở đây tương ứng với chỉ số của vòng lặp trong hàm nén, i = 0 ÷ 79) Cách sinh các từ
Wi sẽ được đề cập đến ở mục sau Còn các từ Ki là constant words được định nghĩa từ trước và được cho trong bảng sau
5FCB6FAB3AD6FA EC
6C44198C4A4758 17 c Mở rộng từ (Word expansion):
Quá trình mở rộng từ là một trong hai quá trình quan trọng nhất trong thuật toán băm SHA-512 bên cạnh quá trình thực hiện hàm nén Kết quả của quá trình này tạo ra 80 từ Wi (i = 0 ÷ 79) được sử dụng trong 80 vòng lặp ở mỗi hàm nén của từng khối tin.
Hình 8 Quá trình mở rộng từ
16 từ đầu tiên W0, W1, W2,…,W15 được lấy trực tiếp từ 16 từ trong khối tin
1024 bit đầu vào của hàm nén, các từ tiếp theo W16, W17,…,W79 được sinh ra theo công thức sau:
Wi = Wi-16RotShift1-8-7(Wi-15)Wi-7RotShift19-61-6(Wi-2), i = 16 ÷ 79
+ Hàm RotShiftl-m-n(x) = RotR(x, l)RotR(x, m)ShR(x, n)
+ Hàm ShR(x, n) thực hiện dịch phải số x đi n bit
Như vậy, ứng với mỗi khối tin Mi (1024 bit), ta thu được một bộ 80 từ W0,
W1,W2,…,W79 Bộ 80 từ này cùng với bộ 80 constant words K0,K1,K2,…,K79 được đưa vào sử dụng trong 80 vòng lặp của hàm nén xử lý khối tin Mi.
Mô phỏng hàm băm SHA-512 và kiểm thử chương trình
Tổng quan chương trình mô phỏng thuật toán SHA-512…
Hình 9 Sơ đồ khối của chương trình mô phỏng thuật toán SHA-512
Chương trình mô phỏng thuật toán SHA-512 gồm 2 module chính là setBlock và implement Module setBlock có nhiệm vụ gắn thêm chuỗi bit đệm và
128 bit chiều dài vào bản tin gốc Module implement có nhiệm vụ thực hiện thuật toán băm đối với khối tin đầu vào.
Bản tin gốc đầu vào là một tệp văn bản (*.txt) có độ dài bất kỳ (nhỏ hơn 2 128 bit), bản tin gốc này được đưa vào module setBlock và thu được một khối tin có chiều dài bằng số nguyên lần của 1024 bit Khối tin này tiếp tục được đưa vào module implement để thực hiện thuật toán băm SHA-512 và thu được ở đầu ra là giá trị băm có chiều dài 512 bit.
Bên trong module implement thực hiện xử lý trên từng khối tin có chiều dài
Hình 10 Xử lý trên khối tin 1024 bit
Khối tin Mi (1024 bit) được đưa vào khối wordExpansion để tạo ra 80 words
Wi 80 words Wi cùng với 80 constant words Ki và giá trị Hi-1 được đưa vào khối compressionFunc để thực hiện xử lý và thu được ở đầu ra là Hi (512 bit) Giá trị Hi này lại tiếp tục được đưa vào xử lý khối tin tiếp theo trong module implement.
Thực hiện mô phỏng với một tệp cụ thể
Sau khi đã tìm hiểu về thuật toán SHA-512 và phân tích, thiết kế các module thực hiện thuật toán Ta đến bước tiếp theo là viết một chương trình mô phỏng thuật toán SHA-512 Chương trình được viết bằng ngôn ngữ lập trình C và được thực hiện bằng trình biên dịch Code Composer Studio v5.5
Hình 11 Giao diện của IDE Code Composer Studio
Ta sẽ thực hiện chương trình mô phỏng với một tệp văn bản có nội dung nói về vị tướng quân Julius Caesar Tệp tin này có kích thước là 40957 Bytes tương ứng với 40957 kí tự trong bảng mã ASCII.
Hình 12 Tệp văn bản dùng để mô phỏng thuật toán SHA-512
Sau khi thực thi chương trình với tệp văn bản JuliusCaesar.txt nói trên Ta thu được giá trị băm có độ dài 512 bit viết ở dạng hexa như sau:
5B13142F1A8C4922572239021E8472222CA0944BB3B915B3CF90F78F5517910EC3C7CCA70D297DDC5E0B112F30D79986FA8A18F98DAF1E96421D0A0887B479C1
Hình 13 Kết quả mô phỏng
Kiểm thử chương trình………………………………….……………………… 19 KẾT LUẬN…………………………………………………………………… .24 PHỤ LỤC
Trên mạng internet cũng có rất nhiều công cụ online hữu ích để thực hiện hàm băm SHA-512, ta có thể sử dụng những công cụ này để kiểm tra kết quả của chương trình mô phỏng Ví dụ: https://passwordsgenerator.net/sha512-hash- generator/
Sử dụng công cụ này để thực hiện thuật toán băm với nội dung trong file
JuliusCaesar.txt, ta thu được kết quả như sau
Hình 14 Giá trị băm thu được bằng công cụ online
So sánh kết quả thu được bằng công cụ online và kết quả của chương trình mô phỏng, ta thấy hoàn toàn trùng khớp.
Bây giờ ta sẽ thay đổi nội dung của file JuliusCaesar.txt một ký tự và quan sát kết quả thu được của chương trình mô phỏng.
Hình 15 Thay đổi 1 ký tự trong file kiểm thử
Giá trị băm nhận được như sau:
9C1146EF9EB1E9EC6CFDC4B6B22118BF82CD4B6166A3B0BDC18EBD1E794F7A4F4A37EBE37FAB6F884AD5D1E23D0EDDD82DBC2689337839AD6CED26E2C5847240
Hình 16 Giá trị băm khi thay đổi 1 ký tự trong tệp
So sánh giá trị băm này với giá trị băm thu được khi thực hiện trên tệp tin chưa sửa đổi, ta thấy sai khác rất lớn (47.852%)
Hình 17 Tỷ lệ sai khác bit khi thay đổi 1 ký tự trong tệp
Ví dụ điển hình là khi truyền tải tệp tin qua đường truyền nhiễu có thể ảnh hưởng và thay đổi một phần nhỏ nội dung tệp tin, khiến tính toàn vẹn của tệp tin bị mất Sự thay đổi này sẽ phản ánh qua sự khác biệt trong giá trị băm của tệp tin ở cả hai đầu phát và nhận Để mô phỏng tình huống này, ta sẽ sử dụng kênh truyền có nhiễu AWGN và thử truyền tệp tin sang người nhận.
Hình 18 Chương trình mô phỏng kênh truyền có nhiễu
Ta thấy nội dung của tệp tin nhận được bên thu đã bị thay đổi một phần so với tệp tin gốc ở bên phát Cụ thể tỷ lệ lỗi bit là BER = 0.000644 dẫn đến sai khác
Hình 19 So sánh nội dung 2 tệp văn bản bên phát và bên thu
Thực hiện chương trình mô phỏng với tệp tin nhận được bên thu, giá trị băm nhận được là:
2503D7B5C61ACF717C91F5C7FCB06E1890D6A84CD7A01238218ECD5FC298 F368F5C989694742CE52BB8D830ED1D418BCFAF9490FC3AE24B1476ABA9E F092AAFC
Hình 20 Tỷ lệ sai khác bit giữa tệp tin bên phát và bên thu
Như vậy, chỉ cần một thay đổi nhỏ trong nội dung của tệp tin cũng làm cho giá trị băm nhận được thay đổi hoàn toàn Điều này giúp tăng tính bảo mật, ngăn chặn sự tấn công của hacker (như giả mạo chữ ký, giả mạo nội dung của bản tin,…)
Hàm băm SHA-512 hiện này được ứng dụng rất rộng rãi trong các hệ thống xác thực, chứng thực số, chữ ký số, kiểm tra độ an toàn của kênh truyền Thuật toán băm này có thể xem là một công cụ hữu ích giúp người dùng bảo vệ các dữ liệu truyền trên mạng internet khỏi sự tấn công của hacker.
Do hạn chế về thời gian và kiến thức nên đề tài của chúng em còn nhiều thiếu sót Chúng em mong nhận được sự góp ý, chỉ bảo của thầy để đề tài của chúng em được hoàn thiện hơn Chúng em xin chân thành cảm ơn!
Phụ lục 1: Mã nguồn chương trình mô phỏng SHA-512
#include typedef unsigned long long word; typedef unsigned char byte;
0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1,
0x510e527fade682d1, 0x9b05688c2b3e6c1f, 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179
0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc, 0x3956c25bf348b538,
0x59f111f1b605d019, 0x923f82a4af194f9b, 0xab1c5ed5da6d8118, 0xd807aa98a3030242, 0x12835b0145706fbe,
0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2, 0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235,
0xc19bf174cf692694, 0xe49b69c19ef14ad2, 0xefbe4786384f25e3, 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65,
0x2de92c6f592b0275, 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5, 0x983e5152ee66dfab,
0xa831c66d2db43210, 0xb00327c898fb213f, 0xbf597fc7beef0ee4, 0xc6e00bf33da88fc2, 0xd5a79147930aa725,
0x06ca6351e003826f, 0x142929670a0e6e70, 0x27b70a8546d22ffc, 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed,
0x53380d139d95b3df, 0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, 0x92722c851482353b,
0xa2bfe8a14cf10364, 0xa81a664bbc423001, 0xc24b8b70d0f89791, 0xc76c51a30654be30, 0xd192e819d6ef5218,
0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8, 0x19a4c116b8d2d0c8, 0x1e376c085141ab53,
0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8, 0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, 0x5b9cca4f7763e373,
0x682e6ff3d6b2b8a3, 0x748f82ee5defb2fc, 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec,
0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, 0xc67178f2e372532b, 0xca273eceea26619c,
0xd186b8c721c0c207, 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178, 0x06f067aa72176fba, 0x0a637dc5a2c898a6,
0x113f9804bef90dae, 0x1b710b35131c471b, 0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc,
0x431d67c49c100d4c, 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817
// Read data from a text file void readFromFile(char* filePath, char* data){
FILE *file = fopen(filePath, "rt"); strcpy(data, ""); char tmp[1000]; while(!feof(file)){ fgets(tmp, 1000, file); strcat(data, tmp);
// Add padding/length bits to get multiple of 1024 bits void setBlock(byte* mess, int messLen, word* block, int* numBlock) {
*numBlock = (messLen + 16) / 128 + 1; int len = *numBlock * 16; int i, j; int isEnd = 0; for(i = 0; i < len - 2; i++) { block[i] = 0; if(isEnd == 0){ for(j = 0; j < 8; j++) { block[i] 1) + ((in & 1)