利用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, 0, data.Length);
                return result;
            }
            else // 解密
            {
                desP.Key = key;
                desP.IV = keyIV;
                ICryptoTransform desencrypt = desP.CreateDecryptor(key, keyIV);
                byte[] result = desencrypt.TransformFinalBlock(data, 0, 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();
        }
    }

主程序代码

运行效果:

(完)

时间: 2024-10-26 05:48:03

利用RSACryptoServiceProvider进行RSA加密解密的相关文章

利用openssl进行RSA加密解密

openssl是一个功能强大的工具包,它集成了众多密码算法及实用工具.我们即可以利用它提供的命令台工具生成密钥.证书来加密解密文件,也可以在利用其提供的API接口在代码中对传输信息进行加密. RSA是一个非对称加密算法.简单说来,非对称加密算法就是说加密解密一个文件需要有两个密钥,一个用来加密,为公钥,一个用来解密,为私钥.证书可以用来授权公钥的使用. 今天小研究了下openssl的rsa加密,其中主要涉及利用公钥和密钥加解密文件,没有涉及对证书的操作.想要集体了解的可以去: http://ww

C#中RSA加密解密和签名与验证的实现

RSA加密算法是一种非对称加密算法.在公钥加密标准和电子商业中RSA被广泛使用.RSA是1977年由罗纳德•李维斯特(Ron Rivest).阿迪•萨莫尔(Adi Shamir)和伦纳德•阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院工作.RSA就是他们三人姓氏开头字母拼在一起组成的..Net的推出,我们能够利用.Net Framework中的类提供的加密服务来保证数据安全.目前应用较为广泛的加密方法是使用RSA算法进行加密.在.Net Framework中与R

C#自定义RSA加密解密及RSA签名和验证类实例

本文实例讲述了C#自定义RSA加密解密及RSA签名和验证类.分享给大家供大家参考.具体分析如下: 这个C#类自定义RSA加密解密及RSA签名和验证,包含了RSA加密.解密及签名所需的相关函数,带有详细的注释说明. using System; using System.Text; using System.Security.Cryptography; namespace DotNet.Utilities { /// <summary> /// RSA加密解密及RSA签名和验证 /// </

RSA加密解密及RSA签名和验证

原文:RSA加密解密及RSA签名和验证 1.RSA加密解密: (1)获取密钥,这里是产生密钥,实际应用中可以从各种存储介质上读取密钥 (2)加密 (3)解密2.RSA签名和验证 (1)获取密钥,这里是产生密钥,实际应用中可以从各种存储介质上读取密钥 (2)获取待签名的Hash码 (3)获取签名的字符串 (4)验证 3.公钥与私钥的理解: (1)私钥用来进行解密和签名,是给自己用的. (2)公钥由本人公开,用于加密和验证签名,是给别人用的.   (3)当该用户发送文件时,用私钥签名,别人用他给的公

RSA加密解密及RSA签名和验证及证书

公钥是给别人的 发送密文使用公钥加密 验证签名使用公钥验证 私钥是自己保留的 接受密文使用私钥解密 发送签名使用私钥签名 上述过程逆转是不行的,比如使用私钥加密,使用公钥解密是不行的 证书的制作参考自使用X.509数字证书加密解密实务(一)-- 证书的获得和管理 打开VS开发命令,输入下面的命令: makecert -sr CurrentUser -ss My -n CN=MyTestCert -sky exchange -pe 从证书中读取私钥和公钥: /// <summary> /// 根

RSA加密解密和读取公钥、私钥

/// <summary>     /// RSA加密解密及RSA签名和验证    /// </summary>     public class RSADE    {                 public RSADE()         {                     } #region RSA 加密解密 #region RSA 的密钥产生             /// <summary>        /// RSA 的密钥产生 产生私钥 和公

JAVA实现RSA加密解密 非对称算法

首先RSA是一个非对称的加密算法,所以在使用该算法加密解密之前,必须先行生成密钥对,包括公钥和私钥 JDK中提供了生成密钥对的类KeyPairGenerator,实例如下: public static Map<String, Object> genKeyPair() throws Exception { // 获取公钥私钥密钥对的生成器 KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); // 初始化确定密

RSA加密解密与签名验证

关于RSACryption帮助类定义见RSACryption 一.加密与解密 //定义明文和密文变量 string plaintext = "天道酬勤,厚德载物!"; string ciphertext = ""; //产生密钥 string prikey = "", pubkey = ""; rsa.RSAKey(out prikey, out pubkey); //加密解密过程 ciphertext = rsa.RSAEn

C# Java间进行RSA加密解密交互

引用:http://blog.csdn.net/dslinmy/article/details/37362661 这里,讲一下RSA算法加解密在C#和Java之间交互的问题,这两天纠结了很久,也看了很多其他人写的文章,颇受裨益,但没能解决我的实际问题,终于,还是被我捣鼓出来了. 首先,介绍一下写这代码的目的:完成webService验证问题,服务器端采用C#开发,客户端采用Java开发.服务器端给客户端提供公钥,已进行数据加密,客户端加密后提数据提交给服务器,服务器用私钥对数据解密,进行验证.