![](/img/trans.png)
[英]Implement RSA Public / Private key decryption in .NET to Java / Spring
[英]RSA: Using public key for decryption in .NET?
我遇到了MS .NET的RSA加密/解密功能問題:
看來, .NET不支持使用私鑰進行加密, 也不支持使用相應的公鑰進行解密。 (據我所知,這樣做會以某種方式侵犯算法的安全性。)
好吧,但是例如當我在構建時簽署程序集時, 編譯器似乎只是這樣做 :“編譯器使用公鑰 - 私鑰對文件中的1024位私鑰加密摘要。”
所以,如果我不能說服RSACryptoServiceProvider使用公鑰進行解密,我怎樣才能實現像編譯器類似的東西呢?
我只想用我的私鑰加密幾個字節並用公鑰解密它,用於一些非關鍵任務。 如果編程愛好者設法打破這個計划,我會活下去。 我只是想阻止非技術嫻熟的John Doe窺探。
對此有任何建議將不勝感激。
問候berntie
編輯:建議使用SignData()和VerifySign(),但之后我只能比較哈希的相等性。 但是,我需要檢索加密/簽名的原始輸入。
.Net確實支持它,但該概念稱為“簽名”並使用RSACryptoServiceProvider的SignData()方法。 從技術上講,正在發生的是創建要簽名的數據的哈希值,然后使用私鑰加密該哈希值。
我認為他們不支持使用私鑰進行任意加密的原因是為了確保代碼中的良好安全實踐,這樣您就不會意外地使用錯誤的密鑰加密,或者您不使用不安全的技術來制作簽名。
有關示例代碼,請參閱SignData文檔。
這是我的代碼,仍然有一些缺陷,但在大多數情況下工作。 我通過Java得到了modulusString
。
public static string Decrypt(string text, string modulusString)
{
var modulus = BigInteger.Parse(modulusString);
var exponent = BigInteger.Parse("65537");
var encryptBytes = Convert.FromBase64String(text);
if (publicKey.Modulus.Length > 309) // long enough key to decrypt short message
{
return Decrypt(encryptBytes, exponent, modulus);
}
string result = string.Empty;
int i = 0;
while (i < encryptBytes.Length) // for short key, must decrypt section-by-section
{
var temp = new byte[Math.Min(encryptBytes.Length, 128)];
Array.Copy(encryptBytes, i, temp, 0, temp.Length);
result += Decrypt(temp, exponent, modulus);
i += 128;
}
return result;
}
private static string Decrypt(byte[] encryptBytes, BigInteger exponent, BigInteger modulus)
{
Array.Reverse(encryptBytes); // BigIntenger need little-endian
if ((encryptBytes[encryptBytes.Length - 1] & 0x80) > 0) // make positive
{
var temp = new byte[encryptBytes.Length];
Array.Copy(encryptBytes, temp, encryptBytes.Length);
encryptBytes = new byte[temp.Length + 1];
Array.Copy(temp, encryptBytes, temp.Length);
}
var value = new BigInteger(encryptBytes);
var result = BigInteger.ModPow(value, exponent, modulus);
byte[] resultBytes = result.ToByteArray();
Array.Reverse(resultBytes);
int index = Array.FindIndex(resultBytes, b => b == 0) + 1;
return Encoding.UTF8.GetString(resultBytes, index, resultBytes.Length - index);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.