1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > C#可用的RSA公钥加密私钥解密以及私钥加密公钥解密 支持2048

C#可用的RSA公钥加密私钥解密以及私钥加密公钥解密 支持2048

时间:2020-10-22 21:09:16

相关推荐

C#可用的RSA公钥加密私钥解密以及私钥加密公钥解密 支持2048

比较好用的RSA在线验证工具:

https://the-/Cryptography/Rsa.aspx

这几天整理的代码如下

需引用:

using Org.BouncyCastle.Asn1;using Org.BouncyCastle.Asn1.Pkcs;using Org.BouncyCastle.Asn1.X509;using Org.BouncyCastle.Crypto;using Org.BouncyCastle.Crypto.Encodings;using Org.BouncyCastle.Crypto.Engines;using Org.BouncyCastle.Crypto.Generators;using Org.BouncyCastle.Crypto.Parameters;using Org.BouncyCastle.Pkcs;using Org.BouncyCastle.Security;using Org.BouncyCastle.X509;

1、C#私钥加密、公钥解密

```csharppublic sealed class RSACrypt2{/// <summary>/// 生成签名/// </summary>public static RSAKEY GetKey(int keyleng){//RSA密钥对的构造器 RsaKeyPairGenerator keyGenerator = new RsaKeyPairGenerator();//RSA密钥构造器的参数 RsaKeyGenerationParameters param = new RsaKeyGenerationParameters(Org.BouncyCastle.Math.BigInteger.ValueOf(3),new Org.BouncyCastle.Security.SecureRandom(),keyleng, //密钥长度 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 static 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 static 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">私钥(java产出的string)</param>public static 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);//Console.WriteLine("密文(base64编码):" + Convert.ToBase64String(testData) + Environment.NewLine);}catch (Exception ex){return ex.Message;}}/// <summary>/// 公钥解密/// </summary>/// <param name="s">明文</param>/// <param name="key">公钥(java产出的string)</param>public static 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 System.Text.Encoding.UTF8.GetString(ResultData);}catch (Exception ex){return ex.Message;}}/// <summary>/// KEY 结构体/// </summary>public struct RSAKEY{public string PublicKey {get; set; }// 公钥public string PrivateKey {get; set; }// 私钥}}

2、C#公钥加密。私钥加密

public sealed class RSACrypt1{/// <summary> /// 公钥加密 /// </summary> /// <param name="resData">需要加密的字符串</param> /// <param name="publicKey">公钥</param> /// <param name="input_charset">编码格式</param> /// <returns>明文</returns> public static string encryptData(string resData, string publicKey, string input_charset){byte[] DataToEncrypt = Encoding.ASCII.GetBytes(resData);string result = encrypt(DataToEncrypt, publicKey, input_charset);return result;}/// <summary> /// 私钥解密 /// </summary> /// <param name="resData">加密字符串</param> /// <param name="privateKey">私钥</param> /// <param name="input_charset">编码格式</param> /// <returns>明文</returns> public static string decryptData(string resData, string privateKey, string input_charset){byte[] DataToDecrypt = Convert.FromBase64String(resData);string result = "";//for (int j = 0; j < DataToDecrypt.Length / 128; j++)//{// byte[] buf = new byte[128];// for (int i = 0; i < 128; i++)// {// buf[i] = DataToDecrypt[i + 128 * j];// }// result += decrypt(buf, privateKey, input_charset);//}result += decrypt(DataToDecrypt, privateKey, input_charset);return result;}private static string encrypt(byte[] data, string publicKey, string input_charset){RSACryptoServiceProvider rsa = DecodePemPublicKey(publicKey);SHA1 sh = new SHA1CryptoServiceProvider();byte[] result = rsa.Encrypt(data, false);return Convert.ToBase64String(result);}private static string decrypt(byte[] data, string privateKey, string input_charset){string result = "";RSACryptoServiceProvider rsa = DecodePemPrivateKey(privateKey);SHA1 sh = new SHA1CryptoServiceProvider();byte[] source = rsa.Decrypt(data, false);char[] asciiChars = new char[Encoding.GetEncoding(input_charset).GetCharCount(source, 0, source.Length)];Encoding.GetEncoding(input_charset).GetChars(source, 0, source.Length, asciiChars, 0);result = new string(asciiChars);return result;}private static RSACryptoServiceProvider DecodePemPrivateKey(String pemstr){byte[] pkcs8privatekey;pkcs8privatekey = Convert.FromBase64String(pemstr);if (pkcs8privatekey != null){RSACryptoServiceProvider rsa = DecodePrivateKeyInfo(pkcs8privatekey);return rsa;}elsereturn null;}private static RSACryptoServiceProvider DecodePrivateKeyInfo(byte[] pkcs8){byte[] SeqOID = {0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00 };byte[] seq = new byte[15];MemoryStream mem = new MemoryStream(pkcs8);int lenstream = (int)mem.Length;BinaryReader binr = new BinaryReader(mem);byte bt = 0;ushort twobytes = 0;try{twobytes = binr.ReadUInt16();if (twobytes == 0x8130)binr.ReadByte();else if (twobytes == 0x8230)binr.ReadInt16();elsereturn null;bt = binr.ReadByte();if (bt != 0x02)return null;twobytes = binr.ReadUInt16();if (twobytes != 0x0001)return null;seq = binr.ReadBytes(15);if (!CompareBytearrays(seq, SeqOID))return null;bt = binr.ReadByte();if (bt != 0x04)return null;bt = binr.ReadByte();if (bt == 0x81)binr.ReadByte();elseif (bt == 0x82)binr.ReadUInt16();byte[] rsaprivkey = binr.ReadBytes((int)(lenstream - mem.Position));RSACryptoServiceProvider rsacsp = DecodeRSAPrivateKey(rsaprivkey);return rsacsp;}catch (Exception){return null;}finally {binr.Close(); }}private static bool CompareBytearrays(byte[] a, byte[] b){if (a.Length != b.Length)return false;int i = 0;foreach (byte c in a){if (c != b[i])return false;i++;}return true;}private static RSACryptoServiceProvider DecodeRSAPrivateKey(byte[] privkey){byte[] MODULUS, E, D, P, Q, DP, DQ, IQ;MemoryStream mem = new MemoryStream(privkey);BinaryReader binr = new BinaryReader(mem);byte bt = 0;ushort twobytes = 0;int elems = 0;try{twobytes = binr.ReadUInt16();if (twobytes == 0x8130)binr.ReadByte();else if (twobytes == 0x8230)binr.ReadInt16();elsereturn null;twobytes = binr.ReadUInt16();if (twobytes != 0x0102)return null;bt = binr.ReadByte();if (bt != 0x00)return null;elems = GetIntegerSize(binr);MODULUS = binr.ReadBytes(elems);elems = GetIntegerSize(binr);E = binr.ReadBytes(elems);elems = GetIntegerSize(binr);D = binr.ReadBytes(elems);elems = GetIntegerSize(binr);P = binr.ReadBytes(elems);elems = GetIntegerSize(binr);Q = binr.ReadBytes(elems);elems = GetIntegerSize(binr);DP = binr.ReadBytes(elems);elems = GetIntegerSize(binr);DQ = binr.ReadBytes(elems);elems = GetIntegerSize(binr);IQ = binr.ReadBytes(elems);RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();RSAParameters RSAparams = new RSAParameters();RSAparams.Modulus = MODULUS;RSAparams.Exponent = E;RSAparams.D = D;RSAparams.P = P;RSAparams.Q = Q;RSAparams.DP = DP;RSAparams.DQ = DQ;RSAparams.InverseQ = IQ;RSA.ImportParameters(RSAparams);return RSA;}catch (Exception){return null;}finally {binr.Close(); }}private static int GetIntegerSize(BinaryReader binr){byte bt = 0;byte lowbyte = 0x00;byte highbyte = 0x00;int count = 0;bt = binr.ReadByte();if (bt != 0x02)return 0;bt = binr.ReadByte();if (bt == 0x81)count = binr.ReadByte();elseif (bt == 0x82){highbyte = binr.ReadByte();lowbyte = binr.ReadByte();byte[] modint = {lowbyte, highbyte, 0x00, 0x00 };count = BitConverter.ToInt32(modint, 0);}else{count = bt;}while (binr.ReadByte() == 0x00){count -= 1;}binr.BaseStream.Seek(-1, SeekOrigin.Current);return count;}private static RSACryptoServiceProvider DecodePemPublicKey(String pemstr){byte[] pkcs8publickkey;pkcs8publickkey = Convert.FromBase64String(pemstr);if (pkcs8publickkey != null){RSACryptoServiceProvider rsa = DecodeRSAPublicKey(pkcs8publickkey);return rsa;}elsereturn null;}private static RSACryptoServiceProvider DecodeRSAPublicKey(byte[] publickey){byte[] SeqOID = {0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00 };byte[] seq = new byte[15];MemoryStream mem = new MemoryStream(publickey);BinaryReader binr = new BinaryReader(mem);byte bt = 0;ushort twobytes = 0;try{twobytes = binr.ReadUInt16();if (twobytes == 0x8130)binr.ReadByte();else if (twobytes == 0x8230)binr.ReadInt16();elsereturn null;seq = binr.ReadBytes(15);if (!CompareBytearrays(seq, SeqOID))return null;twobytes = binr.ReadUInt16();if (twobytes == 0x8103)binr.ReadByte();else if (twobytes == 0x8203)binr.ReadInt16();elsereturn null;bt = binr.ReadByte();if (bt != 0x00)return null;twobytes = binr.ReadUInt16();if (twobytes == 0x8130)binr.ReadByte();else if (twobytes == 0x8230)binr.ReadInt16();elsereturn null;twobytes = binr.ReadUInt16();byte lowbyte = 0x00;byte highbyte = 0x00;if (twobytes == 0x8102)lowbyte = binr.ReadByte();else if (twobytes == 0x8202){highbyte = binr.ReadByte();lowbyte = binr.ReadByte();}elsereturn null;byte[] modint = {lowbyte, highbyte, 0x00, 0x00 };int modsize = BitConverter.ToInt32(modint, 0);byte firstbyte = binr.ReadByte();binr.BaseStream.Seek(-1, SeekOrigin.Current);if (firstbyte == 0x00){binr.ReadByte();modsize -= 1;}byte[] modulus = binr.ReadBytes(modsize);if (binr.ReadByte() != 0x02)return null;int expbytes = (int)binr.ReadByte();byte[] exponent = binr.ReadBytes(expbytes);RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();RSAParameters RSAKeyInfo = new RSAParameters();RSAKeyInfo.Modulus = modulus;RSAKeyInfo.Exponent = exponent;RSA.ImportParameters(RSAKeyInfo);return RSA;}catch (Exception){return null;}finally {binr.Close(); }}}

3、使用方法

///生成密钥方法RSAKEY key=RSACrypt2.GetKey(2048);pub_key = key.PublicKey;prv_key = key.PrivateKey;///公钥加密string encode = RSACrypt1.encryptData(data,pub_key, "utf-8");///私钥解密string decode = RSACrypt1.decryptData(encode,prv_key, "utf-8");///私钥钥加密string pencode = RSACrypt2.EncryptByPrivateKey(data, prv_key);///公钥解密string pdecode =RSACrypt2.DecryptByPublicKey(pencode, pub_key);

参考:

/lwpoor123/article/details/80177669

/qq_37835111/article/details/87358779

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。