RSA和DES------加密和解密类

时间:2023-03-08 23:36:01
RSA和DES------加密和解密类

public class CryptogramUtil
{
//***********************************************************************

// 将 HexString 转换为 byte[] 数组

//***********************************************************************

public static byte[] HexStringToByte(string hexString)
{
byte[] byteResult = new byte[hexString.Length / 2];

for (int i = 0; i < hexString.Length / 2; i++)

byteResult[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);

return byteResult;
}

#region wince POS

/// <summary>
/// RSA加密
/// </summary>
/// <param name="publicKey">公钥</param>
/// <param name="m_strEncryptString">RSA加密后的数据</param>
/// <returns>RSA公钥加密后的数据</returns>
public static string RSAEncrypt(string publicKey, string m_strEncryptString)
{
Stopwatch watch = new Stopwatch();
watch.Start();
RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
byte[] keyBlob = Convert.FromBase64String(publicKey);
provider.ImportCspBlob(keyBlob);
byte[] bytes = System.Text.Encoding.GetEncoding("utf-8").GetBytes(m_strEncryptString);
int keySize = provider.KeySize / 8;
int bufferSize = keySize - 11;
byte[] buffer = new byte[bufferSize];
MemoryStream msInput = new MemoryStream(bytes);
MemoryStream msOutput = new MemoryStream();
int readLen = msInput.Read(buffer, 0, bufferSize);
while (readLen > 0)
{
byte[] dataToEnc = new byte[readLen];
Array.Copy(buffer, 0, dataToEnc, 0, readLen);
byte[] encData = provider.Encrypt(dataToEnc, false);
msOutput.Write(encData, 0, encData.Length);
readLen = msInput.Read(buffer, 0, bufferSize);
}
msInput.Close();
byte[] result = msOutput.ToArray(); //得到加密结果
msOutput.Close();
provider.Clear();
string retValue = Convert.ToBase64String(result);
watch.Stop();

//if (watch.ElapsedMilliseconds > 1000)
// Framework.IO.Log.DebugerWriteLog("POS加密", string.Format("加密源串:{0} 耗时:{1}", m_strEncryptString, watch.ElapsedMilliseconds), true);
//else
// Framework.IO.Log.DebugerWriteLog("POS加密", string.Format("加密源串:{0} 耗时:{1}", m_strEncryptString, watch.ElapsedMilliseconds));

return retValue;
}

/// <summary>
/// RSA解密
/// </summary>
/// <param name="privateKey">私钥</param>
/// <param name="m_strDecryptString">待解密的数据</param>
/// <returns>解密后的结果</returns>
public static string RSADecrypt(string privateKey, string m_strDecryptString)
{
Stopwatch watch = new Stopwatch();
watch.Start();
RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
byte[] keyBlob = Convert.FromBase64String(privateKey);
provider.ImportCspBlob(keyBlob);
byte[] rgb = Convert.FromBase64String(m_strDecryptString);
int keySize = provider.KeySize / 8;
byte[] buffer = new byte[keySize];
MemoryStream msInput = new MemoryStream(rgb);
MemoryStream msOutput = new MemoryStream();
int readLen = msInput.Read(buffer, 0, keySize);
while (readLen > 0)
{
byte[] dataToDec = new byte[readLen];
Array.Copy(buffer, 0, dataToDec, 0, readLen);
byte[] decData = provider.Decrypt(dataToDec, false);
msOutput.Write(decData, 0, decData.Length);
readLen = msInput.Read(buffer, 0, keySize);
}
msInput.Close();
byte[] result = msOutput.ToArray(); //得到解密结果
msOutput.Close();
provider.Clear();
string retValue = System.Text.Encoding.GetEncoding("utf-8").GetString(result);
watch.Stop();
//if (watch.ElapsedMilliseconds > 1000)
// Framework.IO.Log.DebugerWriteLog("POS解密", string.Format("待解密的数据:{0} 耗时:{1}", m_strDecryptString, watch.ElapsedMilliseconds), true);
//else
// Framework.IO.Log.DebugerWriteLog("POS解密", string.Format("待解密的数据:{0} 耗时:{1}", m_strDecryptString, watch.ElapsedMilliseconds));
return retValue;
}

#endregion

#region android app

/// <summary>
/// RSA加密
/// </summary>
/// <param name="publicKey">公钥</param>
/// <param name="m_strEncryptString">RSA加密后的数据</param>
/// <returns>RSA公钥加密后的数据</returns>
public static string RSAEncryptForApp(string publicKey, string m_strEncryptString)
{
Stopwatch watch = new Stopwatch();
watch.Start();
RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
provider.FromXmlString(publicKey.ToString());
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(m_strEncryptString);
int keySize = provider.KeySize / 8;
int bufferSize = keySize - 11;
byte[] buffer = new byte[bufferSize];
MemoryStream msInput = new MemoryStream(bytes);
MemoryStream msOutput = new MemoryStream();
int readLen = msInput.Read(buffer, 0, bufferSize);
while (readLen > 0)
{
byte[] dataToEnc = new byte[readLen];
Array.Copy(buffer, 0, dataToEnc, 0, readLen);
byte[] encData = provider.Encrypt(dataToEnc, false);
msOutput.Write(encData, 0, encData.Length);
readLen = msInput.Read(buffer, 0, bufferSize);
}
msInput.Close();
byte[] result = msOutput.ToArray(); //得到加密结果
msOutput.Close();
provider.Clear();
string retValue = Convert.ToBase64String(result);
watch.Stop();
//Framework.IO.Log.DebugerWriteLog("App加密", string.Format("源数据:{0} 耗时:{1}", m_strEncryptString, watch.ElapsedMilliseconds));
return retValue;
}

/// <summary>
/// RSA解密
/// </summary>
/// <param name="privateKey">私钥</param>
/// <param name="m_strDecryptString">待解密的数据</param>
/// <returns>解密后的结果</returns>
public static string RSADecryptForApp(string privateKey, string m_strDecryptString)
{
try
{
Stopwatch watch = new Stopwatch();
watch.Start();
RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
provider.FromXmlString(privateKey);
byte[] rgb = Convert.FromBase64String(m_strDecryptString);
int keySize = provider.KeySize / 8;
byte[] buffer = new byte[keySize];
MemoryStream msInput = new MemoryStream(rgb);
MemoryStream msOutput = new MemoryStream();
int readLen = msInput.Read(buffer, 0, keySize);
while (readLen > 0)
{
byte[] dataToDec = new byte[readLen];
Array.Copy(buffer, 0, dataToDec, 0, readLen);
byte[] decData = provider.Decrypt(dataToDec, false);
msOutput.Write(decData, 0, decData.Length);
readLen = msInput.Read(buffer, 0, keySize);
}
msInput.Close();
byte[] result = msOutput.ToArray(); //得到解密结果
msOutput.Close();
provider.Clear();
string retValue = System.Text.Encoding.UTF8.GetString(result);
watch.Stop();

//if (watch.ElapsedMilliseconds > 10)
// Framework.IO.Log.DebugerWriteLog("App解密", string.Format("待解密的数据:{0} 耗时:{1}", m_strDecryptString, watch.ElapsedMilliseconds), true);
//else
// Framework.IO.Log.DebugerWriteLog("App解密", string.Format("待解密的数据:{0} 耗时:{1}", m_strDecryptString, watch.ElapsedMilliseconds));

return retValue;
}
catch (Exception ex)
{
}
return null;
}

#endregion

#region DES编码解码Android

/// <summary>
/// DES解密Android
/// </summary>
/// <param name="strSource">待解密的字符串</param>
/// <param name="desEncryptKey">解密密钥,要求为8位,和加密密钥相同</param>
/// <returns>解密成功返回解密后的字符串,失败返源串</returns>
public static string DesDecodeString(string strSource, string desEncryptKey)
{
Stopwatch watch = new Stopwatch();
watch.Start();
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] inputByteArray = new byte[strSource.Length / 2];
for (int x = 0; x < strSource.Length / 2; x++)
{
int i = (Convert.ToInt32(strSource.Substring(x * 2, 2), 16));
inputByteArray[x] = (byte)i;
}
des.Key = System.Text.Encoding.UTF8.GetBytes(desEncryptKey.Substring(0, 8));
des.IV = System.Text.Encoding.UTF8.GetBytes(desEncryptKey.Substring(0, 8));
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))
{
cs.Write(inputByteArray, 0, inputByteArray.Length);
try
{
cs.FlushFinalBlock();
string retValue = System.Text.Encoding.UTF8.GetString(ms.ToArray());
watch.Stop();
//Framework.IO.Log.DebugerWriteLog("App_DES解密", string.Format("待解密的字符串:{0} 耗时:{1}", strSource, watch.ElapsedMilliseconds));
return retValue;
}
catch
{
throw;
}
}
}
}

