亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么我用 openssl 和 golang 生成的 RSA 簽名不同?

為什么我用 openssl 和 golang 生成的 RSA 簽名不同?

Go
慕萊塢森 2022-01-10 16:23:08
我使用 openssl 命令對消息“Test.”進行簽名,使用 hexdump 輸出# echo "Test." | openssl rsautl -inkey privite.key -sign -hexdump0000 - 09 1b ce e2 4b 69 86 be-d7 b1 fb f0 ec e4 53 0e   ....Ki........S.0010 - ef 9c a4 7b db d3 21 d5-3e 78 23 61 89 34 7e bc   ...{..!.>x#a.4~.0020 - e9 1e 5a e9 f4 40 e6 53-07 e4 dd 1a fe 31 ec 42   [email protected] - 98 a5 07 d4 7e d9 f4 01-2f ba a3 65 18 b7 69 a4   ....~.../..e..i. 十六進制字符串是 091bcee24b69...我的私人鑰匙# cat private.Key-----BEGIN RSA PRIVATE KEY-----MIIBOgIBAAJBALKZD0nEffqM1ACuak0bijtqE2QrI/KLADv7l3kK3ppMyCuLKoF0fd7Ai2KW5ToIwzFofvJcS/STa6HA5gQenRUCAwEAAQJBAIq9amn00aS0h/CrjXqu/ThglAXJmZhOMPVn4eiu7/ROixi9sex436MaVeMqSNf7Ex9a8fRNfWss7Sqd9eWuRTUCIQDasvGASLqmjeffBNLTXV2A5g4t+kLVCpsEIZAycV5GswIhANEPLmax0ME/EO+ZJ79TJKN5yiGBRsv5yvx5UiHxajEXAiAhAol5N4EUyq6I9w1rYdhPMGpLfk7AIU2snfRJ6Nq2CQIgFrPsWRCkV+gOYcajD17rEqmuLrdIRexpg8N1DOSXoJ8CIGlStAboUGBxTDq3ZroNism3DaMIbKPyYrAqhKov1h5V-----END RSA PRIVATE KEY----------END RSA PRIVATE KEY-----`func GenerateSignature() {    block, _ := pem.Decode([]byte(prvKeyPem))    if block == nil {        panic("failed to parse root certificate PEM")    }    privKey, err := x509.ParsePKCS1PrivateKey(block.Bytes) //x509.ParseCertificate(block.Bytes)    if err != nil {        panic("failed to parse certificate: " + err.Error())    }    indata := "Test."    h := sha256.New()    h.Write([]byte(indata))    digest := h.Sum(nil)    s, err := rsa.SignPKCS1v15(rand.Reader, privKey, crypto.SHA256, digest)    if err != nil {        panic("failed to sign:" + err.Error())    }    fmt.Printf("%x\n", s)}func main() {    GenerateSignature()}運行此代碼,以下是輸出:52e1cce3810c1a89693cf6965d1035618820a9e3a7b95203d885c4153dc3f7424b98e3ba628a186f1074d672bb59a1c0788a9c2064951ca2326eb1bf8e3但我認為應該是:091bcee24b69...我哪里錯了?謝謝
查看完整描述

3 回答

?
九州編程

TA貢獻1785條經驗 獲得超4個贊

除了helmbert 的回答中echo描述的添加的換行符之外,OpenSSL命令直接對提供的數據進行操作,而 Go 代碼首先使用 SHA256 對數據進行哈希處理,然后對生成的摘要進行簽名。rsautl


要使用 OpenSSL 執行與 Go 代碼相同的操作,您可以使用帶有選項的dgst命令-sign(請注意,我在這里也包含了該-n選項echo):


$ echo -n "Test." | openssl dgst -sha256 -sign private.key -hex

52e1cce3810c1a89693cf6965d1035618820a9e3a7b95203d885c4153dc3f7424b98e3ba628a186f1074d672bb59a1c0788a9c2064951ca2326eb1bf8e3e49e9

要在 Go 代碼中不散列的情況下對原始消息進行簽名,您可以將參數0的值傳遞hash給rsa.SignPKCS1v15:


indata := []byte("Test.")


s, err := rsa.SignPKCS1v15(nil, privKey, 0, indata)


查看完整回答
反對 回復 2022-01-10
?
慕沐林林

TA貢獻2016條經驗 獲得超9個贊

該echo命令打印一個帶有尾隨換行符(\n或0a)的字符串:


> echo 'Test.' | hexdump -C

00000000  54 65 73 74 2e 0a                                 |Test..|

00000006

所以在你的情況下,你是Test.\n第一次簽名,Test.第二次是在你的 Go 程序中。使用echo's-n開關來抑制尾隨換行符:


> echo -n 'Test.' | hexdump -C

00000000  54 65 73 74 2e                                    |Test.|

00000005


查看完整回答
反對 回復 2022-01-10
?
翻翻過去那場雪

TA貢獻2065條經驗 獲得超14個贊

這是一個非常有用的鏈接。


// Sign secret with rsa with PKCS 1.5 as the padding algorithm

// The result should be exactly same as "openssl rsautl -sign -inkey "YOUR_RSA_PRIVATE_KEY" -in "YOUR_PLAIN_TEXT""

signer, err := rsa.SignPKCS1v15(rand.Reader, rsaPrivateKey.(*rsa.PrivateKey), crypto.Hash(0), []byte(message))

https://github.com/bitmartexchange/bitmart-go-api/blob/master/bm_client.go


查看完整回答
反對 回復 2022-01-10
  • 3 回答
  • 0 關注
  • 258 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號