KỸ\r\nTHUẬT MẬT MÃ - CHỮ KÝ SỐ
\r\n\r\nCryptography\r\ntechnique - Digital signature
\r\n\r\nLời nói đầu
\r\n\r\nTCVN 7635:2007 do Tiểu Ban kỹ thuật tiêu\r\nchuẩn TCVN/JTC 1/SC 27 “Các kỹ thuật mật mã” biên soạn trên cơ sở dự\r\nthảo đề nghị của Ban cơ yếu Chính phủ, Tổng cục Tiêu chuẩn Đo lường Chất lượng\r\nđề nghị, Bộ Khoa học và Công nghệ công bố.
\r\n\r\nLời giới thiệu
\r\n\r\nTrong giao dịch giấy tờ truyền thống chữ ký\r\ntay là phương tiện để xác thực nguồn gốc và nội dung của văn bản. Chữ ký tay\r\ncòn có khả năng chống chối bỏ, nghĩa là người gửi sau khi đã ký vào văn bản thì\r\nkhông thể chối bỏ chữ ký của mình và văn bản sau khi được ký thì không thể thay\r\nđổi được nội dung. Đối với văn bản điện tử chữ ký tay không còn đảm bảo được\r\ncác tính năng nói trên, vì vậy chữ ký số điện tử (gọi tắt là chữ ký số) được sử\r\ndụng để thay thế vai trò của chữ ký tay.
\r\n\r\nChữ ký số được biểu diễn dưới dạng một chuỗi\r\nsố nhị phân. Nó được tạo ra trên cơ sở sử dụng tập hợp các quy tắc và tập hợp\r\ncác tham số để xác định danh tính người gửi (người ký) cũng như kiểm tra tính\r\ntoàn vẹn của dữ liệu. Phương tiện cơ bản để thực hiện chữ ký số là kỹ thuật mật\r\nmã. Mỗi chữ ký số được thể hiện trên một lược đồ xác định gọi là lược đồ chữ ký\r\nsố. Lược đồ này bao gồm ba thành tố: thuật toán chữ ký số, thuật toán hàm băm\r\nvà thuật toán tạo số giả ngẫu nhiên. Thuật toán chữ ký số gồm thuật toán ký và\r\nthuật toán kiểm tra. Người gửi sử dụng thuật toán ký và khóa bí mật để tạo ra\r\nchữ ký số, người nhận (người kiểm tra) sử dụng thuật toán kiểm tra và khóa công\r\nkhai tương ứng để kiểm tra đồng thời tính chân thực của thông điệp dữ liệu và\r\ntính chân thực của chữ ký số do người gửi tạo ra. Mỗi người sở hữu một cặp khóa\r\nbao gồm khóa công khai (giả thiết là được công bố một cách công khai) và khóa\r\nbí mật (được giữ bí mật tuyệt đối). Bất kỳ ai cũng có thể kiểm tra chữ ký số\r\ncủa một người nào đó bằng cách sử dụng khóa công khai của người này. Quá trình\r\ntạo chữ ký số chỉ có thể được thực hiện bởi người sở hữu khóa bí mật. Thuật\r\ntoán hàm băm là biến đổi toán học dùng để thu gọn văn bản ban đầu (còn gọi là\r\nthông điệp dữ liệu) nhằm tạo ra bản tóm lược của thông điệp. Bản tóm lược này\r\nsẽ là đầu vào của thuật toán tạo chữ ký số. Chữ ký số được đính kèm với thông\r\nđiệp dữ liệu đã được ký. Trong quá trình kiểm tra chữ ký số, thuật toán hàm băm\r\ncũng được áp dụng như trong quá trình tạo chữ ký. Thuật toán tạo số giả ngẫu\r\nnhiên dùng để tạo ra các số giả ngẫu nhiên (độc lập, đồng xác suất) làm tham số\r\ntrong lược đồ chữ ký số (xem Hình 1). Tiêu chuẩn này quy định 3 thuật toán đó.
\r\n\r\nThuật toán chữ ký số mô tả trong Tiêu chuẩn\r\nnày được xây dựng dựa trên tài liệu: Tiêu chuẩn mật mã RSA: PKC#1 v2.1: RSA\r\nCryptography Standard, ban hành ngày 14 tháng 6 năm 2002.
\r\n\r\nThuật toán hàm băm mô tả trong Tiêu chuẩn này\r\nđược xây dựng dựa trên tài liệu: Tiêu chuẩn hàm băm an toàn (Mỹ): FIPS\r\n180-2: Secure Hash Standard, ban hành ngày 1 tháng 8 năm 2001.
\r\n\r\nHình 1 - Mô tả quá\r\ntrình tạo và kiểm tra chữ ký số
\r\n\r\n\r\n\r\n
KỸ THUẬT MẬT MÃ - CHỮ\r\nKÝ SỐ
\r\n\r\nCryptography\r\ntechnique - Digital signature
\r\n\r\n\r\n\r\nTiêu chuẩn này áp dụng cho các chữ ký số sử\r\ndụng trong hoạt động giao dịch điện tử của mọi tổ chức, công dân Việt Nam và tổ\r\nchức, công dân nước ngoài có quan hệ kinh tế - xã hội với tổ chức, công dân\r\nViệt Nam.
\r\n\r\n\r\n\r\nFIPS 197: Advanced Encryption Standard (Tiêu\r\nchuẩn Mã hóa tiên tiến của Mỹ), ban hành ngày 26 tháng 11 năm 2001.
\r\n\r\n3. Thuật ngữ và định\r\nnghĩa, thuật ngữ viết tắt
\r\n\r\n3.1. Thuật ngữ và định nghĩa
\r\n\r\nTiêu chuẩn này sử dụng các thuật ngữ và định\r\nnghĩa sau đây:
\r\n\r\n3.1.1. Thông điệp dữ liệu (data message)
\r\n\r\nDữ liệu sẽ được ký. Trong quá trình kiểm tra\r\nchữ ký thì đó là dữ liệu đã được ký.
\r\n\r\nTrong tiêu chuẩn này, thông điệp dữ liệu\r\nthường được gọi tắt là thông điệp.
\r\n\r\n3.1.2. Chữ ký số (digital signature)
\r\n\r\nMột chuỗi số, kết quả của phép biến đổi mật\r\nmã trên thông điệp dữ liệu nhằm cung cấp một phương tiện để kiểm tra tính xác\r\nthực của nguồn gốc thông điệp dữ liệu, tính toàn vẹn của dữ liệu và tính không\r\nthể chối bỏ của người đã ký.
\r\n\r\n3.1.3. Hàm băm (hash function)
\r\n\r\nMột thuật toán chuyển đổi mỗi thông điệp biểu\r\ndiễn dưới dạng bit có độ dài bất kỳ thành một chuỗi bit có độ dài cố định.\r\nChuỗi bit có độ dài cố định đó được gọi là “giá trị băm”, “mã băm”, hay đơn\r\ngiản là “tóm lược” của thông điệp đầu vào. Các thuật toán băm mật mã được thiết\r\nkế sao cho thỏa mãn các tính chất sau:
\r\n\r\n1. tính một chiều hay tính kháng tiền ảnh:\r\nKhông thể tìm được trong thời gian cho phép một thông điệp có giá trị băm cho\r\ntrước.
\r\n\r\n2. tính kháng tiền ảnh thứ hai: Cho trước\r\nthông điệp M1, không thể tìm được trong thời gian cho phép một thông điệp M2\r\nkhác M1 sao cho giá trị băm của M1 và M2 là như nhau:
\r\n\r\n3. tính kháng xung đột: Không thể tìm được\r\nhai chuỗi bit khác nhau có cùng một giá trị băm.
\r\n\r\n3.1.4. Quá trình tạo chữ ký số (digital signature\r\ngeneration)
\r\n\r\nQuá trình sử dụng thuật toán chữ ký số và\r\nkhóa bí mật để tạo ra chữ ký số cho thông điệp.
\r\n\r\n3.1.5. Quá trình kiểm tra chữ ký số (digital signature\r\nverification)
\r\n\r\nQuá trình dùng thuật toán chữ ký số và khóa\r\ncông khai để kiểm tra chữ ký số của thông điệp.
\r\n\r\n3.1.6. Bộ tạo số giả ngẫu nhiên (pseudorandom number\r\ngenerator)
\r\n\r\nThiết bị hay thuật toán dùng để tạo ra một\r\ndãy các số giả ngẫu nhiên xuất hiện một cách độc lập thống kê và đồng xác suất.
\r\n\r\n3.2. Từ viết tắt
\r\n\r\n\r\n ASE \r\n | \r\n \r\n Tiêu chuẩn mã hóa tiên tiến (Advanced\r\n Encryption Standard) \r\n | \r\n
\r\n EM SA \r\n | \r\n \r\n Phương pháp định dạng sử dụng trong thuật\r\n toán chữ ký số kèm phụ lục (Encoding Method for Signatures with Appendix) \r\n | \r\n
\r\n FIPS \r\n | \r\n \r\n Tiêu chuẩn xử lý thông tin Liên bang Mỹ (Federal\r\n Information Processing Standard) được ban hành bởi Viện Tiêu chuẩn và\r\n Công nghệ Quốc gia Mỹ (National Institute of Standard and Technology-NIST) \r\n | \r\n
\r\n GCD \r\n | \r\n \r\n Ước số chung lớn nhất (Greatest Common\r\n Divisor) \r\n | \r\n
\r\n hexa \r\n | \r\n \r\n Biểu diễn theo hệ cơ số 16 \r\n | \r\n
\r\n I2OSP \r\n | \r\n \r\n Hàm cơ sở chuyển đổi từ dạng số nguyên sang\r\n chuỗi octet (Integer-to-Octet-String Primitive) \r\n | \r\n
\r\n LCM \r\n | \r\n \r\n Bội số chung nhỏ nhất (Least Common\r\n Multiplier) \r\n | \r\n
\r\n MGF \r\n | \r\n \r\n Hàm tạo mặt nạ (Mask generation\r\n function) \r\n | \r\n
\r\n octet \r\n | \r\n \r\n Bộ 8 bit (còn có thể hiểu là một byte),\r\n được xem như một ký tự trong hệ đếm cơ số 256 biểu diễn dưới dạng một cặp chữ\r\n số của hệ đếm cơ số 16 (hexa) \r\n | \r\n
\r\n OS2IP \r\n | \r\n \r\n Hàm cơ sở chuyển đổi từ chuỗi octet sang số\r\n nguyên (Octet-String-to-Integer-Primitive) \r\n | \r\n
\r\n PKCS \r\n | \r\n \r\n Tiêu chuẩn mật mã khóa công khai (Puplic\r\n Key Cryptography Standard) do Phòng thí nghiệm RSA (Mỹ) ban hành \r\n | \r\n
\r\n PSS \r\n | \r\n \r\n Lược đồ ký xác suất (Probabilistic\r\n Signature Scheme) \r\n | \r\n
\r\n RSA \r\n | \r\n \r\n Tên của hệ mã do ba nhà toán học Rivest,\r\n Shamir và Adleman sáng tạo ra \r\n | \r\n
\r\n RSAVP \r\n | \r\n \r\n Phép toán cơ sở phục vụ cho kiểm tra chữ ký\r\n RSA \r\n | \r\n
\r\n RSASP \r\n | \r\n \r\n Phép toán ký RSA cơ sở \r\n | \r\n
\r\n RSASSA \r\n | \r\n \r\n Lược đồ ký RSA kèm phụ lục (RSA\r\n Signature Scheme with Appendix) \r\n | \r\n
\r\n SHA \r\n | \r\n \r\n Thuật toán băm an toàn (Secure Hash\r\n Algorithm) \r\n | \r\n
\r\n Word \r\n | \r\n \r\n Từ (32 bit) \r\n | \r\n
4.1. Tiêu chuẩn này quy định 3 thành phần cần\r\nthiết cho lược đồ chữ ký số. Thành phần thứ nhất là thuật toán chữ ký số\r\nRSA-PSS được mô tả trong Phần 5. Thành phần thứ 2 là thuật toán hàm băm SHA-256\r\nđược mô tả trong Phần 6 và thành phần cuối cùng là thuật toán số giả ngẫu nhiên\r\ndùng AES-128 được mô tả trong Phần 7. Những tiêu chuẩn về các tham số sử dụng\r\ntrong thuật toán chữ ký số RSA-PSS được đề cập tới trong Phần 8.
\r\n\r\n4.2. Chữ ký số là một dạng chữ ký điện tử được sử\r\ndụng để xác minh người đã ký thông điệp và tính nguyên vẹn của nó.
\r\n\r\n4.3. Thuật toán chữ ký số là thuật toán cho phép\r\nngười ký tạo ra được chữ ký số trên dữ liệu và cho phép người kiểm tra xác minh\r\nđược tính xác thực của chữ ký. Mỗi người có một cặp khóa bao gồm khóa bí mật và\r\nkhóa công khai. Khóa bí mật được sử dụng trong quá trình tạo chữ ký còn khóa\r\ncông khai sử dụng trong quá trình kiểm tra chữ ký. Trong quá trình tạo và kiểm\r\ntra chữ ký, thông điệp M (dạng dữ liệu) được thu gọn nhờ áp dụng thuật toán băm\r\nan toàn (SHA-256). Một người không biết khóa bí mật của người đã ký thông điệp\r\nthì không thể tạo ra được chữ ký đó. Như vậy, chữ ký không thể bị giả mạo. Khi\r\nsử dụng khóa công khai của người ký, bất kỳ ai cũng có thể kiểm tra được tính\r\nchân thực của chữ ký số trên thông điệp đã được ký.
\r\n\r\n4.4. Khi khóa công khai được sử dụng để kiểm tra\r\nchữ ký không tương ứng với khóa bí mật đã được dùng trong việc tạo ra chữ ký\r\nthì không thể kết luận về tính chân thực của chữ ký đó.
\r\n\r\nMột cơ chế cần được thiết lập để gắn kết khóa\r\ncông khai với danh tính của người giữ khóa bí mật tương ứng. Cơ chế này có thể\r\nđạt được nhờ sự chứng thực bởi bên thứ ba được tin cậy. Những nội dung về dịch\r\nvụ chứng thực không thuộc phạm vi của tiêu chuẩn này.
\r\n\r\n5. Thuật toán chữ ký\r\nsố RSA-PSS
\r\n\r\nCác ký hiệu
\r\n\r\n\r\n º \r\n | \r\n \r\n Ký hiệu phép đồng dư, ví dụ: a º b (mod c) có nghĩa là a và b có\r\n cùng số dư khi chia cho c \r\n | \r\n
\r\n c \r\n | \r\n \r\n Biểu diễn của bản mã dưới dạng một số\r\n nguyên trong khoảng từ 0 đến n-1 \r\n | \r\n
\r\n C \r\n | \r\n \r\n Bản mã ở dạng chuỗi Octet \r\n | \r\n
\r\n d \r\n | \r\n \r\n Số mũ bí mật RSA \r\n | \r\n
\r\n dP \r\n | \r\n \r\n Nghịch đảo của e theo môđun p-1 (e·dP\r\n º 1 mod (p-1)) \r\n | \r\n
\r\n dQ \r\n | \r\n \r\n Nghịch đảo của e theo môđun q-1 (e·dQ\r\n º 1 mod (q-1)) \r\n | \r\n
\r\n e \r\n | \r\n \r\n Số mũ công khai RSA \r\n | \r\n
\r\n EM \r\n | \r\n \r\n Thông điệp đã được định dạng (theo EM SA),\r\n chuỗi octet (encoded message) \r\n | \r\n
\r\n GCD(.,.) \r\n | \r\n \r\n Ước chung lớn nhất của 2 số nguyên không âm \r\n | \r\n
\r\n emBits \r\n | \r\n \r\n Độ dài dự kiến theo bit của EM \r\n | \r\n
\r\n emLen \r\n | \r\n \r\n Độ dài dự kiến theo octet của EM \r\n | \r\n
\r\n hLen \r\n | \r\n \r\n Độ dài đầu ra của hàm băm theo octet \r\n | \r\n
\r\n k \r\n | \r\n \r\n Độ dài của môđun RSA (số n) theo octet \r\n | \r\n
\r\n K \r\n | \r\n \r\n Khóa bí mật RSA \r\n | \r\n
\r\n LCM(., . ,.) \r\n | \r\n \r\n Bội số chung nhỏ nhất của một danh sách các\r\n số nguyên không âm \r\n | \r\n
\r\n m \r\n | \r\n \r\n Biểu diễn của thông điệp dưới dạng một số\r\n nguyên trong khoảng từ 0 đến n-1 \r\n | \r\n
\r\n M \r\n | \r\n \r\n Thông điệp dưới dạng chuỗi octet \r\n | \r\n
\r\n mask \r\n | \r\n \r\n Mặt nạ, đầu ra của hàm MGF dưới dạng chuỗi\r\n octet \r\n | \r\n
\r\n maskLen \r\n | \r\n \r\n Độ dài dự kiến của chuỗi mặt nạ theo octet \r\n | \r\n
\r\n MGF \r\n | \r\n \r\n Hàm tạo mặt nạ \r\n | \r\n
\r\n mgfSeed \r\n | \r\n \r\n Mầm tạo mặt nạ, là một chuỗi octet \r\n | \r\n
\r\n mLen \r\n | \r\n \r\n Độ dài của thông điệp M theo octet \r\n | \r\n
\r\n n \r\n | \r\n \r\n Môđun RSA \r\n | \r\n
\r\n (n, e) \r\n | \r\n \r\n Khóa công khai RSA \r\n | \r\n
\r\n p, q \r\n | \r\n \r\n Hai nhân tử nguyên tố của môđun RSA (n = p·q) \r\n | \r\n
\r\n qlnv \r\n | \r\n \r\n Là số nguyên dương nghịch đảo của q\r\n theo môđun p, tức là q · qlnv º 1 mod p \r\n | \r\n
\r\n s \r\n | \r\n \r\n Biểu diễn của chữ ký dưới dạng số nguyên\r\n giữa 0 và n-1 \r\n | \r\n
\r\n S \r\n | \r\n \r\n Chữ ký, ở dạng chuỗi octet \r\n | \r\n
\r\n sLen \r\n | \r\n \r\n Độ dài phần phụ thêm của EM SA-PSS\r\n theo octet \r\n | \r\n
\r\n x \r\n | \r\n \r\n Số nguyên không âm \r\n | \r\n
\r\n X \r\n | \r\n \r\n Biểu diễn của x dưới dạng chuỗi octet \r\n | \r\n
\r\n xLen \r\n | \r\n \r\n Độ dài chủ định của chuỗi octet X\r\n thu được từ x \r\n | \r\n
\r\n l(n) \r\n | \r\n \r\n LCM(p-1, q-1) \r\n | \r\n
\r\n || \r\n | \r\n \r\n Toán tử nối \r\n | \r\n
5.2. Thuật toán RSA
\r\n\r\n5.2.1. Khóa công khai RSA
\r\n\r\nKhóa công khai RSA bao gồm 2 thành phần:
\r\n\r\n\r\n n \r\n | \r\n \r\n Môđun RSA, là một số nguyên dương \r\n | \r\n
\r\n e \r\n | \r\n \r\n Số mũ công khai RSA, là một số nguyên dương \r\n | \r\n
n là tích của hai số nguyên tố lẻ khác nhau và\r\np và q, e là số nguyên giữa 3 và n-1 thỏa mãn điều kiện\r\nGCD(e, l(n) = 1 với l(n) = LCM(p-1, q-1).\r\nSau đây chúng ta qui ước rằng p lớn hơn q.
\r\n\r\n5.2.2. Khóa bí mật RSA
\r\n\r\nKhóa bí mật RSA có một trong hai dạng biểu\r\ndiễn:
\r\n\r\n5.2.2.1. Dạng biểu diễn thứ nhất gồm cặp (n,\r\nd) với:
\r\n\r\n\r\n n \r\n | \r\n \r\n Môđun RSA, là một số nguyên dương \r\n | \r\n
\r\n d \r\n | \r\n \r\n Số mũ bí mật RSA, là một số nguyên dương \r\n | \r\n
Số mũ bí mật d là số nguyên dương nhỏ hơn l(n) thỏa mãn
\r\n\r\ne · d º\r\n1 (mod l(n)).
\r\n\r\n5.2.2.2. Dạng biểu diễn thứ hai chính là (p,\r\nq, dP, dQ, qlnv), trong đó
\r\n\r\n\r\n p \r\n | \r\n \r\n Nhân tử thứ nhất, là số nguyên dương \r\n | \r\n
\r\n q \r\n | \r\n \r\n Nhân tử thứ hai, là số nguyên dương \r\n | \r\n
\r\n dP \r\n | \r\n \r\n Là số nguyên dương sao cho e · dP º 1 mod (p-1) \r\n | \r\n
\r\n dQ \r\n | \r\n \r\n Là số nguyên dương sao cho e · dQ º 1 mod (q-1) \r\n | \r\n
\r\n qlnv \r\n | \r\n \r\n Số nguyên dương nghịch đảo của q theo môđun\r\n p, tức là q · qlnv º\r\n 1 mod p \r\n | \r\n
5.3. Các hàm cơ sở chuyển đổi dữ liệu
\r\n\r\n5.3.1. Hàm cơ sở chuyển đổi dữ liệu số nguyên\r\nsang dạng chuỗi octet
\r\n\r\n\r\n I2OSP (x, xLen) \r\n | \r\n
\r\n\r\n
\r\n Chức năng: \r\n | \r\n \r\n Chuyển số nguyên không âm x thành một chuỗi\r\n octet có độ dài xLen \r\n | \r\n |
\r\n Đầu vào: \r\n | \r\n \r\n x \r\n | \r\n \r\n Số nguyên không âm cần chuyển đổi \r\n | \r\n
\r\n Đầu ra: \r\n | \r\n \r\n X \r\n | \r\n \r\n Chuỗi octet tương ứng có độ dài xLen \r\n | \r\n
\r\n Thông báo lỗi: \r\n | \r\n \r\n “số nguyên quá lớn” \r\n | \r\n
Các bước:
\r\n\r\n1. nếu x ≥ 256xLen,\r\ncho ra thông báo lỗi “số nguyên quá lớn” và dừng
\r\n\r\n2. viết số nguyên x duy nhất gồm xLen\r\nchữ số với cơ số 256:
\r\n\r\nx = xxLen-1·256xLen-1\r\n+ xxLen-2·256xLen-2 + … + x1·256\r\n+ x0
\r\n\r\nvới 0 ≤ xi < 256 (chú ý\r\nrằng một hay nhiều chữ số đầu sẽ bằng 0 nếu x nhỏ hơn 256xLen-1).\r\n
\r\n\r\n3. cho octet Xi giá trị\r\nnguyên xxLen-i với 1 ≤ i ≤ xLen. Cho ra chuỗi\r\noctet
\r\n\r\nX = X1 X2…\r\nXxLen
\r\n\r\n5.3.2. Hàm cơ sở chuyển đổi từ dạng chuỗi\r\noctet về dạng số nguyên
\r\n\r\n\r\n OS2IP (X) \r\n | \r\n
\r\n\r\n
\r\n Chức năng: \r\n | \r\n \r\n Chuyển chuỗi octet thành một số nguyên\r\n không âm \r\n | \r\n |
\r\n Đầu vào: \r\n | \r\n \r\n X \r\n | \r\n \r\n Chuỗi octet cần chuyển đổi \r\n | \r\n
\r\n Đầu ra: \r\n | \r\n \r\n x \r\n | \r\n \r\n Số nguyên không âm tương ứng \r\n | \r\n
Các bước:
\r\n\r\n1. cho X1X2…XxLen\r\nlà các octet của X từ octet đầu tiên với octet cuối cùng, xxLen-i\r\nlà giá trị nguyên của octet Xi với 1 ≤ i ≤ xLen;
\r\n\r\n2. cho x = xxLen-1·256xLen-1\r\n+ xxLen-2·256xLen-2 + … + x1·256\r\n+ x0;
\r\n\r\n3. xuất ra x.
\r\n\r\n5.4. Các phép toán mật mã cơ sở
\r\n\r\n5.4.1. Phép toán cơ sở RSASP
\r\n\r\n\r\n RSASP (K, m) \r\n | \r\n
\r\n\r\n
\r\n Đầu vào: \r\n | \r\n \r\n K \r\n | \r\n \r\n Khóa bí mật RSA, với K có một trong hai\r\n dạng sau: \r\n- cặp (n, d); \r\n- bộ năm (p, q, dP, dQ, qlnv); \r\n | \r\n
\r\n \r\n | \r\n \r\n m \r\n | \r\n \r\n Biểu diễn của thông điệp, dưới dạng số\r\n nguyên giữa 0 và n-1 \r\n | \r\n
\r\n Đầu ra: \r\n | \r\n \r\n s \r\n | \r\n \r\n Biểu diễn của chữ ký, là số nguyên giữa 0\r\n và n-1 \r\n | \r\n
\r\n Thông báo lỗi: \r\n | \r\n \r\n “biểu diễn thông điệp ở ngoài miền hợp lệ” \r\n | \r\n |
\r\n Giả thiết: \r\n | \r\n \r\n K là một khóa bí mật RSA hợp lệ \r\n | \r\n
Các bước:
\r\n\r\n1. nếu biểu diễn của thông điệp m\r\nkhông nằm giữa 0 và n-1, cho ra thông báo lỗi “biểu diễn thông điệp ở\r\nngoài miền hợp lệ” và dừng lại;
\r\n\r\n2. biểu diễn của chữ ký được tính như sau:
\r\n\r\na. nếu dạng thứ nhất (n, d) của K\r\nđược sử dụng thì s = md mod n;
\r\n\r\nb. nếu dạng thứ hai (p, q, dP, dQ, qlnv)\r\ncủa K được sử dụng thì tiến hành như sau:
\r\n\r\ni. Lấy s1 = mdP\r\nmod p và s2 = mdQ mod q
\r\n\r\nii. Đặt h = (s1 - s2)·qlnv\r\nmod p
\r\n\r\niii. Đặt s = s2 + q·h
\r\n\r\nc. xuất ra s.
\r\n\r\n5.4.2. Phép toán cơ sở RSAVP
\r\n\r\n\r\n RSAVP ((n, e), s) \r\n | \r\n
\r\n\r\n
\r\n Đầu vào: \r\n | \r\n \r\n (n, e) \r\n | \r\n \r\n Khóa công khai RSA \r\n | \r\n
\r\n \r\n | \r\n \r\n s \r\n | \r\n \r\n Biểu diễn của chữ ký, là số nguyên giữa 0\r\n và n-1 \r\n | \r\n
\r\n Đầu ra: \r\n | \r\n \r\n m \r\n | \r\n \r\n Biểu diễn của thông điệp, là số nguyên giữa\r\n 0 và n-1 \r\n | \r\n
\r\n Thông báo lỗi: \r\n | \r\n \r\n “biểu diễn chữ ký ở ngoài miền hợp lệ” \r\n | \r\n |
\r\n Giả thiết: \r\n | \r\n \r\n Khóa công khai RSA (n, e) là hợp lệ \r\n | \r\n
Các bước:
\r\n\r\n1. nếu biểu diễn của chữ ký s không nằm giữa\r\n0 và n-1, cho ra “biểu diễn chữ ký ở ngoài miền hợp lệ” và dừng lại;
\r\n\r\n2. đặt m = se mod n;
\r\n\r\n3. xuất ra m.
\r\n\r\n5.5. Lược đồ chữ ký RSA kèm phụ lục theo PSS
\r\n\r\nCác thao tác tạo chữ ký số áp dụng một thao\r\ntác định khuôn dạng vào một thông điệp trước khi nó được chuyển thành một biểu\r\ndiễn thông điệp ở dạng số nguyên. Phép toán cơ sở RSASP được áp dụng vào biểu\r\ndiễn thông điệp này để tạo ra chữ ký số. Đảo ngược quá trình này, các thao tác\r\nkiểm tra chữ ký áp dụng một phép toán cơ sở RSAVP vào một chữ ký để khôi phục\r\nmột biểu diễn thông điệp, sau đó nó được chuyển thành thông điệp đã được định\r\ndạng ở dạng chuỗi octet. Thao tác kiểm tra được áp dụng vào thông điệp ban đầu\r\nvà thông điệp đã được định dạng để xác định xem chúng có tương ứng với nhau hay\r\nkhông.
\r\n\r\n5.5.1. Thao tác tạo chữ ký
\r\n\r\n\r\n RSASSA-PSS-SIGN(K,\r\n M) \r\n | \r\n
\r\n\r\n
\r\n Đầu vào: \r\n | \r\n \r\n K \r\n | \r\n \r\n Khóa bí mật RSA của người ký \r\n | \r\n
\r\n \r\n | \r\n \r\n M \r\n | \r\n \r\n Thông điệp sẽ được ký, là một chuỗi octet \r\n | \r\n
\r\n Đầu ra: \r\n | \r\n \r\n S \r\n | \r\n \r\n Chữ ký, chuỗi octet có độ dài k, với k là\r\n độ dài của môđun RSA theo octet \r\n | \r\n
\r\n Thông báo lỗi: \r\n | \r\n \r\n “văn bản quá dài”, “lỗi định dạng” \r\n | \r\n
Các bước:
\r\n\r\n1. mã hóa EMSA-PSS: Áp dụng thao tác EMSA-PSS-ENCODE\r\n(được giới thiệu ở phần sau) vào văn bản M để tạo ra thông điệp được\r\nđịnh dạng EM có độ dài é(modBits-1)/8ù octet sao cho độ dài bit của số\r\nnguyên OS2IP (EM) nhiều nhất là modBits-1, với modBits là\r\nđộ dài theo bit của số n (mođun RSA):
\r\n\r\nEM = EMSA-PSS-ENCODE (M, modBits-1)
\r\n\r\nChú ý rằng độ dài octet của EM sẽ bằng k - 1\r\nnếu modBits-1 chia hết cho 8 và bằng k nếu modBits-1 không chia\r\nhết cho 8. Nếu hàm EMSA-PSS-ENCODE cho ra thông báo lỗi “văn bản quá dài” thì RSASSA-PSS-SIGN\r\ncũng cho ra thông báo lỗi “văn bản quá dài” và dừng lại. Nếu EMSA-PSS-ENCODE\r\ncho ra thông báo “lỗi định dạng” thì RSASSA-PSS-SIGN cũng cho ra thông báo “lỗi\r\nđịnh dạng” và dừng lại.
\r\n\r\n2. Chữ ký RSA:
\r\n\r\na. chuyển thông điệp đã được định dạng (chuỗi\r\noctet) EM thành biểu diễn thông điệp ở dạng số nguyên m;
\r\n\r\nm = OS2IP (EM)
\r\n\r\nb. áp dụng phép toán cơ sở RSASP với K là\r\nkhóa bí mật RSA và biểu diễn thông điệp m để tạo ra biểu diễn chữ ký là\r\nsố nguyên s:
\r\n\r\ns = RSASP(K, m);
\r\n\r\nc. chuyển chữ ký s dạng số nguyên thành chữ\r\nký S dạng chuỗi octet có độ dài k:
\r\n\r\nS = I2OSP (s, k)
\r\n\r\n3. xuất ra chữ ký S.
\r\n\r\n5.5.2. Thao tác kiểm tra chữ ký
\r\n\r\n\r\n RSASSA-PSS-VERIFY((n, e), M, S) \r\n | \r\n
\r\n\r\n
\r\n Đầu vào: \r\n | \r\n \r\n (n, e) \r\n | \r\n \r\n Khóa công khai RSA của người ký \r\n | \r\n
\r\n \r\n | \r\n \r\n M \r\n | \r\n \r\n Thông điệp mà chữ ký của nó cần được kiểm\r\n tra, là chuỗi octet \r\n | \r\n
\r\n \r\n | \r\n \r\n S \r\n | \r\n \r\n Chữ ký được kiểm tra, chuỗi octet có độ dài\r\n k, với k là độ dài theo octet của số n, môđun RSA \r\n | \r\n
\r\n Đầu ra: \r\n | \r\n \r\n “chữ ký hợp lệ” hoặc “chữ ký không hợp lệ” \r\n | \r\n
Các bước:
\r\n\r\n1. kiểm tra độ dài: Nếu độ dài của chữ ký S\r\nkhông là k octet, cho ra thông báo lỗi “chữ ký không hợp lệ” và dừng;
\r\n\r\n2. kiểm tra chữ ký RS;
\r\n\r\na. chuyển chữ ký S thành biểu diễn chữ ký ở\r\ndạng số nguyên s;
\r\n\r\ns = OS2IP (S)
\r\n\r\nb. áp dụng phép toán cơ sở RSAVP với khóa\r\ncông khai RSA là (n, e) và biểu diễn chữ ký s để tạo ra m là số nguyên\r\nbiểu diễn thông điệp;
\r\n\r\nm = RSAVP ((n, e), s)
\r\n\r\nc. chuyển biểu diễn thông điệp m thành thông\r\nđiệp đã được định dạng EM có độ dài emLen =é(modBits-1/8ù octet, với modBits là độ dài theo\r\nbit của số n (mođun RSA):
\r\n\r\nEM = I2OSP (m, emLen)
\r\n\r\nChú ý rằng emLen sẽ bằng k-1\r\nnếu modBits-1 chia hết cho 8 và bằng k nếu modBits-1 không chia\r\nhết cho 8. Nếu I2OSP cho ra thông báo lỗi “số nguyên quá lớn” thì\r\nRSASSA-PSS-VERIFY cho ra thông báo lỗi “chữ ký không hợp lệ” và dừng lại.
\r\n\r\n3. kiểm tra EMSA-PSS: Áp dụng thao tác\r\nkiểm tra EMSA-PSS-VERIFY (sẽ được mô tả ở phần 5.6 dưới đây) vào thông điệp M\r\nvà thông điệp đã được định dạng EM để xác định xem chúng có tương ứng với nhau\r\nhay không;
\r\n\r\nResult = EMSA-PSS-VERIFY (M, EM, modBits-1)
\r\n\r\n4. nếu kết quả (Result) là “phù hợp” thì cho\r\nra “chữ ký hợp lệ”. Ngược lại sẽ cho ra “chữ ký không hợp lệ”.
\r\n\r\n5.6. Phương pháp định dạng cho chữ ký kèm phụ\r\nlục theo PSS (EMSA-PSS)
\r\n\r\n5.6.1. Thao tác định dạng
\r\n\r\nPhương pháp định dạng được tham số hóa bằng\r\ncách chọn:
\r\n\r\n- hàm băm (cố định với khóa RSA đã cho);
\r\n\r\n- hàm tạo mặt nạ (cố định với khóa RSA đã\r\ncho) và;
\r\n\r\n- độ dài phần phụ thêm (có thể thay đổi với\r\nkhóa RSA đã cho).
\r\n\r\nCác hàm băm và hàm tạo mặt nạ được đề xuất sẽ\r\nđược mô tả trong phần 6 và 5.6.3. Hình 2 minh họa thao tác định dạng.
\r\n\r\nHình 2 - Minh họa\r\nthao tác định dạng
\r\n\r\nCông thức để tính EM:
\r\n\r\n((PD2||r) Å MGF(h(PD1||h(M)||r)))\r\n|| h(PD1||h(M)||r)) || 0xbc
\r\n\r\n\r\n EMSA-PSS-ENCODE (M, emBits) \r\n | \r\n
\r\n\r\n
\r\n Lựa chọn: \r\n | \r\n \r\n h \r\n | \r\n \r\n Hàm băm (độ dài đầu ra của nó theo octet là\r\n hLen) \r\n | \r\n
\r\n \r\n | \r\n \r\n MGF \r\n | \r\n \r\n Hàm tạo mặt nạ \r\n | \r\n
\r\n \r\n | \r\n \r\n sLen \r\n | \r\n \r\n Đô dài chủ định của phần phụ thêm theo\r\n octet \r\n | \r\n
\r\n Đầu vào: \r\n | \r\n \r\n M \r\n | \r\n \r\n Văn bản để mã hóa, là một chuỗi octet \r\n | \r\n
\r\n \r\n | \r\n \r\n emBits độ dài tối đa theo bit của số nguyên\r\n OS2IP (EM), ít nhất bằng 8hLen + 8sLen + 9 \r\n | \r\n |
\r\n Đầu ra: \r\n | \r\n \r\n EM \r\n | \r\n \r\n Văn bản đã được mã, đó là chuỗi octet có độ\r\n dài emLen = éemBits/8ù \r\n | \r\n
\r\n Thông báo lỗi: “lỗi định dạng”; “văn bản\r\n quá dài” \r\n | \r\n
Các bước:
\r\n\r\n1. nếu độ dài của M lớn hơn giới hạn đầu\r\nvào cho hàm băm (264-1 đối với SHA-256 thì cho ra thông báo lỗi “văn\r\nbản quá dài” và dừng;
\r\n\r\n2. lấy mHash = h(M), đó là một chuỗi\r\noctet dài hLen;
\r\n\r\n3. nếu emLen < hLen + sLen +\r\n2, cho ra thông báo “lỗi định dạng” và dừng;
\r\n\r\n4. tạo ra chuỗi octet ngẫu nhiên salt có độ\r\ndài sLen; nếu sLen = 0 thì salt không có;
\r\n\r\n5. đặt M’ = (0x)00 00 00 00 00 00 00\r\n00 || mHash ||salt;
\r\n\r\n6. lấy H = Hash(M’), đó là một chuỗi\r\noctet dài hLen;
\r\n\r\n7. lấy PS là một chuỗi octet bằng 0 dài emLen\r\n- hLen - sLen - 2;
\r\n\r\n8. Lấy DB = PS || 0x01 || salt;\r\nDB là một chuỗi octet dài emLen-hLen - 1;
\r\n\r\n9. lấy maskedDB = DB Å dbMask;
\r\n\r\n10. đặt 8emLen-emBits bit đầu tiên bên\r\ntrái của octet đầu tiên bên trái trong maskedDB bằng 0;
\r\n\r\n11. lấy EM = maskedDB ||H || 0xbc;
\r\n\r\n12. xuất ra EM.
\r\n\r\n5.6.2. Thao tác kiểm tra
\r\n\r\n\r\n EMSA-PSS-VERIFY(M, EM, emBits) \r\n | \r\n
\r\n\r\n
\r\n Lựa chọn: \r\n | \r\n \r\n h \r\n | \r\n \r\n Hàm băm (độ dài đầu ra của nó theo octet là\r\n hLen) \r\n | \r\n
\r\n \r\n | \r\n \r\n MGF \r\n | \r\n \r\n Hàm tạo mặt nạ \r\n | \r\n
\r\n \r\n | \r\n \r\n sLen \r\n | \r\n \r\n Đô dài dự kiến của phần thêm theo octet \r\n | \r\n
\r\n Đầu vào: \r\n | \r\n \r\n M \r\n | \r\n \r\n Thông điệp cần kiểm tra chữ ký, là chuỗi octet \r\n | \r\n
\r\n \r\n | \r\n \r\n EM \r\n | \r\n \r\n Thông điệp đã được định dạng, là chuỗi\r\n octet có độ dài emLen = éemBits/8ù \r\n | \r\n
\r\n \r\n | \r\n \r\n emBits Độ dài tối đa theo bit của số nguyên\r\n OS2IP (EM), tối thiểu là 8hLen + 8sLen + 9 \r\n | \r\n |
\r\n Đầu ra: \r\n | \r\n \r\n “phù hợp” hoặc “không phù hợp”. \r\n | \r\n
Các bước:
\r\n\r\n1. nếu độ dài của M lớn hơn giới hạn\r\nđầu vào của hàm băm (264 - 1 octet đối với SHA-256, thì đưa ra thông\r\nbáo “không phù hợp” và dừng;
\r\n\r\n2. đặt mHash = h(M), là chuỗi octet có\r\nđộ dài hLen;
\r\n\r\n3. nếu emBits < 8hLen+8sLen+9,\r\nđưa ra thông báo “không phù hợp” và dừng;
\r\n\r\n4. nếu octet đầu tiên bên phải của EM không\r\nchứa giá trị bc, đưa ra thông báo “không phù hợp” và dừng;
\r\n\r\n5. đặt maskedDB là emLen-hLen-1\r\noctet đầu tiên bên trái của EM, và H là hLen octet tiếp\r\ntheo;
\r\n\r\n6. nếu 8emLen-emBits bit đầu tiên bên\r\ntrái của octet đầu tiên bên trái trong maskedDB không phải tất cả bằng\r\n0, đưa ra thông báo “không phù hợp” và dừng;
\r\n\r\n7. đặt dbMask = MGF(H, emLen-hLen-1);
\r\n\r\n8. đặt DB = maskedDB Å dbMask;
\r\n\r\n9. thiết lập 8emLen-emBits bit đầu\r\ntiên bên trái của DB bằng 0;
\r\n\r\n10. nếu emLen-hLen-sLen-2 octet đầu\r\ntiên bên trái của DB không phải bằng 0 hoặc nếu octet tại vị trí thử emLen-hLen-sLen-1\r\nkhông bằng 0x01, đưa ra thông báo “không phù hợp” và dừng;
\r\n\r\n11. đặt salt bằng sLen octet\r\ncuối cùng của DB;
\r\n\r\n12. đặt M’ = 00 00 00 00 00 00 00 00 || mHash\r\n|| salt
\r\n\r\nM’ là chuỗi octet có độ dài 8+hLen+sLen\r\nvới 8 octet bằng 0 khởi đầu;
\r\n\r\n13. đặt H’ = h(M’), là chuỗi\r\noctet có độ dài hLen;
\r\n\r\n14. nếu H = H’, đưa ra thông báo “phù\r\nhợp”. Ngược lại, đưa ra thông báo “không phù hợp” .
\r\n\r\n5.6.3. Hàm tạo mặt nạ MGF dựa vào hàm băm
\r\n\r\n\r\n MGF(mgfSeed, maskLen) \r\n | \r\n
\r\n\r\n
\r\n Lựa chọn \r\n | \r\n \r\n h \r\n | \r\n \r\n Hàm băm (độ dài đầu ra của nó theo octet là\r\n hLen) \r\n | \r\n
\r\n Đầu vào: \r\n | \r\n \r\n mgfSeed \r\n | \r\n \r\n Mầm được dùng để tạo mặt nạ, là chuỗi octet \r\n | \r\n
\r\n \r\n | \r\n \r\n maskLen \r\n | \r\n \r\n Độ dài chủ ý theo octet của mặt nạ, nhiều\r\n nhất là 232hLen \r\n | \r\n
\r\n Đầu ra: \r\n | \r\n \r\n mask \r\n | \r\n \r\n Mặt nạ, là chuỗi octet có độ dài maskLen \r\n | \r\n
\r\n Thông báo lỗi: \r\n | \r\n \r\n “mặt nạ quá dài” \r\n | \r\n
Các bước:
\r\n\r\n1. nếu maskLen > 232 hLen,\r\ncho ra thông báo lỗi “mặt nạ quá dài” và dừng;
\r\n\r\n2. lấy T là chuỗi octet rỗng;
\r\n\r\n3. với counter chạy từ 0 tới émaskLen/hLenù -1, thực hiện các bước
\r\n\r\na. chuyển counter thành một chuỗi\r\noctet C có độ dài 4 octet;
\r\n\r\nC = I2OSP (counter, 4)
\r\n\r\nb. nối hàm mgfSeed với C, tính hàm băm\r\ncủa chuỗi này. Sau đó nối chuỗi octet T với giá trị băm vừa thu được.
\r\n\r\nT = T || h(mgfSeed || C)
\r\n\r\n4. xuất ra maskLen octet đầu tiên của\r\nT như là chuỗi octet mask.
\r\n\r\n\r\n\r\n6.1. Một số khái niệm và thuật ngữ
\r\n\r\n6.1.1. Biến, tham số
\r\n\r\n\r\n a, b, c,…, h \r\n | \r\n \r\n Các biến làm việc, các biến này là các từ\r\n 32 bit được sử dụng để tính toán các giá trị băm H(i) \r\n | \r\n
\r\n H(i) \r\n | \r\n \r\n Giá trị băm thứ i. H(0)\r\n là giá trị băm khởi tạo. H(N) là giá trị băm cuối cùng được\r\n sử dụng để xác định bản tóm lược của văn bản \r\n | \r\n
\r\n Hj(i) \r\n | \r\n \r\n Từ thứ j của giá trị băm thứ i,\r\n H0(i) là từ ngoài cùng bên trái của giá trị băm\r\n thứ i. \r\n | \r\n
\r\n Kt \r\n | \r\n \r\n Hằng số được sử dụng cho vòng lặp thứ t\r\n của quá trình băm \r\n | \r\n
\r\n k \r\n | \r\n \r\n Số lượng bit 0 được bổ sung cho thông điệp\r\n trong bước bổ sung dữ liệu \r\n | \r\n
\r\n l \r\n | \r\n \r\n Độ dài của thông điệp (ký hiệu là M)\r\n theo đơn vị bit \r\n | \r\n
\r\n m \r\n | \r\n \r\n Số lượng bit trong một khối thông điệp (M(i)) \r\n | \r\n
\r\n M \r\n | \r\n \r\n Thông điệp cần băm \r\n | \r\n
\r\n M(i) \r\n | \r\n \r\n Khối thông điệp thứ l \r\n | \r\n
\r\n Mj(i) \r\n | \r\n \r\n Từ thứ j của khối thông điệp thứ i.\r\n M0(i) là từ ngoài cùng bên trái của khối thông\r\n điệp thứ l \r\n | \r\n
\r\n n \r\n | \r\n \r\n Số lượng các bit quay vòng hoặc dịch đi khi\r\n xử lý một từ \r\n | \r\n
\r\n N \r\n | \r\n \r\n Số khối của bản thông điệp sau khi đã được\r\n bổ sung \r\n | \r\n
\r\n T \r\n | \r\n \r\n Biến tạm thời lưu trữ (32 bit) trong quá\r\n trình tính toán \r\n | \r\n
\r\n Wt \r\n | \r\n \r\n Từ (32 bit) thứ t trong chuỗi thông\r\n điệp. \r\n | \r\n
6.1.2. Các ký hiệu tính toán
\r\n\r\n\r\n ^ \r\n | \r\n \r\n Phép AND bit \r\n | \r\n
\r\n v \r\n | \r\n \r\n Phép OR bit \r\n | \r\n
\r\n Å \r\n | \r\n \r\n Phép XOR bit \r\n | \r\n
\r\n Ø \r\n | \r\n \r\n Phép bù bit \r\n | \r\n
\r\n + \r\n | \r\n \r\n Phép cộng mođun 232 \r\n | \r\n
\r\n << \r\n | \r\n \r\n Phép dịch trái, x<<n có nghĩa\r\n là dịch x đi n bit sang trái (loại bỏ n bit ngoài cùng\r\n bên trái) bổ sung n bit 0 vào bên phải; \r\n | \r\n
\r\n >> \r\n | \r\n \r\n Phép dịch phải, x>>n có nghĩa\r\n là dịch x đi n bit sang phải (loại bỏ n bit ngoài cùng\r\n bên phải) bổ sung n bit 0 vào bên trái. \r\n | \r\n
6.1.3. Chuỗi các bit và các số nguyên
\r\n\r\n● một chữ số hexa là một phần tử thuộc tập\r\n{0, 1,… 9, a,… f};
\r\n\r\n● một từ là một chuỗi 32 bit có thể được biểu\r\ndiễn bởi dãy các số hexa (8 chữ số hexa). Để chuyển đổi một chuỗi bit thành\r\ndạng một chuỗi hexa chúng ta có thể lần lượt chuyển đổi từng bộ 4 bit thành một\r\nsố hexa tương ứng;
\r\n\r\n● một số nguyên lớn hơn bằng 0 và nhỏ hơn 264\r\ncó thể được biểu diễn như một từ (nếu nhỏ hơn 232) hoặc một cặp từ\r\n(nếu lớn hơn hoặc bằng 232). Chúng ta có thể dùng hai từ, để biểu\r\ndiễn độ dài của thông điệp theo bit;
\r\n\r\n● đối với SHA-256, mỗi khối thông điệp gồm\r\n512 bit, nó được biểu diễn dưới dạng 16 từ (32 bit).
\r\n\r\n6.1.4. Các phép tính với các từ
\r\n\r\n● các phép tính logic từng bit với từ: Ù, Ú,\r\nÅ , và Ø;
\r\n\r\n● cộng hai từ môđun 232;
\r\n\r\n● phép dịch phải SHRn(x),\r\nvới x là một từ (32 bit) và n là một số nguyên 0 ≤ n < 32, được định\r\nnghĩa như sau;
\r\n\r\nSHRn(x) = x >> n.
\r\n\r\n● phép dịch vòng phải ROTRn(x),\r\nvới x là một từ (32 bit) và n là một số nguyên 0 ≤ n < 32, được định\r\nnghĩa như sau.
\r\n\r\n\r\n ROTRn(x) = (x >> n) V\r\n (x << 32 - n) \r\n | \r\n
Tức là lấy n bit loại ra ở phía cuối\r\nbổ sung vào phía đầu theo đúng thứ tự đã có từ trước
\r\n\r\n6.2. Thuật toán
\r\n\r\n6.2.1. Các hàm và các hằng được sử dụng cho\r\nthuật toán
\r\n\r\n6.2.1.1. Các hàm
\r\n\r\nSHA-256 sử dụng 6 hàm logic, mỗi hàm đều thực\r\nhiện trên các từ (32 bit), các từ này được biểu diễn bởi các biến x, y, z. Kết\r\nquả đầu ra của các hàm này là một từ 32 bit mới.
\r\n\r\nCh(x, y, z) = (x Ù y) Å (Ø x Ù z)
\r\n\r\nMaj(z, y, x) = (x Ù y) Å (x Ù\r\nz) Å (y Ù z)
\r\n\r\n= ROTR2(x)\r\nÅ ROTR13(x)\r\nÅ ROTR22(x)
= ROTR6(x)\r\nÅ ROTR11(x)\r\nÅ ROTR25(x)
= ROTR7(x)\r\nÅ ROTR18(x)\r\nÅ SHR3(x)
= ROTR17(x)\r\nÅ ROTR19(x)\r\nÅ SHR10(x)
6.2.1.2. Các hằng số
\r\n\r\nSHA-256 sử dụng chuỗi 64 từ (32 bit) làm hằng\r\nsố, . Các từ này lần lượt là 32 bit đầu\r\ntiên của phần thập phân khi lấy căn bậc ba 64 số nguyên tố đầu tiên. Khi biểu\r\ndiễn dưới dạng hexa các hằng số có giá trị như liệt kê dưới đây:
6.2.2. Bước tiền xử lý
\r\n\r\nTiền xử lý được thực hiện trước khi bắt đầu\r\ntính toán giá trị băm. Bước tiền xử lý được chia làm 3 bước nhỏ: bổ sung thông\r\nđiệp, chia thông điệp đã được bổ sung thành các khối, và thiết lập các giá trị\r\nbăm khởi đầu H(0).
\r\n\r\n6.2.2.1. Bổ sung thông điệp
\r\n\r\nGiả sử thông điệp M có độ dài là l\r\nbit, bổ sung bit “1” vào cuối thông điệp, tiếp theo là k bit 0, với k thỏa mãn l+1+k\r\n= 448 mod 512. Cuối cùng bổ sung một khối 64 bit để lưu giá trị l (độ\r\ndài thật của thông điệp). Như vậy thông điệp sau khi đã được bổ sung có độ dài\r\nlà bội của 512 bit.
\r\n\r\n6.2.2.2. Chia thông điệp thành khối sau khi\r\nđã được bổ sung
\r\n\r\nThông điệp sau khi đã được bổ sung được chia\r\nthành N khối 512 bit, M(1), M(2),…, M(N).\r\nMỗi khối thông điệp gồm 16 từ (32 bit). 32 bit đầu tiên của khối thông điệp thứ\r\ni là , 32 bit tiếp theo là
và 32 bit cuối cùng của khối thông\r\nđiệp thứ i là
.
6.2.2.3. Thiết lập các giá trị băm khởi đầu H(0)
\r\n\r\nCác giá trị băm khởi đầu gồm 8 từ (32 bit):
\r\n\r\n6.2.3. Thuật toán tính giá trị băm
\r\n\r\nSHA-256 được sử dụng để tính giá trị băm của\r\nmột thông điệp có độ dài là l, với 0 ≤ l < 264.\r\nThuật toán sử dụng một chuỗi 64 từ (32 bit) được tạo ra từ một khối thông điệp\r\nđầu vào, 8 biến làm việc cho mỗi từ 32 bit, giá trị băm trung gian gồm 8 từ (32\r\nbit), kết quả cuối cùng của SHA-256 là 256 bit mã băm hay còn gọi là bản tóm\r\nlược thông điệp.
\r\n\r\nCác từ tạo tạo ra từ khối thông điệp đầu vào\r\nđược ký hiệu là W0,W1,…,W63, tám biến\r\nlàm việc được ký hiệu là a, b, c, d, e, f, g và h. Các từ của kết\r\nquả băm được ký hiệu là , chúng được gán\r\ncác giá trị băm khởi đầu, H(0), và sẽ được thay thế bởi các\r\ngiá trị băm trung gian (sau khi mỗi khối thông điệp được xử lý), H(i),\r\nvà cuối cùng là giá trị băm, H(N).
6.2.3.1. Tiền xử lý SHA-256
\r\n\r\nThông điệp M được xử lý như mục 6.2.2.
\r\n\r\n6.2.3.2. Tính toán giá trị băm SHA-256
\r\n\r\nViệc tính toán giá trị băm SHA-256 sử dụng\r\ncác hàm và hằng được định nghĩa trong phần 6.2.1. Phép tính “+” được xem là\r\ncộng môđun 232.
\r\n\r\nSau khi hoàn thành bước tiền xử lý, mỗi khối\r\nthông điệp, M(1), M(2),…, M(N) tuần tự\r\nđược xử lý theo các bước dưới đây:
\r\n\r\nVới i từ 0 đến n
\r\n\r\n{
\r\n\r\n1. Tính các từ Wt từ khối\r\nthông điệp
\r\n\r\n\r\n Wt = | \r\n \r\n với 0 ≤ t ≤ 15 \r\n | \r\n
\r\n | \r\n \r\n với 16 ≤ t ≤ 63 \r\n | \r\n
2. Khởi gán tám biến làm việc a, b, c, d, e,\r\nf, g và h bằng các giá trị băm thứ (i - 1)
\r\n\r\n3. với t từ 0 đến 63, tính
\r\n\r\n{
\r\n\r\nh=g
\r\n\r\ng=f
\r\n\r\nf=e
\r\n\r\ne=d+T1
\r\n\r\nd=c
\r\n\r\nc=b
\r\n\r\nb=a
\r\n\r\na=T1+T2
\r\n\r\n}
\r\n\r\n4. Tính giá trị băm trung gian thứ i, H(i)
\r\n\r\nSau khi xử lý N lần (tương ứng với N khối\r\nthông điệp), kết quả đầu ra hàm băm SHA-256 của thông điệp M là:
\r\n\r\n||
||
||
||
||
||
||
6.2.4. Dữ liệu kiểm tra
\r\n\r\nĐể giúp các nhà lập trình kiểm tra tính đúng\r\nđắn của chương trình do mình xây dựng, TCVN này đưa ra các giá trị được sử dụng\r\nđể kiểm tra:
\r\n\r\n6.2.4.1. Thông điệp đầu vào chỉ có một khối
\r\n\r\n6.4.4.2. Thông điệp đầu vào gồm nhiều khối
\r\n\r\n6.2.4.3. Đầu vào là một thông điệp dài
\r\n\r\n7. Bộ tạo số giả ngẫu\r\nnhiên dùng AES-128
\r\n\r\nPhần này sẽ mô tả bộ tạo số giả ngẫu nhiên sử\r\ndụng thuật toán mã hóa AES-128.
\r\n\r\n7.1. Một số ký hiệu
\r\n\r\n\r\n AESK(M) \r\n | \r\n \r\n Hàm mã hóa AES-128. Thực hiện việc mã hóa\r\n khối thông điệp M (128 bit) bởi khóa K (128 bit). Trả về 128 bít dữ liệu đã\r\n mã của M (Chi tiết về hàm AES-128 được nêu trong tài liệu FIPS 197 “Advanced\r\n Encryption Standard”) \r\n | \r\n
\r\n DTj \r\n | \r\n \r\n Giá trị 128 bit, là ngày tháng/thời gian\r\n (date/time) của hệ thống \r\n | \r\n
\r\n XOR \r\n | \r\n \r\n Phép toán XOR bit \r\n | \r\n
\r\n éxù \r\n | \r\n \r\n Số nguyên bé nhất lớn hơn hay bằng x, ví\r\n dụ: é6ù = é5.1ù\r\n = 6 \r\n | \r\n
\r\n ¬ \r\n | \r\n \r\n Phép gán giá trị; ví dụ: a ¬ b có nghĩa là gán b cho a \r\n | \r\n
7.2. Thuật toán
\r\n\r\nĐầu vào:
\r\n\r\n\r\n L \r\n | \r\n \r\n Số bit cần tạo ngẫu nhiên \r\n | \r\n
\r\n V0 \r\n | \r\n \r\n 128 bit ngẫu nhiên, lựa chọn bởi người dùng \r\n | \r\n
\r\n DTj \r\n | \r\n \r\n 128 bit là ngày tháng/thời gian của hệ\r\n thống \r\n | \r\n
\r\n K \r\n | \r\n \r\n 128 bit khóa cho AES-128 \r\n | \r\n
Đầu ra:
\r\n\r\nSố giả ngẫu nhiên p có L bit
\r\n\r\nCác bước:
\r\n\r\np = null
\r\n\r\nvới j từ 1 đến éL/128ù,\r\nthực hiện các bước sau:
\r\n\r\nIj = AESK(DTj)
\r\n\r\nxj = AESK(Ij XOR\r\nVj-1)
\r\n\r\nVj = AESK(Ij XOR\r\nxj)
\r\n\r\np ¬\r\np || xj
\r\n\r\np ¬\r\nLấy L bit bên trái của p
\r\n\r\n8. Tiêu chuẩn tham số\r\nsử dụng trong chữ ký số RSA-PSS
\r\n\r\nĐể sử dụng lược đồ chữ ký số RSA-PSS an toàn\r\ncần phải tuân thủ các yêu cầu sau đây:
\r\n\r\n8.1. Các yêu cầu chung
\r\n\r\n1. cặp khóa RSA dùng để ký thì không được\r\ndùng cho mục đích khác (chẳng hạn dùng lại để mã thông điệp);
\r\n\r\n2. hai số nguyên tố p, q và số mũ bí mật d\r\ncần phải được giữ bí mật tránh việc bị truy cập bất hợp pháp, làm lộ hoặc sửa\r\nđổi. Môđun n và số mũ công khai e phải được công bố công khai;
\r\n\r\n3. mỗi người sử dụng cần có môđun n riêng;
\r\n\r\n4. độ dài của môđun n (nlen)\r\nkhông được nhỏ hơn 1024 bit và nên được thay đổi theo thời gian như sau:
\r\n\r\n\r\n Thời gian sử dụng \r\n | \r\n \r\n Độ an toàn \r\n | \r\n \r\n nlen tối thiểu \r\n | \r\n
\r\n Tới năm 2010 \r\n | \r\n \r\n 80 \r\n | \r\n \r\n 1024 \r\n | \r\n
\r\n Tới năm 2013 \r\n | \r\n \r\n 112 \r\n | \r\n \r\n 2048 \r\n | \r\n
\r\n Sau 2030 \r\n | \r\n \r\n 128 \r\n | \r\n \r\n 3072 \r\n | \r\n
Trong đó, độ an toàn (security_strength)\r\nlà một số nguyên biểu thị lượng tính toán cần thiết để phá hệ mã.
\r\n\r\nVì các phương pháp phá hệ mã thường xuyên\r\nđược hoàn thiện nên cần phải định kỳ 3 đến 5 năm một lần xem xét lại nlen\r\ntối thiểu (có thể tham khảo chi tiết yêu cầu này trong tài liệu NIST Special\r\nPublication 800-57. Recommendation for Key Management - Part 1: general,\r\nMay,2006).
\r\n\r\n8.2. Yêu cầu đối với các khóa RSA
\r\n\r\n1. số mũ công khai e cần phải được\r\nchọn với các ràng buộc sau:
\r\n\r\na) số mũ công khai e cần được chọn\r\ntrước khi tạo số mũ bí mật d;
\r\n\r\nb) số mũ công khai e cần phải là số\r\nnguyên dương lẻ sao cho: 65,537 ≤ e < 2nlen-2 x security_strength
\r\n\r\nVới nlen là độ dài của môđun n\r\ntheo bit.
\r\n\r\nChú ý rằng e có thể là giá trị bất kỳ mà thỏa\r\nmãn ràng buộc 1(b); p và q sẽ được chọn (trong mục 2) sao cho e là\r\nnguyên tố cùng nhau với cả (p-1) và (q-1).
\r\n\r\n2. hai số nguyên tố p và q được\r\ntạo ngẫu nhiên và giữ bí mật cần phải được chọn với các ràng buộc sau:
\r\n\r\na) (p-1) và (q-1) cần phải\r\nnguyên tố cùng nhau với số mũ công khai e;
\r\n\r\nb) mỗi một số trong bốn số (p + 1), (p - 1)\r\nvà (q + 1), (q - 1) cần phải có các nhân tử nguyên tố lớn hơn 2security_strength+20;
\r\n\r\nc) nhân tử nguyên tố bí mật p, q cần\r\nphải được chọn ngẫu nhiên từ các số nguyên tố thỏa mãn ;
3. số mũ bí mật d cần phải được lựa\r\nchọn sau khi tạo p và q với các ràng buộc:
\r\n\r\na) số mũ d cần phải lớn hơn 2nlen/2,\r\nvà
\r\n\r\nb) d = e-1\r\nmod (LCM ((p-1), (q-1))).
\r\n\r\n(Chi tiết về hàm tạo các tham số RSA có thể\r\ntham khảo trong tài liệu FIPS 186-3: Digital Signature Standard).
\r\n\r\n\r\n\r\n
MỤC LỤC
\r\n\r\nLời nói đầu
\r\n\r\nLời giới thiệu
\r\n\r\n1. Phạm vi áp dụng
\r\n\r\n2. Tài liệu viện dẫn
\r\n\r\n3. Thuật ngữ và định nghĩa, thuật ngữ viết\r\ntắt
\r\n\r\n3.1. Thuật ngữ và định nghĩa
\r\n\r\n3.1.1. Thông điệp dữ liệu (data message)
\r\n\r\n3.1.2. Chữ ký số (digital signature)
\r\n\r\n3.1.3. Hàm băm (hash function)
\r\n\r\n3.1.4. Quá trình tạo chữ số (digital\r\nsignature generation)
\r\n\r\n3.1.5. Quá trình kiểm tra chữ ký số (digital\r\nsignature verification)
\r\n\r\n3.1.6. Bộ tạo số giả ngẫu nhiên (Pseudorandom\r\nnumber generator)
\r\n\r\n3.2. Từ viết tắt
\r\n\r\n4. Khái quát
\r\n\r\n5. Thuật toán chữ ký số RSA-PSS
\r\n\r\nCác ký hiệu
\r\n\r\n5.2. Thuật toán RSA
\r\n\r\n5.2.1. Khóa công khai RSA
\r\n\r\n5.2.2. Khóa bí mật RSA
\r\n\r\n5.3. Các hàm cơ sở chuyển đổi dữ liệu
\r\n\r\n5.3.1. Hàm cơ sở chuyển đổi từ dạng số nguyên\r\nsang dạng chuỗi octet
\r\n\r\n5.3.2. Hàm cơ sở chuyển đổi từ dạng chuỗi\r\noctet về dạng số nguyên
\r\n\r\n5.4. Các phép toán mật mã cơ sở
\r\n\r\n5.4.1. Phép toán cơ sở RSASP
\r\n\r\n5.4.2. Phép toán cơ sở RSAVP
\r\n\r\n5.5. Lược đồ chữ ký RSA kèm phụ lục theo PSS
\r\n\r\n5.5.1. Thao tác tạo chữ ký
\r\n\r\n5.5.2. Thao tác kiểm tra chữ ký
\r\n\r\n5.6. Phương pháp định dạng cho chữ ký kèm phụ\r\nlục theo PSS (EMSA-PSS)
\r\n\r\n5.6.1. Thao tác định dạng
\r\n\r\n5.6.2. Thao tác kiểm tra
\r\n\r\n5.6.3. Hàm tạo mặt nạ MGF dựa vào hàm băm
\r\n\r\n6. Hàm băm SHA-256
\r\n\r\n6.1. Một số khái niệm và thuật ngữ
\r\n\r\n6.1.1. Biến, tham số
\r\n\r\n6.1.2. Các ký hiệu tính toán
\r\n\r\n6.1.3. Chuỗi các bit và các số nguyên
\r\n\r\n6.1.4. Các phép tính với các từ
\r\n\r\n6.2. Thuật toán
\r\n\r\n6.2.1. Các hàm và các hằng được sử dụng cho\r\nthuật toán
\r\n\r\n6.2.2. Bước tiền xử lý
\r\n\r\n6.2.3. Thuật toán tính giá trị băm
\r\n\r\n6.2.4. Dữ liệu kiểm tra
\r\n\r\n7. Bộ tạo số giả ngẫu nhiên dùng AES-128
\r\n\r\n7.1. Một số ký hiệu
\r\n\r\n7.2. Thuật toán
\r\n\r\n8. Tiêu chuẩn tham số sử dụng trong chữ ký số\r\nRSA-PSS
\r\n\r\n8.1. Các yêu cầu chung
\r\n\r\n8.2. Yêu cầu đối với các khóa RSA
\r\n\r\nFile gốc của Tiêu chuẩn quốc gia TCVN 7635:2007 về Kỹ thuật mật mã – Chữ ký số đang được cập nhật.
Tiêu chuẩn quốc gia TCVN 7635:2007 về Kỹ thuật mật mã – Chữ ký số
Tóm tắt
Cơ quan ban hành | Đã xác định |
Số hiệu | TCVN7635:2007 |
Loại văn bản | Tiêu chuẩn Việt Nam |
Người ký | Đã xác định |
Ngày ban hành | 2007-01-01 |
Ngày hiệu lực | |
Lĩnh vực | Xây dựng - Đô thị |
Tình trạng | Còn hiệu lực |