這是一個懸而未決的問題在這裏的副本:Using an RSA Public Key to decrypt a string that was encrypted using RSA Private Key使用RSA公鑰來解密使用RSA被加密的字符串私鑰
你可以看到筆者發現使用一些代碼的解決方案從這裏: http://www.codeproject.com/KB/security/PrivateEncryption.aspx
使用該鏈接的代碼看起來很有希望。唯一缺少的是填充。我通常使用PKCS1.5填充,這是OpenSSL RSA的默認填充。
我知道這個問題的答案非常接近。我知道唯一阻止解密的是加密的openssl密文上的pkcs1.5填充。
我很驚訝地發現這個主題上的信息很少,因爲在很多情況下你需要一個服務器來加密某些東西,簽署某些東西等等,並且讓客戶端應用程序驗證,解密等等公鑰。
我也廣泛嘗試使用RSACryptoServiceProvider來驗證使用OpenSSL進行加密所產生的哈希結果。例如,我會使用明文的SHA256散列進行私鑰加密,然後嘗試對該簽名執行RSACryptoServiceProvider驗證,但它不起作用。我認爲MS做這件事的方式並不標準,可能還有特殊的定製。
所以,另一種方法是這個問題,它只是採用私鑰加密的密文並使用C#解密它,從而驗證其真實性。哈希可以合併爲一個簡單的簽名驗證系統,用於由服務器簽名並在客戶端進行驗證的數據對象。
我已經瀏覽了PKCS1 RFC,OpenSSL rsa源代碼和其他項目,但是在做RSA解密時,我無法得到關於如何解釋PKCS1填充的明確答案。我無法找到他們處理PKCS1填充的OpenSSL源代碼的位置,否則,我現在可能會有答案。另外,這是我的第一個問題,我知道它是一個未答覆的問題的重複,所以,該怎麼辦?我也搜索了這個,並沒有發現任何東西。
我不明白的另一件事是爲什麼我的解密方法不起作用。由於填充在解密後被移除,我的解密數據應該類似於明文,並且它甚至不是很接近。所以,我幾乎肯定pkcs1填充意味着其他事情正在發生,特別是對於密文,這意味着密文在解密之前必須被預處理以去除填充元素。
也許只是過濾密文去除填充元素是這裏最簡單的解決方案......
這裏是我的解密方法:
public static byte[] PublicDecryption(this RSACryptoServiceProvider rsa, byte[] cipherData)
{
if (cipherData == null)
throw new ArgumentNullException("cipherData");
BigInteger numEncData = new BigInteger(cipherData);
RSAParameters rsaParams = rsa.ExportParameters(false);
BigInteger Exponent = GetBig(rsaParams.Exponent);
BigInteger Modulus = GetBig(rsaParams.Modulus);
BigInteger decData = BigInteger.ModPow(numEncData, Exponent, Modulus);
byte[] data = decData.ToByteArray();
byte[] result = new byte[data.Length - 1];
Array.Copy(data, result, result.Length);
result = RemovePadding(result);
Array.Reverse(result);
return result;
}
private static byte[] RemovePadding(byte[] data)
{
byte[] results = new byte[data.Length - 4];
Array.Copy(data, results, results.Length);
return results;
}
加密代碼在哪裏?有*兩種* PKCS#1版本1.5填充:塊類型(BT)1和塊類型2填充。 BT 1用於你正在做的RSA簽名,BT 2用於RSA加密。 –