Điểm:3

Có cách nào dễ dàng để làm cho RSA trong sách giáo khoa đủ an toàn để nó có thể được sử dụng trong cuộc sống thực không?

lá cờ cn

Tôi đã viết một triển khai RSA thô (sách giáo khoa) (chỉ để giải trí) và tôi tự hỏi liệu có cách nào dễ dàng để làm cho nó đủ an toàn để có thể sử dụng nó trong đời thực (không cần triển khai OAEP+ và RSASSA-PSS) không? Có bất kỳ thuật toán đơn giản nào để đệm và tạo chữ ký số an toàn không?

kelalaka avatar
lá cờ in
Và [Lược đồ chữ ký PKCS1-v1_5](https://crypto.stackexchange.com/a/88101/18298) có bằng chứng _from quan điểm bảo mật có thể chứng minh RSA PKCS#1 v1.5 có thể được sử dụng một cách an toàn, nếu độ dài đầu ra của hàm băm chức năng được chọn một cách thích hợp_
Brongs Gaming avatar
lá cờ cn
Cảm ơn câu trả lời, @kelalaka!
Điểm:7
lá cờ my

Trên thực tế, phần đệm chữ ký RSASSA-PKCS1-v1_5 khá đơn giản và không có điểm yếu nào được biết đến (phần đệm RSAES-PKCS1-v1_5 có tên tương tự bị hỏng để mã hóa trừ khi được triển khai theo cách rất cẩn thận; không sử dụng phần đệm đó).

Định dạng đệm là:

00 01 FF FF FF ... FF FF 00 <DER của Loại Băm> <Băm>

ở đâu DER của Loại băm là một chuỗi byte phụ thuộc vào loại hàm băm bạn đã sử dụng và Băm là đầu ra của hàm băm. Đối với SHA-256, DER là chuỗi byte:

30 31 30 0d 06 09 60 86 48 01 65 03 04 02 01 05 00 04 20

Vì vậy, bạn lấy hàm băm của mình, thêm vào trước nó một chuỗi cố định và bạn đã hoàn tất.

Nếu bạn muốn làm cho mọi thứ đơn giản hơn một chút, bạn có thể bỏ qua DER của Loại băm (điều đó có nghĩa là bạn không chính xác là PKCS #1.5, tuy nhiên, nó không đưa ra bất kỳ điểm yếu nào đã biết.

Brongs Gaming avatar
lá cờ cn
Cảm ơn vì câu trả lời! Tôi có hiểu đúng rằng chỉ có thể sử dụng RSASSA-PKCS1-v1_5 để tạo chữ ký số không?
SAI Peregrinus avatar
lá cờ si
Vâng, đó chỉ dành cho chữ ký. Mã hóa RSA chủ yếu hữu ích như một khối xây dựng cho các cấu trúc khác (ví dụ: mã hóa đồng hình). Giải pháp thay thế đơn giản sẽ là RSA-KEM, không phải mã hóa chính xác (nó trao đổi một số ngẫu nhiên được sử dụng để lấy khóa mã hóa để sử dụng với AEAD đối xứng) nhưng đơn giản và an toàn.
poncho avatar
lá cờ my
@BrongsGaming: vâng, vâng, tuy nhiên, câu hỏi đã hỏi 'Có bất kỳ thuật toán đơn giản nào để đệm và tạo chữ ký số an toàn không?' - bạn không yêu cầu các thuật toán đơn giản để mã hóa. Đối với điều đó, cách đơn giản nhất có thể là "không thực hiện phần đệm nào cả; thay vào đó, hãy để bộ mã hóa chọn một giá trị ngẫu nhiên trong khoảng từ 2 đến $n-2$ và RSA trong sách giáo khoa sẽ mã hóa giá trị đó; sử dụng số ngẫu nhiên ban đầu bạn đã chọn để tạo một khóa đối xứng và sử dụng khóa đối xứng đó để mã hóa tin nhắn bạn muốn gửi.
SAI Peregrinus avatar
lá cờ si
Đáng chú ý, RSA-KEM về cơ bản là một phiên bản chính thức hơn (nó chỉ định cách sử dụng số ngẫu nhiên để tạo khóa đối xứng và một vài bit khác về định dạng).
Brongs Gaming avatar
lá cờ cn
Cảm ơn @SAI Peregrinus và @poncho! Xin lỗi vì câu hỏi của tôi không được rõ ràng. Tôi là người mới làm quen với công cụ này và tiếng Anh không phải là ngôn ngữ mẹ đẻ của tôi. :)
Brongs Gaming avatar
lá cờ cn
@poncho, nhưng làm cách nào tôi có thể chuyển số ngẫu nhiên đó một cách an toàn nếu RSA trong sách giáo khoa được coi là không an toàn?
poncho avatar
lá cờ my
@BrongsGaming: lý do RSA trong sách giáo khoa được coi là không an toàn là a) bởi vì nó mang tính quyết định; kẻ tấn công có thể đoán bản rõ và mã hóa chúng - nếu họ đoán đúng, anh ta biết bản rõ và b) Các thuộc tính đồng hình của RSA; nếu giá trị được mã hóa là một số trơn, tức là tích của các số nguyên tố nhỏ, thì kẻ tấn công có thể khôi phục bản rõ đó một cách nhanh chóng một cách đáng kinh ngạc. Cả hai điều này đều không áp dụng cho RSA-KEM (nơi bạn chọn một số n-bit ngẫu nhiên)
poncho avatar
lá cờ my
@Gilles: trên thực tế, RSASSA-PKCS1-v1_5 là định dạng đệm chữ ký (và không thể được sử dụng để mã hóa, vì nó mang tính quyết định). Bạn đang nghĩ về RSAES-PKCS1-v1_5; đó là điểm yếu, tuy nhiên tôi mô tả định dạng đệm RSASSA đủ chi tiết để thực sự không có bất kỳ sự nhầm lẫn nào
Gilles 'SO- stop being evil' avatar
lá cờ cn
Ah, xin lỗi, tôi đã đơn giản hóa câu quá nhiều. Tôi nghĩ điều quan trọng là phải nhấn mạnh rằng chỉ có chữ ký PKCS1v1.5 mới ổn chứ không phải mã hóa PKCS1v1.5.
Điểm:6
lá cờ in

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ừ!.