/// <summary>
/// DES加密Android
/// </summary>
/// <param name="strSource">待加密的字符串</param>
/// <param name="desEncryptKey">加密密钥,要求为8位</param>
/// <returns>加密成功返回加密后的字符串</returns>
public static string DesEncodeString(string strSource, string desEncryptKey)
{
Stopwatch watch = new Stopwatch();
watch.Start();
byte[] btKey = Encoding.UTF8.GetBytes(desEncryptKey);
byte[] btIV = Encoding.UTF8.GetBytes(desEncryptKey);
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
using (MemoryStream ms = new MemoryStream())
{
byte[] inData = Encoding.UTF8.GetBytes(strSource);
try
{
using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(btKey, btIV), CryptoStreamMode.Write))
{
cs.Write(inData, 0, inData.Length);
cs.FlushFinalBlock();
}
StringBuilder ret = new StringBuilder();
foreach (byte b in ms.ToArray())
{
ret.AppendFormat("{0:X2}", b);
}
byte[] Array = Encoding.UTF8.GetBytes(ret.ToString());
watch.Stop();
//Framework.IO.Log.DebugerWriteLog("App_DES加密", string.Format("待加密的字符串:{0} 耗时:{1}", strSource, watch.ElapsedMilliseconds));
return System.Text.Encoding.UTF8.GetString(Array);
}
catch
{
throw;
}
}
}

