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算法定义:非对称算法, 加密密钥和解密密钥不一样,一般加密密钥称为私钥,解密密钥称为公钥,私钥加密后只能用公钥解密, 当然也可以用公钥加密,用私钥解密.
RSA和DES------加密和解密类的更多相关文章
- Java DES 加密和解密源码(转)
原文地址:http://www.oschina.net/code/snippet_727646_18383 Java密码学结构设计遵循两个原则: 1) 算法的独立性和可靠性. 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 ...
- C#使用RSA证书文件加密和解密示例
修改MSDN上的示例,使之可以通过RSA证书文件加密和解密,中间遇到一个小问题. Q:执行ExportParameters()方法时,回报CryptographicException:该项不适于在指定 ...
- DES加密与解密在GET请求时解密失败的问题
DES加密与解密在GET请求时解密失败的问题 在数据进行加密后传递会更安全,但可能有个问题:就是Url编码问题,如果不对Url进行编码直接加密,那么在解密时,如果字符串存在 “+”,这种特殊符号,在解 ...
- 【Java】通过DES加密和解密工具,对字符串进行加密和解密操作
分享一个非常不错的字符串加密和解密的程序. 可以指定不同的密钥对同一字符串进行不同的加密操作,增强加密性能. Java代码如下: package com.app; import java.securi ...
- DES加密和解密PHP,Java,ObjectC统一的方法
原文:DES加密和解密PHP,Java,ObjectC统一的方法 PHP的加解密函数 <?php class DesComponent { var $key = '12345678'; func ...
- DES加密与解密MD5加密帮助类
public class TrialHelper { //默认密钥向量 private static byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xA ...
- 对称加密----AES和DES加密、解密
目前主流的加密方式有:(对称加密)AES.DES (非对称加密)RSA.DSA 调用AES/DES加密算法包最精要的就是下面两句话: Cipher cipher = Cipher.get ...
- java实现DES加密与解密,md5加密
很多时候要对秘要进行持久化加密,此时的加密采用md5.采用对称加密的时候就采用DES方法了 import java.io.IOException; import java.security.Messa ...
随机推荐
- WPF学习系列之八(形状,画刷和变换)
形状,画刷和变换 概述: 在许多用户界面技术中,普通控件和自定义绘图之间具有清晰的区别.通常来说,绘图特性只用于特定的应用程序--如游戏,数据可视化和物理仿真等.而WPF具有一个非常不同的原则.它 ...
- 获取AX的窗口所有控件的lableID及内容
思路,穷举Forms\TargetFormName 在AOT上面的路径得到TreeNode, 遍历各控件的属性. a1,先读Label属性,没有就读Caption属性及Text属性. a2,若a1取不 ...
- 转载:性能优化——统计信息——SQLServer自动更新和自动创建统计信息选项
这段时间AX查询变得非常慢,每天都有很多锁. 最后发现是数据库统计信息需要更新. ----------------------------------------------------------- ...
- iConvert Icons 图标转换生成利器,支持Windows, Mac OS X, Linux, iOS,和Android等系统
这是一款在线图标转换工具,生成的图标支持Windows, Mac OS X, Linux, iOS, 和 Android等主流系统. 可以上传图标文件转化成另一个平台下的图标文件,例如将windows ...
- js实现文字字幕滚动
<div class="dggd_r" id="h" style="height:400px;overflow:hidden;display:i ...
- android自定义控件实现TextView按下后字体颜色改变
今天跟大家分享一下Android自定义控件入门,先介绍一个简单的效果TextView,按下改变字体颜色,后期慢慢扩展更强大的功能 直接看图片 第一张是按下后截的图,功能很简单, ...
- decode行转列,case when,
1.行转列 转之前:
- 学习c编程的第三天
#include<stdio.h> int add(int,int); int main(){ int x=add(1,2); printf("%d",x); retu ...
- 选择两个字段时distinct位置的影响
当选择两个字段时,例如:"select XX1, XX2 from tb; ",那么将distinct放在前一个字段XX1之前和放在后一个字段XX2之前,结果有什么不同呢? 先说结 ...
- centos查看设置端口开放状态
centos查看端口是否已开放/etc/init.d/iptables status centos开放端口/sbin/iptables -I INPUT -p tcp --dport 8000 -j ...