Brongs Gaming avatar
lá cờ cn
Cảm ơn vì câu trả lời! Ý tưởng thú vị. Nhưng bạn đã yêu cầu kích thước đầu ra từ Shake128 bằng với kích thước mô-đun RSA trong đoạn mã này ở đâu?
kelalaka avatar
lá cờ in
`digest(255)` và lưu ý rằng tôi không khẳng định đây là triển khai an toàn, đặc biệt là đối với các kênh phụ, [thông tin nhỏ](https://crypto.stackexchange.com/q/75408/18298). Bạn có thể cần phải sử dụng một cái an toàn. Xem [cảnh báo của thư viện](https://pypi.org/project/rsa/)
Maarten Bodewes avatar
lá cờ in
Nhận xét không dành cho thảo luận mở rộng; cuộc trò chuyện này về thực tế là chữ ký **gần như FDH** ở trên đã được [chuyển sang trò chuyện](https://chat.stackexchange.com/rooms/131177/discussion-on-answer-by-kelalaka-is- có một cách dễ dàng để làm cho sách giáo khoa-rsa-an toàn).
Ruggero avatar
lá cờ kr
Không phải là giới hạn tốt nhất từ ​​"Bằng chứng bảo mật tối ưu cho Hash miền đầy đủ, Xem lại" bởi Kakvi và Kiltz?
kelalaka avatar
lá cờ in
@Ruggero Có vẻ như tôi đã bỏ lỡ điều đó. Cảm ơn, tôi sẽ cập nhật sau khi đọc thêm ...
Điểm:2
lá cờ vu

Các câu trả lời khác đã đưa ra một cái nhìn tổng quan về các lược đồ chữ ký RSA có các phần đệm đơn giản có thể được sử dụng một cách an toàn.

Tôi muốn thu hút sự chú ý của độc giả đến lược đồ mã hóa "RSA-KEM" (vì câu hỏi này cũng được gắn thẻ OAEP) được chỉ định trong RFC theo dõi tiêu chuẩn (chỉ định việc sử dụng nó trong môi trường Cú pháp thông báo mật mã CMS).

https://datatracker.ietf.org/doc/html/rfc5990#appendix-A

Về bản chất, nó giống như một bộ phận mã hóa đối với "băm miền đầy đủ", trong đó tài liệu chính được thuật toán RSA mã hóa là "toàn miền", nghĩa là, đó là một giá trị được chọn, ngẫu nhiên thống nhất, trong phạm vi $[0,N)$ ở đâu $N$ là mô đun công cộng.

Sau đó, nó sử dụng chức năng dẫn xuất khóa để lấy khóa, sau đó được sử dụng trong mã hóa gói khóa.

Brongs Gaming avatar
lá cờ cn
Cảm ơn vì câu trả lời!

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.