Rsa

為什麼使用 SHA256-RSA-PKCS 簽名的數據和使用 RSA-PKCS 簽名的摘要不同?

  • December 19, 2020

我需要使用 RSA 簽署一些數據。我有可以簽名的摘要,但簽名結果與簽名源數據不同。

data.bin 中有數據,digest.bin 中有其 sha256 摘要

$ xxd -p -c32 digest.bin
19d512fc649e1668eb84741284ad95ec03f3225719a83e40389dbade4eabe5ed
$ sha256sum data.bin 
19d512fc649e1668eb84741284ad95ec03f3225719a83e40389dbade4eabe5ed  data.bin

為什麼使用 SHA256-RSA-PKCS 簽署數據和使用 RSA-PKCS 簽署摘要時簽名不同?在這兩種情況下,都應該創建相同的 sha256 摘要然後簽名。

$ pkcs11-tool --module /usr/lib/libIDPrimePKCS11.so --pin=$PIN --slot 0x11 --sign --input-file data.bin --mechanism SHA256-RSA-PKCS |base64 -w0
Using signature algorithm SHA256-RSA-PKCS
N4XkgBhyu5fAFTSraEj4RlKeyKy2fyUD4kv9QgBVmRl/u0jDYuPdQ/Gr0Hf2wRD8B3AWe98Y3WWtv5/c2NILosG5VzqrQEKVFKLCLkdpV7cQoSDkzAv0YjRRWKMJPr1Y9Vwi15yua17W8JqnqAc0D/Mda68qgugxgCzfwC+BkWnjsN3EaxixIzwZ9aMbfuBbA8R/+uRZMdPHc6w/aFIhSM9sS3jyeb2ZYy7semPlFMAx1BQx4C2uGlEW5GI7BCq1sTCchuB0baR4WX+yoHp+bRsJHWjEcXmgFloxfb6k0n3rvZOZboO0h9UPbxlxFxHou1v6UqymNgnt+oC1KkclRQ==

$ pkcs11-tool --module /usr/lib/libIDPrimePKCS11.so --pin=$PIN --slot 0x11 --sign --input-file digest.bin --mechanism RSA-PKCS |base64 -w0
Using signature algorithm RSA-PKCS
RseZYWjkyNRcU1lI1KR+I+0C1jC+FVp2kTAhyOUsE2x6UGf+UMSf3kqD4KGBb+eIryXDFTzNsdo8XroUtWvYQvHgPLPaRQ8xfPtTOZS/crQY168S2lk4buAeDZWat/xiGeXgU4rL7hdbjojdkfbeGWHfIERcese6wv521t9x9w5K3XGz50Ec9Y/C4cPPo4xuQMSQlCrx1iIlfeGbkElxGIdIkZvt2nTrhl/ico5YCbTJfuDqZaaaJxPkXcfgAcvFVU/kILi7U3XQCvz7zohZoRj4vkeTutanW6I7qGyWvIcxXGJx29MInF3pohT0+KUzegN4A1GfkW5hfk5HyCP2Gw==

公鑰是

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwzz8XZ5iDjWlLZOfXgzh
VsyFcx85QEhgrcJJXkFV2k+vmVUA1R4oZPuvE+cF13ymh05+GLM0OHHzrohSrbv9
3AUmkWLPY04jF0NXSEAd180ImJ84Y2lSaqo4op+l3cPjIWeeBN0DPX78GdLGJnIr
Fq51TwKcdtjgQMvfWDuxZbjo2C20QQIIzp0cWGTsWOBFamjOJGhfRcQ/TT4MDA2h
//813N2HqXnlAtEgvlLH1Jv+VNROd/WIN+CMo0NLDQGS0AhVZPctatNqH5mXwklZ
goyv62WY284EIZLC1nTgMWxdQQIR6yRyJmQwp7zLs/Fk9rYZDHEOTuILEHd/7dPB
7wIDAQAB
-----END PUBLIC KEY-----

TLDR:這是 DigestInfo

Current Mechanisms 2.1.14中定義的 hash-and-RSA-PKCS 方案執行 RSASSA-PKCS1-v1_5 的完整方案,該方案現在在RFC8017 中主要在 9.2中定義為 EMSA-PCKS1-v1_5“編碼”的組合(通常稱為填充)加上 RSASP1 和 RSAVP1 原語。(在以前的版本中,文件的組織方式不同,但內容是相同的。)具體包括:

#1 散列數據

#2 在 DER 中的 ASN.1 結構 DigestInfo 中對雜湊值和雜湊算法進行編碼;由於每個散列算法具有恆定的輸出大小,這相當於僅根據算法添加一個固定前綴,如注 1 中所示

#3-5 以 00 01 FF…(至少 8) 00 形式添加填充

(8.2.1#2) 將結果視為數字 m,應用執行 m ^ d mod n 的 RSASP1(或為驗證 8.2.2#2 應用執行 s ^ e mod n 的 RSAVP1;這在三個之前說明上面的填充步驟,但實際上也可以在之後)

2.1.6中定義的用於簽名/驗證的 OTOTH RSA-PKCS僅執行這些步驟中的後兩個步驟,而不是前兩個步驟。正如正文所說:“這種機制僅對應於 PKCS #1 v1.5 中涉及 RSA 的部分;它不計算 PKCS #1 v1.5 中指定的消息摘要或 DigestInfo 編碼。” 您在外部散列了第一步的數據,但沒有執行第二步(必需)的 DigestInfo,因此得到了錯誤的結果。

除了是 PKCS11(硬體)而不是軟體之外,這至少是交叉複製:

https ://stackoverflow.com/questions/521101/using-sha1-and-rsa-with-java-security-signature-vs-messagedigest-and -cipher

https://stackoverflow.com/questions/9951559/difference-between-openssl-rsautl-and-dgst

https://stackoverflow.com/questions/38767660/multiple-openssl-rsa-signing-methods-produce-diff -結果https://stackoverflow.com/questions/63582544/how-does-jwt-implement-rsa256-signature-verification-in-nodejs

https://stackoverflow.com/questions/62955968/how-can-realize-openssl

-pkeyutl-sign-by-java

https://stackoverflow.com/questions/48013643/get-the-sha1-hashed-value-from-xml-signature-value

https://stackoverflow.com/questions/43490188/separate-digest-signing-using-java-security-provider

https://stackoverflow.com/questions/57929493/openssl-digitally-sign-digest-only

https://stackoverflow.com/questions/9380856/openssl-signature-difference-when-using-c-routines-and-openssl

https://stackoverflow.com/questions/13419201/why-are-the-rsa-sha256-signatures-i-generate-with-openssl-and-java-different

https://stackoverflow.com/questions/15092298/signing-20-byte-message-with-256-bit-rsa-key-working-with-openssl-exe-but-not-in

https://superuser.com/questions/943972/what-is-the-difference-between-openssl-pkeyutl-sign-and-openssl-rsautl-sign

引用自:https://crypto.stackexchange.com/questions/87006