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算法定义:非对称算法, 加密密钥和解密密钥不一样,一般加密密钥称为私钥,解密密钥称为公钥,私钥加密后只能用公钥解密, 当然也可以用公钥加密,用私钥解密.

RSA和DES------加密和解密类的更多相关文章

  1. Java DES 加密和解密源码(转)

    原文地址:http://www.oschina.net/code/snippet_727646_18383 Java密码学结构设计遵循两个原则: 1) 算法的独立性和可靠性. 2) 实现的独立性和相互 ...

  2. 一、DES加密和解密

    一.DES加密和解密 原文:http://www.jb51.net/article/51879.htm  还有其他文章 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 ...

  3. C#使用RSA证书文件加密和解密示例

    修改MSDN上的示例,使之可以通过RSA证书文件加密和解密,中间遇到一个小问题. Q:执行ExportParameters()方法时,回报CryptographicException:该项不适于在指定 ...

  4. DES加密与解密在GET请求时解密失败的问题

    DES加密与解密在GET请求时解密失败的问题 在数据进行加密后传递会更安全,但可能有个问题:就是Url编码问题,如果不对Url进行编码直接加密,那么在解密时,如果字符串存在 “+”,这种特殊符号,在解 ...

  5. 【Java】通过DES加密和解密工具,对字符串进行加密和解密操作

    分享一个非常不错的字符串加密和解密的程序. 可以指定不同的密钥对同一字符串进行不同的加密操作,增强加密性能. Java代码如下: package com.app; import java.securi ...

  6. DES加密和解密PHP,Java,ObjectC统一的方法

    原文:DES加密和解密PHP,Java,ObjectC统一的方法 PHP的加解密函数 <?php class DesComponent { var $key = '12345678'; func ...

  7. DES加密与解密MD5加密帮助类

    public class TrialHelper { //默认密钥向量 private static byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xA ...

  8. 对称加密----AES和DES加密、解密

    目前主流的加密方式有:(对称加密)AES.DES        (非对称加密)RSA.DSA 调用AES/DES加密算法包最精要的就是下面两句话: Cipher cipher = Cipher.get ...

  9. java实现DES加密与解密,md5加密

    很多时候要对秘要进行持久化加密,此时的加密采用md5.采用对称加密的时候就采用DES方法了 import java.io.IOException; import java.security.Messa ...

随机推荐

  1. js DOM的几个常用方法

    <div id="div1">这是个测试</div> <p </p> <p </p> //js DOM的几个常用方法 / ...

  2. 前端工程筹建NodeJs+gulp+bower

    1.安装nodejs nodejs 官网下载安装文件 安装完成之后,在命令窗口执行,(显示nodejs版本) 和(显示npm版本)可以使用这两个命令查看是否安装成功: node -v npm -v 2 ...

  3. javascript ES5 Object对象

    原文:http://javascript.ruanyifeng.com/stdlib/object.html 目录 概述 Object对象的方法 Object() Object.keys(),Obje ...

  4. Solaris网络配置

    /etc/hostname.interface:物理端口,里面包含一个主机名或主机的IP/etc/nodename:计算机名/etc/defaultdomain:主机域名/etc/defaultrou ...

  5. OpenJudge 2809 计算2的N次方

    1.链接地址: http://bailian.openjudge.cn/practice/2809/ 2.题目: 总时间限制: 1000ms 内存限制: 65536kB 描述 任意给定一个正整数N(N ...

  6. 对于返回void类型的asyc的异步方法,如何修改,能使用await

    下面是使用WebClinet 获取百度首页的html代码,一般的写法如下: private void Button_Click(object sender, RoutedEventArgs e) { ...

  7. seaJS学习资料参考

    seajs官方文档:http://seajs.org/docs/#docs http://wenku.it168.com/d_000096482.shtml http://blog.codinglab ...

  8. Objective-C控制语句

    Objective-C控制语句有以下三类: 分支语句:if-else,switch 循环语句:while,do-while,for 与程序转移相关的跳转语句:break,continue,goto. ...

  9. jQuery身份证验证插件

    jQuery身份证验证插件 /*! * jQuery isIDCard Plugin v1.0.0 * http://www.cnblogs.com/cssfirefly/p/5629561.html ...

  10. Ubuntu10.10的网络配置

    有一阵子着实对Ubuntu的网络配置很迷惑,耐下心来仔细上网找了找,有点小心得,总结一下. 先说下大概的配置过程,再去细究一些情况. 一.配置大概分三类:通过配置文件配置.通过命令配置.通过图形化的网 ...