因为一般C#的RSA加密解密都是公钥加密,私钥解密,没有私钥加密,公钥解密。
在网上查了很多资料,终于看到有个博主的分享,关于私钥加密,公钥解密的解决方案,非常感谢(最下面有源网址)。
此处就把简单应用的源码附上,需要的自己去完善。
项目中需要引用:BouncyCastle相关dll文件,可以根据自己的需求在NuGet包中进行相应版本的下载和安装。
下图是我下载的版本,用在wpf项目中的,仅供参考
1、私钥加密,公钥解密的源码
using Org.BouncyCastle.Asn1.Pkcs; using Org.BouncyCastle.Asn1.X509; using Org.BouncyCastle.Asn1; using Org.BouncyCastle.Crypto.Encodings; using Org.BouncyCastle.Crypto.Engines; using Org.BouncyCastle.Crypto.Generators; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Pkcs; using Org.BouncyCastle.Security; using Org.BouncyCastle.X509; using System; using System.Text; namespace LS.Card.WPF.Helper { /// <summary> /// c#对应java的私钥加密、公钥解密 /// </summary> public class RSAForJava { /// <summary> /// KEY 结构体 /// </summary> public struct RSAKEY { /// <summary> /// 公钥 /// </summary> public string PublicKey { get; set; } /// <summary> /// 私钥 /// </summary> public string PrivateKey { get; set; } } public RSAKEY GetKey() { //RSA密钥对的构造器 RsaKeyPairGenerator keyGenerator = new RsaKeyPairGenerator(); //RSA密钥构造器的参数 RsaKeyGenerationParameters param = new RsaKeyGenerationParameters( Org.BouncyCastle.Math.BigInteger.ValueOf(3), new Org.BouncyCastle.Security.SecureRandom(), 1024, //密钥长度 25); //用参数初始化密钥构造器 keyGenerator.Init(param); //产生密钥对 AsymmetricCipherKeyPair keyPair = keyGenerator.GenerateKeyPair(); //获取公钥和密钥 AsymmetricKeyParameter publicKey = keyPair.Public; AsymmetricKeyParameter privateKey = keyPair.Private; SubjectPublicKeyInfo subjectPublicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(publicKey); PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(privateKey); Asn1Object asn1ObjectPublic = subjectPublicKeyInfo.ToAsn1Object(); byte[] publicInfoByte = asn1ObjectPublic.GetEncoded("UTF-8"); Asn1Object asn1ObjectPrivate = privateKeyInfo.ToAsn1Object(); byte[] privateInfoByte = asn1ObjectPrivate.GetEncoded("UTF-8"); RSAKEY item = new RSAKEY() { PublicKey = Convert.ToBase64String(publicInfoByte), PrivateKey = Convert.ToBase64String(privateInfoByte) }; return item; } private AsymmetricKeyParameter GetPublicKeyParameter(string s) { s = s.Replace("\r", "").Replace("\n", "").Replace(" ", ""); byte[] publicInfoByte = Convert.FromBase64String(s); Asn1Object pubKeyObj = Asn1Object.FromByteArray(publicInfoByte);//这里也可以从流中读取,从本地导入 AsymmetricKeyParameter pubKey = PublicKeyFactory.CreateKey(publicInfoByte); return pubKey; } private AsymmetricKeyParameter GetPrivateKeyParameter(string s) { s = s.Replace("\r", "").Replace("\n", "").Replace(" ", ""); byte[] privateInfoByte = Convert.FromBase64String(s); // Asn1Object priKeyObj = Asn1Object.FromByteArray(privateInfoByte);//这里也可以从流中读取,从本地导入 // PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(privateKey); AsymmetricKeyParameter priKey = PrivateKeyFactory.CreateKey(privateInfoByte); return priKey; } /// <summary> /// 私钥加密 /// </summary> /// <param name="s"></param> /// <param name="key"></param> /// <returns></returns> public string EncryptByPrivateKey(string s, string key) { //非对称加密算法,加解密用 IAsymmetricBlockCipher engine = new Pkcs1Encoding(new RsaEngine()); //加密 try { engine.Init(true, GetPrivateKeyParameter(key)); byte[] byteData = System.Text.Encoding.UTF8.GetBytes(s); var ResultData = engine.ProcessBlock(byteData, 0, byteData.Length); return Convert.ToBase64String(ResultData); } catch (Exception ex) { return ex.Message; } } /// <summary> /// 公钥解密 /// </summary> /// <param name="s"></param> /// <param name="key"></param> /// <returns></returns> public string DecryptByPublicKey(string s, string key) { s = s.Replace("\r", "").Replace("\n", "").Replace(" ", ""); //非对称加密算法,加解密用 IAsymmetricBlockCipher engine = new Pkcs1Encoding(new RsaEngine()); //解密 try { engine.Init(false, GetPublicKeyParameter(key)); byte[] byteData = Convert.FromBase64String(s); var ResultData = engine.ProcessBlock(byteData, 0, byteData.Length); return Encoding.UTF8.GetString(ResultData); } catch (Exception ex) { return ex.Message; } } } }
2、加密、解密之调用
此处调用时,自己写上Java中对应的公钥和私钥。
//java的私钥和公钥 string PUBLIC_KEY = "此处填写java中的公钥"; string PRIVATE_KEY = "此处填写java中的私钥"; string mes = "888888"; RSAForJava rSAForJava = new RSAForJava(); string enc = rSAForJava.EncryptByPrivateKey(mes, PRIVATE_KEY); //私钥加密
string dec = rSAForJava.DecryptByPublicKey(enc, PUBLIC_KEY); //公钥解密
3、查看调用效果
如下图,私钥进行加密,公钥进行解密,解密后的明文和加密器的明文一致。
故使用java的密钥,在c#中进行私钥加密公钥解密,顺利解决。
引用网址:https://www.cnblogs.com/lhxsoft/p/10801158.html