#endregion

#region RSA证书加密

/// <summary>
/// RSA证书加密
/// </summary>
/// <param name="x509CertRawDataBase64Str">X509Certificate2证书元数据base64字符串</param>
/// <param name="m_strEncryptString">要加密的字符串</param>
/// <returns>经过加密后的数据,base64编码</returns>
/// <remarks>zhangbo 2014-10-13</remarks>
public static string RSAEncryptByCert(string x509CertRawDataBase64Str, string m_strEncryptString)
{
byte[] rawData = Convert.FromBase64String(x509CertRawDataBase64Str);
//实例化一个X509Certificate2对象
X509Certificate2 cert = new X509Certificate2(rawData);
//将证书的公钥强制转换成一个RSACryptoServiceProvider对象,然后可以使用这个对象执行加密操作
RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)cert.PublicKey.Key;
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(m_strEncryptString);
int keySize = rsa.KeySize / 8;
int bufferSize = keySize - 11;
byte[] buffer = new byte[bufferSize];
MemoryStream msInput = new MemoryStream(bytes);
MemoryStream msOutput = new MemoryStream();
int readLen = msInput.Read(buffer, 0, bufferSize);
while (readLen > 0)
{
byte[] dataToEnc = new byte[readLen];
Array.Copy(buffer, 0, dataToEnc, 0, readLen);
byte[] encData = rsa.Encrypt(dataToEnc, false);
msOutput.Write(encData, 0, encData.Length);
readLen = msInput.Read(buffer, 0, bufferSize);
}
msInput.Close();
byte[] result = msOutput.ToArray(); //得到加密结果
msOutput.Close();
rsa.Clear();
string retValue = Convert.ToBase64String(result);
return retValue;
}

#endregion

#region RSA证书解密

/// <summary>
/// RSA证书解密
/// </summary>
/// <param name="x509CertPrivateKey">私钥base64字符串</param>
/// <param name="m_strDecryptString">待解密字符串</param>
/// <returns>解密后数据 UTF8编码</returns>
///<remarks>zhangbo 2014-10-13</remarks>
public static string RSADecryptByCert(string x509CertPrivateKey, string m_strDecryptString)
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(System.Text.Encoding.Default.GetString(Convert.FromBase64String(x509CertPrivateKey)));
byte[] rgb = Convert.FromBase64String(m_strDecryptString);
int keySize = rsa.KeySize / 8;
byte[] buffer = new byte[keySize];
MemoryStream msInput = new MemoryStream(rgb);
MemoryStream msOutput = new MemoryStream();
int readLen = msInput.Read(buffer, 0, keySize);
while (readLen > 0)
{
byte[] dataToDec = new byte[readLen];
Array.Copy(buffer, 0, dataToDec, 0, readLen);
byte[] decData = rsa.Decrypt(dataToDec, false);
msOutput.Write(decData, 0, decData.Length);
readLen = msInput.Read(buffer, 0, keySize);
}
msInput.Close();
byte[] result = msOutput.ToArray(); //得到解密结果
msOutput.Close();
rsa.Clear();
string retValue = System.Text.Encoding.UTF8.GetString(result);
return retValue;
}

#endregion

#region DES 加密 IOS

