首頁 >後端開發 >Golang >如何使用 RSA 私鑰解密加密訊息

如何使用 RSA 私鑰解密加密訊息

PHPz
PHPz轉載
2024-02-09 15:30:20914瀏覽

如何使用 RSA 私钥解密加密消息

php小編柚子為您介紹如何使用RSA私鑰解密加密訊息。 RSA是一種非對稱加密演算法,透過產生公鑰和私鑰對資訊進行加密和解密。在使用RSA解密加密訊息時,您需要擁有對應的私鑰,並使用該私鑰對加密的訊息進行解密操作。解密過程中,私鑰將對加密訊息進行解碼,還原成原始的明文訊息。透過掌握RSA私鑰解密的方法,您可以更安全地傳遞和保護敏感資訊。接下來,我們將詳細介紹RSA私鑰解密的步驟和注意事項,幫助您更能理解並應用這項加密解密技術。

問題內容

我正在存取一個需要我的公鑰的api,然後該api 將返回一個包含向量和令牌的回應,但它們是加密形式的(我認為他們使用我的公鑰來做到這一點)。為了解密它,我需要使用我的私鑰。私鑰和公鑰均採用 der 編碼。 我基本上想實現這樣的東西 https://www.devglan.com/online-tools/rsa-encryption-decryption

我使用的鍵(同樣,它們是虛擬的!) 公有: migfma0gcsqgsib3dqebaquaa4gnadcbiqkbgqcbi1sofn/zpsprblpaw/c4gdkho6idv3j/p5leeupasbvvpq6wy7tf6lfbstcirq48omd34p5leeupasbvvpq6wy7tf6lfbstcirq48omd34pffz5sx1 c0pwb6hkaakt0sbeglbcux6yr6sbjbfai2ofikk/mgswidaqab

#私人:miicdqibadanbgkqhkig9w0baqefaascal8wggjbageaaogbajsjvkh839k ymsgu8bb9zgymoejoh2/cn8/ksqrskcxtvwmrrbjtn/qv8fjnymoejoh2/cn8/ksqrskcxtvwmrrbjtn/qv8fjjnytnjmt/whomwwwi q2rrtgidsix9mlrzq9yhoeqacrpsxt4ytsk5frkvpjskevojah8gqt yazagmbaaecgya5kaed/z8tmslujhxgajzzgldkczms6uhxasdw/1fwxooeatm5ha7gumcerhkib;28hmxp lt4ruib7smc5uxl7sw55bghrxqdfhjskow4rpga irjuysy5gizswqjbandtff vwpkrr8mhyvagollkra1cfn8g9x1ega3mgwpny oh5nmjfe0ibaxo69jlr三ajk oxg9x1ega3mgwpny oh5nmjfe0iba29 asjczfywxeckaaipvwit7fkj3n83nj0ppm9xwh22cygszakaaviwotleoken71v/tt kauyt32ahgwnkckwvwmv4/ws6rflcnvdxr/cnkcgeqlkxtl /lacrnkzsecpywk4uupcu9ffrutaje6mnaj2pna9wjxw5c exk5rcmq7rcgrxakajize3jbwuu3mx5tdmhfgcviz38jnfsujfryblkanjegod 4zcxrzxfo 加密訊息:

buy5nr/pujncfxeuxqd4oxkcvmo2jilwh5vkzlz1udm4m0vxdv4ba1oanhbttqetqeny1vfw2v4v9pw5hmdics1sdvxg ezf19q8lb2aojcaejk6s=

讓我們進入編碼部分: 我正在從 env 檔案中檢索我的私鑰和公鑰: <pre class="brush:php;toolbar:false;">public := godotenvvariable(&quot;publickey&quot;) private := godotenvvariable(&quot;privatekey&quot;)</pre> 現在,在點擊 api 並獲得結果後,我嘗試使用

rsa.decryptoaep

函數解密訊息,但它一直給我 [] crypto/rsa: 解密錯誤 。在包本身內部調試後,我在這裡收到錯誤: <pre class="brush:php;toolbar:false;">k := priv.size() // private key size if len(ciphertext) &gt; k || //ciphertext is the encrypted text and hash.size()*2+2 is the hash size that im using k &lt; hash.size()*2+2 { return nil, errdecryption }</pre> if語句的結果:k = 128 hash.size()*2 2=66 cipher = 172 起初,我在將私鑰(在我的例子中是字串,因為它來自 env 檔案)轉換為 rsa 私鑰時遇到了問題。 以下是我為解決該問題所做的操作:

