少見的C# RSA算法
當(dāng)下最流行的RSA加密算法,只有公鑰和私鑰同時擁有才能破解加密信息,RSA加密算法的出現(xiàn)有利于數(shù)據(jù)安全性傳輸
1.C#中自帶RSACryptoServiceProvider類可以讓你很好的生成XML格式的公鑰和私鑰,兩句代碼就搞定

2.但是生成的XML格式前端不能很好的利用和讀懂,所以在生成的XML格式里需要轉(zhuǎn)換成PEM格式,這樣才能直接Copy到驗證工具里加密解密,非常方便
首先,我們先導(dǎo)入一個第三方庫,因為下面涉及到的轉(zhuǎn)換代碼都是需要依賴這個庫來實現(xiàn),導(dǎo)入操作如下

控制臺里輸入
PM > Install-Package BouncyCastle
導(dǎo)入到引用里面
3.好了,下面就是純代碼實現(xiàn)了,目的就是將XML格式轉(zhuǎn)換為PEM格式,無論公鑰還是私鑰,不羅嗦直接代碼走起
static void Main(string[] args) {
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); string xmlPrivateKey = rsa.ToXmlString(true);//XML密鑰
string pemPrivateKey = Xml2PemPrivate(xmlPrivateKey, "F:/privatePEM.txt");//PEM密鑰
string xmlPublicKey = rsa.ToXmlString(false);//XML公鑰
string pemPublicKey = Xml2PemPublic(xmlPublicKey, "F:/publicPEM.txt");//PEM密鑰
} /// <summary>
/// XML格式公鑰轉(zhuǎn)PEM格式公鑰
/// </summary>
/// <param name="xml">XML格式的公鑰</param>
/// <param name="saveFile">保存文件的物理路徑</param>
public static string Xml2PemPublic(string xml, string saveFile) { var rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(xml); var p = rsa.ExportParameters(false);
RsaKeyParameters key = new RsaKeyParameters(false, new BigInteger(1, p.Modulus), new BigInteger(1, p.Exponent)); using (var sw = new StreamWriter(saveFile))
{ var pemWriter = new Org.BouncyCastle.OpenSsl.PemWriter(sw);
pemWriter.WriteObject(key);
}
SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(key); byte[] serializedPublicBytes = publicKeyInfo.ToAsn1Object().GetDerEncoded(); string publicKey = Convert.ToBase64String(serializedPublicBytes); return Format(publicKey, 1);
} /// <summary>
/// XML格式私鑰轉(zhuǎn)PEM
/// </summary>
/// <param name="xml">XML格式私鑰</param>
/// <param name="saveFile">保存文件的物理路徑</param>
public static string Xml2PemPrivate(string xml, string saveFile) { var rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(xml); var p = rsa.ExportParameters(true); var key = new RsaPrivateCrtKeyParameters( new BigInteger(1, p.Modulus), new BigInteger(1, p.Exponent), new BigInteger(1, p.D), new BigInteger(1, p.P), new BigInteger(1, p.Q), new BigInteger(1, p.DP), new BigInteger(1, p.DQ), new BigInteger(1, p.InverseQ)); using (var sw = new StreamWriter(saveFile))
{ var pemWriter = new Org.BouncyCastle.OpenSsl.PemWriter(sw);
pemWriter.WriteObject(key);
}
PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(key); byte[] serializedPrivateBytes = privateKeyInfo.ToAsn1Object().GetEncoded(); string privateKey = Convert.ToBase64String(serializedPrivateBytes); return Format(privateKey, 2);
} /// <summary>
/// 格式化公鑰/私鑰
/// </summary>
/// <param name="key">生成的公鑰/私鑰</param>
/// <param name="type">1:公鑰 2:私鑰</param>
/// <returns>PEM格式的公鑰/私鑰</returns>
public static string Format(string key, int type) { string result = string.Empty; int length = key.Length / 64; for (int i = 0; i < length; i++)
{ int start = i * 64;
result = result + key.Substring(start, 64) + "\r\n";
}
result = result + key.Substring(length * 64); if (type == 1)
{
result = result.Insert(0, "-----BEGIN PUBLIC KEY-----\r\n");
result += "\r\n-----END PUBLIC KEY-----";
} if (type == 2)
{
result = result.Insert(0, "-----BEGIN PRIVATE KEY-----\r\n");
result += "\r\n-----END PRIVATE KEY-----";
} return result;
}
4.最后輸出在F盤的TXT文件里面就是可以直接用來Copy到驗證工具里面直接加密/解密數(shù)據(jù)用的
人說,如果你很想要一樣?xùn)|西,就放它走 。如果它回來找你,那么它永遠都是你的。要是它沒有回來,那么不用再等了,因為它根本就不是你的。 ——伊恩·麥克尤恩
以上就是少見的C# RSA算法的詳細內(nèi)容,更多關(guān)于C# RSA算法的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C# datatable 不能通過已刪除的行訪問該行的信息處理方法
采用datatable.Rows[i].Delete()刪除行后再訪問該表時出現(xiàn)出現(xiàn)“不能通過已刪除的行訪問該行的信息”的錯誤2012-11-11
C#Process的OutputDataReceived事件不觸發(fā)問題及解決
這篇文章主要介紹了C#Process的OutputDataReceived事件不觸發(fā)問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02
C#利用Label標(biāo)簽控件模擬窗體標(biāo)題的移動及窗體顏色不斷變換效果
Label標(biāo)簽控件相信對大家來說都不陌生,下面這篇文章主要給大家介紹了關(guān)于C#利用Label標(biāo)簽控件模擬窗體標(biāo)題的移動及窗體顏色不斷變換效果的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。2017-12-12
淺析C# 9.0 新特性之 Lambda 棄元參數(shù)
這篇文章主要介紹了C# 9.0 新特性之 Lambda 棄元參數(shù)的的相關(guān)資料,文中講解非常細致,代碼幫助大家更好的理解和學(xué)習(xí),想學(xué)習(xí)c#的朋友可以了解下2020-06-06

