Ngoài ra còn có một sơ đồ chữ ký đơn giản hơn nhưng không nổi tiếng cho RSA;
Nó tồn tại không thể bị giả mạo dưới các cuộc tấn công thông điệp được chọn thích ứng trong mô hình tiên tri ngẫu nhiên.
Ngày nay RSA-FDH rất đơn giản;
- Dấu hiệu: $\sigma = Dấu(H, m) = (H(m))^d \bmod n$
- Thẩm tra: $\{0,1\} = Verify(H, m, \sigma) = [\sigma^e \bmod n \overset{?}= H(m) \bmod n]$
Khi đó không dễ để ký vì yêu cầu về kích thước; hàm băm $H$ phải có kích thước đầu ra bằng kích thước mô-đun RSA. Bây giờ, sự lựa chọn rõ ràng là eXcó thể uốn cong Ôđầu ra Fchú thích (XOF) như LẮC128/LẮC256 của SHA-3.
Yêu cầu kích thước đầu ra từ SHAKE128(hoặc SHAKE256) bằng kích thước mô-đun RSA, băm nó rồi ký, thế là xong!
nhập hashlib
nhập khẩu rsa
(pubkey, privatekey) = rsa.newkeys(2048)
FHD = hashlib.shake_128()
FHD.update(b'Message to Sign')
digestFDH = int.from_bytes(FHD.digest(255),byteorder='little')
#chỉ m^d mod n
đã ký = rsa.core.decrypt_int(digestFDH,privkey.d,pubkey.n)
#chỉ tôi^e mod n
nếu digestFDH == rsa.core.encrypt_int(đã ký,pubkey.e,pubkey.n):
in ("Đã xác minh")
khác:
print("!!!Xác minh thất bại. Dừng!!!")
Định nghĩa chính xác như trong bài báo năm 1998 (không có trong ngoặc kép)
Thuật toán ký và xác minh có quyền truy cập oracle
đến một hàm băm $H_{FDH} : \{0, 1\}^â \to \mathbb{Z}^*_N$. Tạo và xác minh chữ ký như sau:
$\operatorname{SignFDH}_{N,d}(M) $
$\quad y \leftarrow H_{FDH}(M)$
$\quad \text{return }y^d \bmod N$
$\operatorname{VerifyFDH}_{N,e}(M, x)$
$\quad y \leftarrow x^e \bmod N;$
$\quad y' \leftarrow H_{FDH}(M)$
$\quad\text{if }y = y' \text{ then return }1 \text{ other return } 0$
và lưu ý rằng, ít nhất một số yếu tố của $\mathbb{Z}_N^*$ không thể được xuất ra bởi một XOF tiêu chuẩn. Mô-đun không phải là lũy thừa chính xác của 2, vì vậy người ta cần xuất ít hơn một chút so với mô-đun. Thư viện mà tôi đã sử dụng để triển khai mẫu sử dụng byte cho kích thước đầu ra, do đó, nó không thể bao gồm tối đa 8 bit.
Ngoài ra, đầu ra hoàn toàn bằng không được loại trừ!.