/// <summary>
/// DES 加密 IOS
/// </summary>
/// <param name="sourceString">待加密字符串</param>
/// <param name="keyValue">密钥 长度8位</param>
/// <returns></returns>
public static string DesEncrypt(string sourceString, string keyValue)
{
byte[] btKey = Encoding.UTF8.GetBytes(keyValue);
byte[] btIV = Encoding.UTF8.GetBytes(keyValue);
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
using (MemoryStream ms = new MemoryStream())
{
byte[] inData = Encoding.UTF8.GetBytes(sourceString);
try
{
using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(btKey, btIV), CryptoStreamMode.Write))
{
cs.Write(inData, 0, inData.Length);
cs.FlushFinalBlock();
}
StringBuilder ret = new StringBuilder();
foreach (byte b in ms.ToArray())
{
ret.AppendFormat("{0:X2}", b);
}
byte[] Array = Encoding.UTF8.GetBytes(ret.ToString());
return System.Text.Encoding.UTF8.GetString(Array);
}
catch
{
throw;
}
}
}

#endregion

/// <summary>
/// MD5加密
/// </summary>
/// <param name="text">加密原数据</param>
/// <returns>MD5加密后字符串</returns>
public static string MD5Encrypt(string text)
{
return FormsAuthentication.HashPasswordForStoringInConfigFile(text, "md5").ToUpper();
}
}

-----------------------------------------

//测试信息

-----------------------------------------

string pubKeyXml3 = "<RSAKeyValue><Modulus>wVwBKuePO3ZZbZ//gqaNuUNyaPHbS3e2v5iDHMFRfYHS/bFw+79GwNUiJ+wXgpA7SSBRhKdLhTuxMvCn1aZNlXaMXIOPG1AouUMMfr6kEpFf/V0wLv6NCHGvBUK0l7O+2fxn3bR1SkHM1jWvLPMzSMBZLCOBPRRZ5FjHAy8d378=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
string priKeyXml3 = "<RSAKeyValue><Modulus>wVwBKuePO3ZZbZ//gqaNuUNyaPHbS3e2v5iDHMFRfYHS/bFw+79GwNUiJ+wXgpA7SSBRhKdLhTuxMvCn1aZNlXaMXIOPG1AouUMMfr6kEpFf/V0wLv6NCHGvBUK0l7O+2fxn3bR1SkHM1jWvLPMzSMBZLCOBPRRZ5FjHAy8d378=</Modulus><Exponent>AQAB</Exponent><P>64ZxmWRaS8jXsVhv1IOQh+4dD9z9jfa9BAWDPvQykHcLUKE1h1jGoOTf6xby+4Wmb9FXdXifNj1WnJAwD1LGfw==</P><Q>0isr6Q0S01fL9HkOdrf5EJRIehhl4KZtFwEnEreNCg7PnDUlwVM9Uw+bGKrCzy0ZT1pbry9DkWLPY0srK9DGwQ==</Q><DP>DKoaCal/wXt3Pa4HtWGtr+F55pR3fd66ozC4sfXnkiUUkq1Yd4Kqi5RDBh0hy6yQGosjLMnjpcL+mUSXkPteeQ==</DP><DQ>g4/U1/mAHF5sZShWnoiB2BgK2qtlMuDbjzgAfp36Ix6sZat7a+6wh8tQGnvioRApNNxqYlqi4GLLUevfJXl2wQ==</DQ><InverseQ>kDJPNy+K90v4dAwUbREsx8fJAy3k0QAEy5Jk+Mq0ZIVzfTZ6tX4W+J1N8VwpM0uZcV+1nZiLu4E3ePaZgZQWig==</InverseQ><D>B3Dc8qO6lVU2l8tib8qtBYYc7wDvqXXP6Iub8A1Yb3YBgpXDfUydEmqhR9wEA5g9T9EYkfxGIbhsV0N/ke82aQriEBug4sUsRHiqfpfyW+MH1AHi71Z4qpu3GtjPuFEwKlCVDunK8xOn0cqYEs/SMnODJnbYMmtlcnfFic8PwQE=</D></RSAKeyValue>";

string str = "测试";
string s = CryptogramUtil.RSAEncryptForApp(pubKeyXml3, str);
s = CryptogramUtil.RSADecryptForApp(priKeyXml3, s);

string p = CryptogramUtil.DesEncodeString(str,"12345678");
p = CryptogramUtil.DesDecodeString(p, "12345678");

////////////////////////////////////////////////////

总结:

RSA和DES算法的优缺点:
  DES算法:密钥较短,加密处理简单,加解密速度快,适用于加密大量数据的场合。 RSA算法:加密密钥和解密密钥是不一样的,或者说不能由其中一个密钥推导出另一个密钥。密钥尺寸大,加解密速度慢,一般用来加密少量数据,比如DES的密钥。
  DES算法定义:是对称算法,加密的密钥和解密的密钥是一样的.
RSA算法定义:非对称算法, 加密密钥和解密密钥不一样,一般加密密钥称为私钥,解密密钥称为公钥,私钥加密后只能用公钥解密, 当然也可以用公钥加密,用私钥解密.