Heim >Backend-Entwicklung >Golang >So entschlüsseln Sie verschlüsselte Nachrichten mit einem privaten RSA-Schlüssel

So entschlüsseln Sie verschlüsselte Nachrichten mit einem privaten RSA-Schlüssel

PHPz
PHPznach vorne
2024-02-09 15:30:20911Durchsuche

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

php-Editor Youzi zeigt Ihnen, wie Sie den privaten RSA-Schlüssel zum Entschlüsseln verschlüsselter Nachrichten verwenden. RSA ist ein asymmetrischer Verschlüsselungsalgorithmus, der Informationen durch die Generierung öffentlicher und privater Schlüssel ver- und entschlüsselt. Wenn Sie RSA zum Entschlüsseln einer verschlüsselten Nachricht verwenden, müssen Sie über den entsprechenden privaten Schlüssel verfügen und diesen zum Entschlüsseln der verschlüsselten Nachricht verwenden. Während des Entschlüsselungsprozesses dekodiert der private Schlüssel die verschlüsselte Nachricht und stellt die ursprünglichen Klartextinformationen wieder her. Durch die Beherrschung der RSA-Privatschlüssel-Entschlüsselung können Sie vertrauliche Informationen sicherer übermitteln und schützen. Als Nächstes stellen wir die Schritte und Vorsichtsmaßnahmen für die Entschlüsselung privater RSA-Schlüssel im Detail vor, damit Sie diese Ver- und Entschlüsselungstechnologie besser verstehen und anwenden können.

Frageninhalt

Ich greife auf eine API zu, die meinen öffentlichen Schlüssel erfordert, und dann gibt die API eine Antwort zurück, die einen Vektor und ein Token enthält, diese sind jedoch in verschlüsselter Form (ich glaube, dass sie derzeit meinen öffentlichen Schlüssel dazu verwenden). ). Um es zu entschlüsseln, muss ich meinen privaten Schlüssel verwenden. Sowohl private als auch öffentliche Schlüssel werden verschlüsselt. Im Grunde möchte ich so etwas implementieren: https://www.devgan.com/online-tools/rsa-encryption-decryption

Die Schlüssel, die ich verwendet habe (auch sie sind virtuell!) Öffentlich: migfma0gcsqgsib3dqebaquaa4gnadcbiqkbgqcbi1sofn/zpsprblpaw/c4gdkho6idv3j/p5leeupasbvvpq6wy7tf6lfbstcirq48omd34p3z5sx1jyy15oxnxnkbpoodv8byqdnk/lffcz5 720yunka0xihuol/zi0c0pwb6hkaakt0sbeglbcux6yr6sbjbfai2ofikk/mgswidaqab

Privat: miicdqibadanbgkqhkig9w0baqefaascal8wggjbageaaogbajsjvkh839k+ymsgu8bb9zgymoejoh2/cn8/ksqrskcxtvwmrrbjtn/qv8fjnykurjygwpfinfpmxfwnjlxk5c3e0og mg52/wfhb2cr8t8vxnnvbtjq2rrtgidsix9mlrzq9yhoeqacrpsxt4ytsk5frkvpjskevojah8gqt+yazagmbaaecgya5kaed/z8tmslujhxgajzzgldkczms6uhxasdw/1fwxooeatbs5ha7gumcerhkib sps8hmlkxgvp2sin/8fb9mo1yhaan2g52+cvpr2qmeeuowfuztm/gllt4ruib7smc5uxl7sw55bghrxqdfhjskow4rpga+irjuysy5gizswqjbandtff+vwpkrr8mhyvagollkra1cfn8g9x1ega3mgwpny oh5nmjfe0ibaxo69jlrnbajk+oxnpsyh/azzseehascqqc+f15dvsjh8tjsxz8rcdpmdp+p9j/eoi7+v0igwkaasjczfywxeckaaipvwit7fkj3n83nj0ppm9xwh22cygszakaaviwotleoken71v/tt kauyt32ahgwnkckwvwmv4/ws6rflcnvdxr/cnkcgeqlkxtlkkp /clg3gy6o2ymi5xnaka8l4jsycryb8sw0rlvomoq2vz/lacrnkzsecpywk4uupcu9ffrutaje6mnaj2pna9wjxw5c+exk5rcmq7rcgrxakajize3jbwuu3mx5tdmhfgcviz38jnfsujfryblkanjegod 4zcxrzxfo7ikda+ptfmre7ztnu7wucm0yut2qa0j

Verschlüsselte Nachricht: buy5nr/pujncfxeuxqd4oxkcvmo2jilwh5vkzlz1udm4m0vxdv4ba1oanhbttqetqeny1vfw2v4v9pw5hmdics1sdgn69ceehjbned46rk1evtmvqzgp9ha54axie5v/1t dkywj+aft0fxvj4kffxgxezf19q8lb2aojcaejk6s= Kommen wir zum Codierungsteil: Ich rufe meine privaten und öffentlichen Schlüssel aus der env-Datei ab:

public := godotenvvariable("publickey")
private := godotenvvariable("privatekey")

Nachdem ich nun die API aufgerufen und die Ergebnisse erhalten hatte, versuchte ich es mit rsa.decryptoaep 函数解密消息,但它一直给我 [] crypto/rsa: 解密错误 . Nach dem Debuggen im Paket selbst erhalte ich folgende Fehlermeldung:

k := priv.size() // private key size
if len(ciphertext) > k || //ciphertext is the encrypted text and hash.size()*2+2 is the hash size that im using
    k < hash.size()*2+2 {
    return nil, errdecryption
}

Das Ergebnis der if-Anweisung: k = 128 hash.size()*2+2=66 cipher = 172 Zuerst hatte ich Probleme, den privaten Schlüssel (in meinem Fall eine Zeichenfolge, wie er aus einer env-Datei stammt) in einen privaten RSA-Schlüssel umzuwandeln. Folgendes habe ich getan, um das Problem zu beheben:

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

Dann wandle ich es so um:

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

Was habe ich falsch gemacht?

Problemumgehung

Wenn rsa im Feld Passworttyp auswählen ausgewählt ist, wendet die devgan-Website pkcs#1 v1.5 als Auffüllung an und daher wird rsa.decryptpkcs1v15() 必须为用过的。私钥是 base64 编码的 pkcs#8 der 密钥,可以使用 x509.parsepkcs8privatekey() importiert.

Gemeinsam:

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"}
}

Das obige ist der detaillierte Inhalt vonSo entschlüsseln Sie verschlüsselte Nachrichten mit einem privaten RSA-Schlüssel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen