[C#] 純使用 BouncyCastle 來做 RSA 加解密

2022-02-23

最近因為專案的關係比較常要寫一些關於虛擬貨幣(數字貨幣、加密貨幣) 的東西,在加密貨幣的世界中,hash 跟加解密是很常見的

因為很多是 OpenSource 轉到 .net 這邊來,所以我常看到一個套件 BouncyCastle 


包含在 .net 下面常用到的 Nethereum ,還有上篇文章說的 XC.RSAUtil 也都有用到該套件,網路上看很多 java 或是 opensource 都會用到這套件

今天就用這套件來看看怎麼做 RAS 加密跟解密。

1. nuget  : https://www.nuget.org/packages/Portable.BouncyCastle


2.接下來就是 code 部分,這裡面的 key 其實我都是用 BouncyCastle 產生的,當然你也可以用 .net 內建的  System.Security.Cryptography.RSA 

產生後再去轉換,不過這篇就盡量使用單純 使用 BouncyCastle  不用內建的

static string BouncyCastleEncrypt(string str, Org.BouncyCastle.Crypto.AsymmetricKeyParameter publicKey) { var encryptEngine = new Org.BouncyCastle.Crypto.Encodings.Pkcs1Encoding(new Org.BouncyCastle.Crypto.Engines.RsaEngine()); encryptEngine.Init(true, publicKey); var bytesToEncrypt = Encoding.UTF8.GetBytes(str); var encrypted = Convert.ToBase64String(encryptEngine.ProcessBlock(bytesToEncrypt, 0, bytesToEncrypt.Length)); return encrypted; } static string BouncyCastleDecrypt(string str, Org.BouncyCastle.Crypto.AsymmetricKeyParameter privateKey) { var bytesToDecrypt = Convert.FromBase64String(str); var decryptEngine = new Org.BouncyCastle.Crypto.Encodings.Pkcs1Encoding(new Org.BouncyCastle.Crypto.Engines.RsaEngine()); decryptEngine.Init(false, privateKey); var decrypted = Encoding.UTF8.GetString(decryptEngine.ProcessBlock(bytesToDecrypt, 0, bytesToDecrypt.Length)); return decrypted; } //Key 產生器 var keyGenerator = new Org.BouncyCastle.Crypto.Generators.RsaKeyPairGenerator(); //產生參數 var param = new Org.BouncyCastle.Crypto.Parameters.RsaKeyGenerationParameters( Org.BouncyCastle.Math.BigInteger.ValueOf(3), new Org.BouncyCastle.Security.SecureRandom(), 1024, 25); keyGenerator.Init(param); //產生金鑰對 var keyPair = keyGenerator.GenerateKeyPair(); var publicKey = keyPair.Public; var privateKey = keyPair.Private; var str = "測試加密使用的內文當麻許功蓋"; var encData = BouncyCastleEncrypt(str, publicKey); Console.WriteLine("加密後文字"); Console.WriteLine(encData); var desData = BouncyCastleDecrypt(encData, privateKey); Console.WriteLine("解密後文字"); Console.WriteLine(desData); //加密後文字 //VuS0yH/qzr0+p/SypvEJlrLDdddjrQuq+ay69zhq2ZP/aseX6LZTPqhLzst4JDozFtbxxriZ3bJml92aLDORHx0KYS/rnawAEHsZtqztUFOoJxFZYy3En6KWnwLwXPpEavGeO0/rGdpkxFC6TeQT+WjXXprCudyU+ldxSvXxCXI= //解密後文字 //測試加密使用的內文當麻許功蓋



reference:

https://www.796t.com/article.php?id=103123


當麻許的碎念筆記 2014 | Donma Hsu Design.