|
|

- public static class RSACryptoProvider
- {
- /// <summary>
- /// RSA解密
- /// </summary>
- /// <param name="base64code">需要进行解密的密文字符串</param>
- /// <param name="privateKey">私钥</param>
- /// <returns>解密后的明文</returns>
- public static string Decrypt(string base64code, string privateKey)
- {
- UnicodeEncoding ByteConverter = new UnicodeEncoding();
- RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
- RSA.FromXmlString(privateKey);
- byte[] encryptedData;
- byte[] decryptedData;
- encryptedData = Convert.FromBase64String(base64code);
- decryptedData = RSADecrypt(encryptedData, RSA.ExportParameters(true), false);
- return ByteConverter.GetString(decryptedData);
- }
- /// <summary>
- /// RSA分段解密;用于对超长字符串解密
- /// </summary>
- /// <param name="toEncryptString">需要进行解密的字符串</param>
- /// <param name="publickKey">私钥</param>
- /// <returns>解密后的明文</returns>
- public static string SectionDecrypt(string base64code, string privateKey)
- {
- UnicodeEncoding ByteConverter = new UnicodeEncoding();
- RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
- RSA.FromXmlString(privateKey);
- Byte[] CiphertextData = Convert.FromBase64String(base64code);
- int MaxBlockSize = RSA.KeySize / 8;
- if (CiphertextData.Length <= MaxBlockSize)
- {
- byte[] decryptedData;
- decryptedData = RSADecrypt(CiphertextData, RSA.ExportParameters(true), false);
- return ByteConverter.GetString(decryptedData);
- }
- MemoryStream CrypStream = new MemoryStream(CiphertextData);
- MemoryStream PlaiStream = new MemoryStream();
- Byte[] Buffer = new Byte[MaxBlockSize];
- int BlockSize = CrypStream.Read(Buffer, 0, MaxBlockSize);
- while (BlockSize > 0)
- {
- Byte[] ToDecrypt = new Byte[BlockSize];
- Array.Copy(Buffer, 0, ToDecrypt, 0, BlockSize);
- Byte[] Plaintext = RSADecrypt(ToDecrypt, RSA.ExportParameters(true), false);
- PlaiStream.Write(Plaintext, 0, Plaintext.Length);
- BlockSize = CrypStream.Read(Buffer, 0, MaxBlockSize);
- }
- return ByteConverter.GetString(PlaiStream.ToArray());
- }
- /// <summary>
- /// RSA加密
- /// </summary>
- /// <param name="toEncryptString">需要进行加密的字符串</param>
- /// <param name="publicKey">公钥</param>
- /// <returns>加密后的密文</returns>
- public static string Encrypt(string toEncryptString, string publicKey)
- {
- UnicodeEncoding ByteConverter = new UnicodeEncoding();
- byte[] dataToEncrypt = ByteConverter.GetBytes(toEncryptString);
- byte[] encrytedData;
- RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
- RSA.FromXmlString(publicKey);
- encrytedData = RSAEncrypt(dataToEncrypt, RSA.ExportParameters(false), false);
- string base64code = Convert.ToBase64String(encrytedData);
- return base64code;
- }
- /// <summary>
- /// RSA分段加密;用于对超长字符串加密
- /// </summary>
- /// <param name="toEncryptString">需要进行加密的字符串</param>
- /// <param name="publickKey">公钥</param>
- /// <returns>加密后的密文</returns>
- public static string SectionEncrypt(string toEncryptString, string publickKey)
- {
- string base64code = string.Empty;
- UnicodeEncoding ByteConverter = new UnicodeEncoding();
- byte[] dataToEncrypt = ByteConverter.GetBytes(toEncryptString);
- RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
- RSA.FromXmlString(publickKey);
- int MaxBlockSize = RSA.KeySize / 8 - 11;
- if (dataToEncrypt.Length <= MaxBlockSize)
- {
- byte[] encrytedData;
- encrytedData = RSAEncrypt(dataToEncrypt, RSA.ExportParameters(false), false);
- base64code = Convert.ToBase64String(encrytedData);
- return base64code;
- }
- MemoryStream plaiStream = new MemoryStream(dataToEncrypt);
- MemoryStream CrypStream = new MemoryStream();
- Byte[] Buffer = new Byte[MaxBlockSize];
- int BlockSize = plaiStream.Read(Buffer, 0, MaxBlockSize);
- while (BlockSize > 0)
- {
- Byte[] ToEncrypt = new Byte[BlockSize];
- Array.Copy(Buffer, 0, ToEncrypt, 0, BlockSize);
- Byte[] Cryptograph = RSAEncrypt(ToEncrypt, RSA.ExportParameters(false), false);
- CrypStream.Write(Cryptograph, 0, Cryptograph.Length);
- BlockSize = plaiStream.Read(Buffer, 0, MaxBlockSize);
- }
- base64code = Convert.ToBase64String(CrypStream.ToArray(), Base64FormattingOptions.None);
- return base64code;
- }
- /// <summary>
- /// RSA生成公钥和私钥
- /// </summary>
- /// <returns></returns>
- public static string[] GenerateKeys()
- {
- try
- {
- string[] sKeys = new String[2];
- RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
- sKeys[0] = rsa.ToXmlString(true);
- sKeys[1] = rsa.ToXmlString(false);
- return sKeys;
- }
- catch (Exception)
- {
- return null;
- }
- }
- private static byte[] RSAEncrypt(byte[] DataToEncrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding)
- {
- RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
- RSA.ImportParameters(RSAKeyInfo);
- return RSA.Encrypt(DataToEncrypt, DoOAEPPadding);
- }
- private static byte[] RSADecrypt(byte[] DataToDecrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding)
- {
- RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
- RSA.ImportParameters(RSAKeyInfo);
- return RSA.Decrypt(DataToDecrypt, DoOAEPPadding);
- }
- }
复制代码
|
上一篇:用数组名做函数的参数 数组的逆序存放下一篇:将数组逆序存放,函数inv中的形参是 指针变量
|