利用RSACryptoServiceProvider进行RSA加密解密
前言:
本文只介绍How to use,对于加密算法的研究不予讨论。
关于私钥的存储,微软给的建议是使用windows自带的秘钥容器,相见文档。
为了直观看到私钥和公钥,本文直接将其存入XML文件中。现实情况则要复杂的多,还牵涉到数字签名、数字证书等。
关于公钥、私钥、数字签名、数字证书的概念,相见阮一峰大神的博客,传送门在这里。
正文:
由于RSA不适合加密大量数据,所以可以采用DES和RSA混合加密的方法,即先用DES加密数据,再用RSA加密DES的秘钥。
RSAHelper 类
public class RSAHelper
{
/// <summary>
/// 读取二进制文件
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
public static byte[] GetByte(string path)
{
FileInfo fi = new FileInfo(path);
List<byte> buff = new List<byte>();
using (FileStream fs = fi.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
BinaryReader br = new BinaryReader(fs);
try
{
while (true)
{
byte i = br.ReadByte();
buff.Add(i);
}
}
catch (Exception)
{
br.Close();
}
}
return buff.ToArray();
} /// <summary>
/// 读取文本文件
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
public static string GetText(string path)
{
FileInfo fi = new FileInfo(path);
string content;
using (FileStream fs = fi.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
StreamReader sr = new StreamReader(fs);
content = sr.ReadToEnd();
sr.Close();
}
return content;
} /// <summary>
/// 写入二进制文件
/// </summary>
/// <param name="content"></param>
/// <param name="path"></param>
public static void WriteByte(byte[] content, string path)
{
FileInfo fi = new FileInfo(path);
using (FileStream fs = fi.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
BinaryWriter br = new BinaryWriter(fs);
br.Write(content);
br.Flush();
br.Close();
}
} /// <summary>
/// 写入文本文件
/// </summary>
/// <param name="content"></param>
/// <param name="path"></param>
public static void WriteText(string content, string path)
{
FileInfo fi = new FileInfo(path);
using (FileStream fs = fi.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
StreamWriter sw = new StreamWriter(fs);
sw.Write(content);
sw.Flush();
sw.Close();
}
} /// <summary>
/// RSA加密/解密
/// </summary>
/// <param name="data">加密/解密数据</param>
/// <param name="key">公钥/私钥</param>
/// <param name="isEncrypt">ture加密,false解密</param>
/// <returns></returns>
public static byte[] EncryptOrDecrypt(byte[] data, string key, bool isEncrypt)
{
RSACryptoServiceProvider rsaP = new RSACryptoServiceProvider();
rsaP.FromXmlString(key);
if (isEncrypt)// 加密
{
byte[] buff = rsaP.Encrypt(data, true);
return buff;
}
else // 解密
{
byte[] buff = rsaP.Decrypt(data, true);
return buff;
} }
}
RSAHelper类
DESHelper 类
public class DESHelper
{
/// <summary>
/// DES加密/解密
/// </summary>
/// <param name="data">加密/解密数据</param>
/// <param name="key">秘钥</param>
/// <param name="keyIV">向量</param>
/// <param name="isEncrypt">true加密,false解密</param>
/// <returns></returns>
public static byte[] EncryptOrDecrypt(byte[] data, byte[] key, byte[] keyIV, bool isEncrypt)
{
DESCryptoServiceProvider desP = new DESCryptoServiceProvider();
if (isEncrypt)// 加密
{
desP.Key = key;
desP.IV = keyIV;
ICryptoTransform desencrypt = desP.CreateEncryptor(key, keyIV);
byte[] result = desencrypt.TransformFinalBlock(data, , data.Length);
return result;
}
else // 解密
{
desP.Key = key;
desP.IV = keyIV;
ICryptoTransform desencrypt = desP.CreateDecryptor(key, keyIV);
byte[] result = desencrypt.TransformFinalBlock(data, , data.Length);
return result;
}
} /// <summary>
/// 创建随机秘钥
/// </summary>
/// <returns></returns>
public static byte[] CreateKey()
{
DESCryptoServiceProvider desP = new DESCryptoServiceProvider();
desP.GenerateKey();
return desP.Key;
} /// <summary>
/// 创建随机向量
/// </summary>
/// <returns></returns>
public static byte[] CreateIV()
{
DESCryptoServiceProvider desP = new DESCryptoServiceProvider();
desP.GenerateIV();
return desP.IV;
}
}
DESHelper类
主程序代码
class Program
{
static void Main(string[] args)
{
string rootPath = AppDomain.CurrentDomain.BaseDirectory;
string RSAPath = Path.Combine(rootPath, "RSA");
string encryptFilePath = Path.Combine(RSAPath, "加密文件.dll");
string decryptFilePath = Path.Combine(RSAPath, "解密文件.txt");
string publicKeyPath = Path.Combine(RSAPath, "RSA公钥.xml");
string privateKeyPath = Path.Combine(RSAPath, "RSA私钥.xml");
string DESKeyPath = Path.Combine(RSAPath, "经过RSA加密的DES秘钥.dll");
string DESIVPath = Path.Combine(RSAPath, "经过RSA加密的DES向量.dll");
if (Directory.Exists(RSAPath))
{
Directory.Delete(RSAPath, true);
}
Directory.CreateDirectory(RSAPath); Console.WriteLine("请输入要加密的内容:");
string data = Console.ReadLine(); RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
string RSAPublic = rsa.ToXmlString(false);// RSA公钥
string RSAPrivate = rsa.ToXmlString(true);// RSA私钥
byte[] DESKey = DESHelper.CreateKey(); // DES秘钥
byte[] DESIV = DESHelper.CreateIV(); // DES向量
// DES加密输入内容
byte[] enData = DESHelper.EncryptOrDecrypt(Encoding.Unicode.GetBytes(data), DESKey, DESIV, true);
// 写入加密文件
RSAHelper.WriteByte(enData, encryptFilePath);
// 写入RSA公钥
RSAHelper.WriteText(RSAPublic, publicKeyPath);
// 写入RSA私钥
RSAHelper.WriteText(RSAPrivate, privateKeyPath);
// 写入经过RSA加密的DES秘钥
RSAHelper.WriteByte(RSAHelper.EncryptOrDecrypt(DESKey, RSAPublic, true), DESKeyPath);
// 写入经过RSA加密的DES向量
RSAHelper.WriteByte(RSAHelper.EncryptOrDecrypt(DESIV, RSAPublic, true), DESIVPath); // 读取RSA私钥
string privateKey = RSAHelper.GetText(privateKeyPath);
// 读取DES秘钥并解密
byte[] realDESKey = RSAHelper.EncryptOrDecrypt(RSAHelper.GetByte(DESKeyPath), privateKey, false);
// 读取DES向量并解密
byte[] realDESIV = RSAHelper.EncryptOrDecrypt(RSAHelper.GetByte(DESIVPath), privateKey, false);
// 读取加密文件
byte[] enData2 = RSAHelper.GetByte(encryptFilePath);
// 解密文件
byte[] deData = DESHelper.EncryptOrDecrypt(enData2, realDESKey, realDESIV, false);
// 写入解密文件
RSAHelper.WriteText(Encoding.Unicode.GetString(deData), decryptFilePath); Console.WriteLine("加密成功!");
Console.ReadKey();
}
}
主程序代码
运行效果:


(完)
利用RSACryptoServiceProvider进行RSA加密解密的更多相关文章
- 利用openssl进行RSA加密解密
openssl是一个功能强大的工具包,它集成了众多密码算法及实用工具.我们即可以利用它提供的命令台工具生成密钥.证书来加密解密文件,也可以在利用其提供的API接口在代码中对传输信息进行加密. RSA是 ...
- 【转】C#中RSA加密解密和签名与验证的实现
[转]C#中RSA加密解密和签名与验证的实现 RSA加密算法是一种非对称加密算法.在公钥加密标准和电子商业中RSA被广泛使用.RSA是1977年由罗纳德•李维斯特(Ron Rivest).阿迪•萨莫尔 ...
- 兼容javascript和C#的RSA加密解密算法,对web提交的数据进行加密传输
Web应用中往往涉及到敏感的数据,由于HTTP协议以明文的形式与服务器进行交互,因此可以通过截获请求的数据包进行分析来盗取有用的信息.虽然https可以对传输的数据进行加密,但是必须要申请证书(一般都 ...
- C# Java间进行RSA加密解密交互
原文:C# Java间进行RSA加密解密交互 这里,讲一下RSA算法加解密在C#和Java之间交互的问题,这两天纠结了很久,也看了很多其他人写的文章,颇受裨益,但没能解决我的实际问题,终于,还是被我捣 ...
- C# Java间进行RSA加密解密交互(三)
原文:C# Java间进行RSA加密解密交互(三) 接着前面一篇C# Java间进行RSA加密解密交互(二)说吧,在上篇中为了实现 /** * RSA加密 * @param text--待加密的明文 ...
- RSA加密解密和读取公钥、私钥
/// <summary> /// RSA加密解密及RSA签名和验证 /// </summary> public class RSADE { ...
- C#的RSA加密解密签名,就为了支持PEM PKCS#8格式密钥对的导入导出
差点造了一整个轮子 .Net Framework 4.5 里面的RSA功能,并未提供简单对PEM密钥格式的支持(.Net Core有咩?),差点(还远着)造了一整个轮子,就为了支持PEM PKCS#8 ...
- RSA加密解密及RSA签名和验证及证书
RSA加密解密及RSA签名和验证及证书 公钥是给别人的 发送密文使用公钥加密 验证签名使用公钥验证 私钥是自己保留的 接受密文使用私钥解密 发送签名使用私钥签名 上述过程逆转是不行的,比如使用私钥加密 ...
- C# javascript 采用 RSA 加密解密
C# javascript 采用 RSA 加密解密 1.C#提供公钥 2.javascript用公钥加密 3.C#用私钥解密 4.javascript 类库 https://www.pidder.de ...
随机推荐
- 关于微信JS SDK接口wx.previewImage预览接口的使用
然后后之前的项目,突然往微信上迁移了,一些微信的接口没怎么用过,比较陌生,这次的功能是想调用微信的接口,实现图片放大的功能, 就找到官方文档:http://qydev.weixin.qq.com/wi ...
- Django--Session 操作
Session Session的由来 Cookie虽然在一定程度上解决了“保持状态”的需求,但是由于Cookie本身最大支持4096字节,以及Cookie本身保存在客户端,可能被拦截或窃取,因此就需要 ...
- 200. Orchard学习 目录
201. Orchard学习 一.基础 210. Orchard学习 二.启动 211. Orchard学习 二 1.Application_Start 212. Orchard学习 二 2.Manu ...
- 【机器学习】逻辑回归(Logistic Regression)
注:最近开始学习<人工智能>选修课,老师提纲挈领的介绍了一番,听完课只了解了个大概,剩下的细节只能自己继续摸索. 从本质上讲:机器学习就是一个模型对外界的刺激(训练样本)做出反应,趋利避害 ...
- 四、windows下TortoiseGit的使用与操作
使用 Git命令有时候确实不怎么方便,特别是每次都要输入密码,如果配置 SSH 的方式,又实在是很麻烦.(当然,必须使用 Windows 神器才有方便友好的客户端图形界面啦!!!) 关于 Tortoi ...
- elk + filebeat,6.3.2版本简单搭建,实现我们自己的集中式日志系统
前言 刚从事开发那段时间不习惯输出日志,认为那是无用功,徒增代码量,总认为自己的代码无懈可击:老大的叮嘱.强调也都视为耳旁风,最终导致的结果是我加班排查问题,花的时间还挺长的,要复现问题.排查问题等, ...
- FFmpeg内存IO模式(内存区作输入或输出)
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10318145.html 所谓内存IO,在FFmpeg中叫作"buffered ...
- functions文件详细分析和说明
bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html /etc/rc.d/init.d/functions几乎被/e ...
- 【Quartz】问题记录注意事项【四】
记录一:queartz 在同时启动多个任务是,触发器名称不能设置一致,不然第二次启动会不成功 记录二:quartz 在使用任务与触发器分离写法时,任务必须要带(.StoreDurably()) IJo ...
- CentOS7 config aliyun yum repository
https://www.cnblogs.com/lpbottle/p/7875400.html 1. 备份原来的yum源 mv /etc/yum.repos.d/CentOS-Base.repo /e ...