簡體   English   中英

如何使用 RSACryptoServiceProvider 解密加密文本?

[英]how to decrypt an encrypted text using RSACryptoServiceProvider?

我已經使用 RSACryptoServiceProvider 加密了一個文本。 我導出了公鑰和私鑰。 顯然我只是想在解碼器應用程序內部公開公鑰,所以我寫了如下代碼:

private const string PublicKey = "<RSAKeyValue><Modulus>sIzQmj4vqK0QPd7RXKigD7Oi4GKPwvIPoiUyiKJMGP0qcbUkRPioe2psE/d3c1a2NY9oj4Da2y1qetjvKKFad2QAhXuql/gPIb1WmI+f6q555GClvHWEjrJrD/ho7SLoHbWd6oY6fY609N28lWJUYO97RLVaeg2jfNAUSu5bGC8=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";

private string Decrypt()
        {
            byte[] encryptedKeyAsBytes = Convert.FromBase64String(_encryptedKey);
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            rsa.FromXmlString(PublicKey);
            // read ciphertext, decrypt it to plaintext
            byte[] plainBytes = rsa.Decrypt(encryptedKeyAsBytes, false);
            string plainText = System.Text.Encoding.ASCII.GetString(plainBytes);

            return plainText;
        }

但在“byte[] plainBytes = rsa.Decrypt(encryptedKeyAsBytes, false);”行拋出異常並說“鑰匙不存在”。 但是,如果我公開整個私鑰和公鑰,那么它會運行得很愉快。 那么如何僅使用公鑰信息解密數據呢?

你不能——這就是公鑰/私鑰加密的重點。 公眾進行加密; 私人進行解密。

聽起來您需要某種密鑰交換模式。 例如; 如果您的解碼器應用程序試圖從另一個數據源(源應用程序)解密信息,我會實現這樣的事情:

  1. 源應用程序生成一個對稱密鑰,如 AES。
  2. 解碼器應用程序生成一個公鑰和私鑰對。
  3. 源應用程序向解碼器應用程序詢問公鑰。
  4. 源應用程序使用公鑰加密對稱密鑰,並將其發送回解碼器應用程序。
  5. 解碼器應用程序使用私鑰來解密對稱密鑰。
  6. 解碼器應用程序從源應用程序獲取使用對稱密鑰加密的數據。
  7. 解碼器應用程序使用交換的對稱密鑰來解密它收到的信息。

這只是一個例子; 但說明了如何在兩個應用程序之間交換數據而無需通過網絡傳輸任何敏感信息的基礎知識。 根本不需要對稱密鑰; 但這是一種非常常見的模式,因為 RSA 在加密大量信息時開始引入問題。 RSA 最好只加密對稱加密密鑰。

簡短的回答是:你不能。 要解密消息,您需要私鑰,這是非對稱密碼學的主要原則。

您使用某人的公鑰加密消息,以便只有擁有相應私鑰的人才能解密它們。

這就是為什么公鑰被稱為公開的 - 您可以安全地將它分發給公眾,以便他們可以加密消息以供您作為相應私鑰的唯一所有者閱讀。

問題是您混淆了加密和簽名。

加密是任何人都可以消息的地方,但只有私鑰持有者可以讀取它。 簽名是任何人都可以閱讀消息的地方,但只有私鑰持有者可以編寫它。

當你調用 Decrypt 時,RSACryptoServiceProvider 正在尋找加密,即公寫私有讀。 因此它尋找私鑰。

您想使用 SignData 和 VerifyData 函數對有效負載進行簽名,這樣人們就無法編寫它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM