Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menyahsulit mesej yang disulitkan menggunakan kunci peribadi RSA

Bagaimana untuk menyahsulit mesej yang disulitkan menggunakan kunci peribadi RSA

PHPz
PHPzke hadapan
2024-02-09 15:30:20841semak imbas

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

editor php Youzi akan memperkenalkan anda cara menggunakan kunci peribadi RSA untuk menyahsulit mesej yang disulitkan. RSA ialah algoritma penyulitan asimetri yang menyulitkan dan menyahsulit maklumat dengan menjana kunci awam dan peribadi. Apabila menggunakan RSA untuk menyahsulit mesej yang disulitkan, anda perlu mempunyai kunci peribadi yang sepadan dan menggunakan kunci peribadi untuk menyahsulit mesej yang disulitkan. Semasa proses penyahsulitan, kunci peribadi akan menyahkod mesej yang disulitkan dan memulihkannya kepada maklumat plaintext asal. Dengan menguasai penyahsulitan kunci persendirian RSA, anda boleh menyampaikan dan melindungi maklumat sensitif dengan lebih selamat. Seterusnya, kami akan memperkenalkan langkah dan langkah berjaga-jaga untuk penyahsulitan kunci persendirian RSA secara terperinci untuk membantu anda memahami dan menggunakan teknologi penyulitan dan penyahsulitan ini dengan lebih baik.

Kandungan soalan

Saya sedang mengakses api yang memerlukan kunci awam saya, yang kemudiannya akan mengembalikan respons yang mengandungi vektor dan token, tetapi dalam bentuk yang disulitkan (saya rasa mereka menggunakan kunci awam saya untuk melakukannya pada ketika ini). Untuk menyahsulitnya saya perlu menggunakan kunci peribadi saya. Kedua-dua kunci peribadi dan awam dikodkan. Saya pada dasarnya mahu melaksanakan sesuatu seperti ini https://www.devglan.com/online-tools/rsa-encryption-decryption

Kunci yang saya gunakan (sekali lagi, ia adalah maya!) Awam: migfma0gcsqgsib3dqebaquaa4gnadcbiqkbgqcbi1sofn/zpsprblpaw/c4gdkho6idv3j/p5leeupasbvvpq6wy7tf6lfbstcirq48omd34p3z5sx1jyy15oxnxnkbpoodv8byqdnk/lffcz5 720yunka0xihuol/zi0c0pwb6hkaakt0sbeglbcux6yr6sbjbfai2ofikk/mgswidaqab

Swasta: 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

Mesej disulitkan: buy5nr/pujncfxeuxqd4oxkcvmo2jilwh5vkzlz1udm4m0vxdv4ba1oanhbttqetqeny1vfw2v4v9pw5hmdics1sdgn69ceehjbned46rk1evtmvqzgp9ha54axie5v/1t dkywj+aft0fxvj4kffxgxezf19q8lb2aojcaejk6s= Mari kita masuk ke bahagian pengekodan: Saya sedang mendapatkan semula kunci peribadi dan awam saya daripada fail env:

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

Kini, selepas menekan api dan mendapat keputusan, saya cuba menggunakan rsa.decryptoaep 函数解密消息,但它一直给我 [] crypto/rsa: 解密错误 . Selepas menyahpepijat di dalam pakej itu sendiri, saya mendapat ralat di sini:

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
}

Hasil pernyataan if: k = 128 hash.size()*2+2=66 cipher = 172 Pada mulanya saya menghadapi masalah menukar kunci persendirian (dalam kes saya rentetan kerana ia berasal dari fail env) kepada kunci persendirian rsa. Inilah yang saya lakukan untuk menyelesaikan isu tersebut:

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

Kemudian saya menukarnya seperti ini:

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

Apa salah saya?

Penyelesaian

Jika rsa dipilih dalam medan Pilih Jenis Kata Laluan, tapak web devglan akan menggunakan pkcs#1 v1.5 sebagai padding dan oleh itu rsa.decryptpkcs1v15() 必须为用过的。私钥是 base64 编码的 pkcs#8 der 密钥,可以使用 x509.parsepkcs8privatekey() diimport.

Bersama:

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

Atas ialah kandungan terperinci Bagaimana untuk menyahsulit mesej yang disulitkan menggunakan kunci peribadi RSA. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam