為什麼使用 SHA256-RSA-PKCS 簽名的數據和使用 RSA-PKCS 簽名的摘要不同?
我需要使用 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/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
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