senc, err := b64.stdencoding.decodestring(private) //using this package "encoding/base64"

然後我像這樣轉換它:

block := &pem.Block{
    Type:  "RSA PRIVATE KEY",
    Bytes: sEnc,
    }
    parseResult, err := x509.ParsePKCS8PrivateKey(block.Bytes)

我做錯了什麼?

解決方法

如果在

選擇密碼類型

欄位中選擇rsa,則devglan 網站將套用pkcs#1 v1.5 作為填充,因此rsa.decryptpkcs1v15() 必須為用過的。私鑰是 base64 編碼的 pkcs#8 der 金鑰,可以使用 x509.parsepkcs8privatekey() 匯入。 一起:

import (
    "crypto/rand"
    "crypto/rsa"
    "crypto/x509"
    b64 "encoding/base64"
    "fmt"
)

func main() {

    // Base64 decode ciphertext
    ciphertext, _ := b64.StdEncoding.DecodeString("BUy5nR/PuJNCFXeUxQd4oxkCvMo2JiLwH5VkzLz1UdM4M0VXDv4Ba1OaNHbttqETQENy1VfW2V4v9Pw5HmDIcS1sdGN69ceEHJbned46rK1EVtMVQZGP9ha54AXie5v/1TdKYWJ+AFt0FxVj4kfFXGXEzF19Q8LB2AOJCAEJK6s=")

    // Import PKCS#8 key
    pkcs8DerKey, _ := b64.StdEncoding.DecodeString("MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAJsjVKh839k+ymsGU8Bb9zgYMoejoh2/cn8/ksQRSkCxtVWmrrBjtN/qV8FJNyKurjygwPfinfPmxfWNjLXk5c3E0oGmg52/wFhB2cr8t8VxnnvbTJQ2RrTGIdSiX9mLRzQ9YHoeQACRPSxt4YtsK5frKvpJskEVojah8gqT+YazAgMBAAECgYA5KaeD/Z8tmSlUjhxGAJzzGldkCzMs6uHxaSdW/1fwxooeaTBs5hA7gUmcerHKIbsps8HmlKXGvP2sIN/8Fb9mo1yHaAN2g52+cvpr2QmeeUOwfuZTM/gllT4rUIB7sMC5Uxl7sW55bGhRxqdfHJskow4rPga+irjuYSy5GIZSwQJBANDtfF+VWPKrR8MHYvaGoLLkrA1cFn8g9x1eGA3mgWPNYoH5nMJfe0IBaXo69jlrnBAjK+oxnPSyh/AZzsEehasCQQC+F15dVSjH8tJSXz8RCDpMdp+P9J/eoi7+V0IgwKAaSJCZfYWXeckAAIpvwit7fkj3n83nj0PPm9Xwh22CYGsZAkAAvIWOtLEOken71v/TTKAuYT32AhgWNKCKWvWMvv4/ws6RFLcnvDxr/CNKCgEqLKXtLKKP/cLG3gY6o2ymI5xnAkA8l4JSycRYB8SW0RlvOmoq2Vz/LACRnKzSEcpYWk4uUpcU9ffRUtaJE6MNAJ2Pna9wjxW5C+eXk5rcMq7rcgRxAkAjizE3JbwUu3MX5TDmHfGCvIZ38jnfSUjFrYBLKaNJegOD4zcxRZXfO7iKDa+PtFMRe7ZtnU7WuCM0yUT2Qa0j")
    key, _ := x509.ParsePKCS8PrivateKey(pkcs8DerKey)
    var privateKey *rsa.PrivateKey
    privateKey, _ = key.(*rsa.PrivateKey)

    // Decrypt (using RSA with PKCS#1 v1.5 padding)
    rng := rand.Reader
    plaintext, _ := rsa.DecryptPKCS1v15(rng, privateKey, ciphertext)

    fmt.Println(string(plaintext)) // {"token":"312ade4b52e7bb4cadf59b4c7c83cb41","vector":"2b8db4fdb11f361d","id":"63876cf63ec7a641db8f1def"}
}

以上是如何使用 RSA 私鑰解密加密訊息的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除