原文:RSACryptoServiceProvider加密解密签名验签和DESCryptoServiceProvider加解密

C#在using System.Security.Cryptography下有 DESCryptoServiceProvider RSACryptoServiceProvider 
DESCryptoServiceProvider 是用于对称加密 RSACryptoServiceProvider是用于非对称加密 
对称加密的意思:有一个密钥 相当于加密算法,加密用它来加密,解密也需要用到它。因为加密解密都是用同一个密钥所以叫对称加密。 对称加密有一个坏处只要拥有密钥的人都可以解密。 
非对称加密:就是有2个密钥,一个是公钥,一个是私钥,私钥是自己的,不能随便给人,公钥随便给,无所谓。一般是别人用你的公钥加密,然后把密文给你,你用你的私钥解密,这样一样加密和解密不是同一个密钥,所以叫非对称。 非对称的好处是假如没有私钥别人是无法解密的,就算加密的那个人他把数据加密了他也无法解密,加密者把密文和公钥随便给那个人都无法解密。 
数字签名:数字签名的意义就是这些数据与原文数据比对是否修改过,这个解释有点麻烦,当初我也搞了好久才理解!一般是用自己的私钥对数据进行签名,然后用公钥去验证这个数据是否修改过 
-
现在该说说DESCryptoServiceProvider 和RSACryptoServiceProvider 在C#中的具体怎么用: 
-
1、用RSACryptoServiceProvider 加密解密

//加密解密用到的公钥与私钥
RSACryptoServiceProvider oRSA = new RSACryptoServiceProvider();
string privatekey=oRSA.ToXmlString(true);//私钥
string publickey=oRSA.ToXmlString(false);//公钥
//这两个密钥需要保存下来
byte[] messagebytes = Encoding.UTF8.GetBytes("luo罗"); //需要加密的数据
-
//公钥加密
RSACryptoServiceProvider oRSA1 = new RSACryptoServiceProvider();
oRSA1.FromXmlString(publickey); //加密要用到公钥所以导入公钥
byte[] AOutput = oRSA1.Encrypt(messagebytes ,false); //AOutput 加密以后的数据
-
//私钥解密
RSACryptoServiceProvider oRSA2 = new RSACryptoServiceProvider();
oRSA2.FromXmlString(privatekey);
byte[] AInput = oRSA2.Decrypt(AOutput, false);
string reslut=Encoding.ASCII.GetString(AInput)

2、用RSACryptoServiceProvider签名验签

byte[] messagebytes = Encoding.UTF8.GetBytes("luo罗");
RSACryptoServiceProvider oRSA = new RSACryptoServiceProvider();
string privatekey = oRSA.ToXmlString(true);
string publickey = oRSA.ToXmlString(false); //私钥签名
RSACryptoServiceProvider oRSA3 = new RSACryptoServiceProvider();
oRSA3.FromXmlString(privatekey);
byte[] AOutput = oRSA3.SignData(messagebytes, "SHA1");
//公钥验证
RSACryptoServiceProvider oRSA4 = new RSACryptoServiceProvider();
oRSA4.FromXmlString(publickey);
bool bVerify = oRSA4.VerifyData(messagebytes, "SHA1", AOutput);

3、用证书进行签名

   // 因为一般证书的私钥是不可以导出的所以所以用第2种方法导入私钥的来进行签名行不通
byte[] messagebytes = Encoding.UTF8.GetBytes("luo罗");
string Path = @"D:\Certificate\1.P12";
X509Certificate2 x509 = new X509Certificate2(Path, "");
SHA1 sha1 = new SHA1CryptoServiceProvider();
byte[] hashbytes = sha1.ComputeHash(messagebytes); //对要签名的数据进行哈希
RSAPKCS1SignatureFormatter signe = new RSAPKCS1SignatureFormatter();
signe.SetKey(x509.PrivateKey); //设置签名用到的私钥
signe.SetHashAlgorithm("SHA1"); //设置签名算法
byte[] reslut = signe.CreateSignature(hashbytes);
//验签:与第2方法相同
RSACryptoServiceProvider oRSA4 = new RSACryptoServiceProvider();
oRSA4.FromXmlString(x509.PublicKey.Key.ToXmlString(false));
bool bVerify = oRSA4.VerifyData(messagebytes, "SHA1", reslut);

4、用证书加密解密

 string Path = @"D:\Certificate\1.P12";
X509Certificate2 x509 = new X509Certificate2(Path, "");
byte[] data = System.Text.Encoding.UTF8.GetBytes("cheshi罗");
-
//证书公钥加密
RSACryptoServiceProvider oRSA1 = new RSACryptoServiceProvider(); oRSA1.FromXmlString(x509.PublicKey.Key.ToXmlString(false));
-
byte[] AOutput = oRSA1.Encrypt(data, false);
-
//证书私钥解密
RSACryptoServiceProvider rsa2 = (RSACryptoServiceProvider)x509.PrivateKey;
byte[] plainbytes = rsa2.Decrypt(AOutput, false);
string reslut = Encoding.UTF8.GetString(plainbytes);

5用证书对文件加密解密,因为文件可能特别大 所以需要用流和buffer的方式来,鄙视把文件全部读到byte[]里进行加密的人,假如文件5G,那全部读到byte[]里崩溃掉

private void Form1_Load(object sender, EventArgs e)
{
x509=new X509Certificate2(Path, "");
RSACryptoServiceProvider oRSA1 = new RSACryptoServiceProvider();
Encrypt();
Decrypt();
}
private void Decrypt()
{
string FilePath = "2.txt";
string OutFile = "3.txt";
System.IO.FileStream picfs = new System.IO.FileStream(FilePath, System.IO.FileMode.Open);
System.IO.FileStream fs = new System.IO.FileStream(OutFile, System.IO.FileMode.OpenOrCreate);
oRSA1 = (RSACryptoServiceProvider)x509.PrivateKey;
int blocksize = oRSA1.KeySize/;
-
byte[] buffer, buffer1, encryblock;
bool Closed = true;
while (Closed)
{
buffer = null;
buffer = new byte[blocksize];
int k = picfs.Read(buffer, , buffer.Length);
if (k > )
{
if (blocksize == k)
{
encryblock = oRSA1.Decrypt(buffer, false);
fs.Write(encryblock, , encryblock.Length);
}
else
{
buffer1 = new byte[k];
for (int i = ; i < k; i++)
{
buffer1[i] = buffer[i];
}
encryblock = oRSA1.Decrypt(buffer1, false);
fs.Write(encryblock, , encryblock.Length);
}
}
else
{
picfs.Close();
fs.Close();
Closed = false;
}
}
-
}
private void Encrypt()
{
string FilePath = "1.txt";
string OutFile = "2.txt";
//证书公钥加密
-
oRSA1.FromXmlString(x509.PublicKey.Key.ToXmlString(false));
System.IO.FileStream picfs = new System.IO.FileStream(FilePath, System.IO.FileMode.Open);
System.IO.FileStream fs = new System.IO.FileStream(OutFile, System.IO.FileMode.OpenOrCreate);
int blocksize = ;
if (oRSA1.KeySize == )
{
blocksize = ;
}
else
{
blocksize = ;
}
byte[] buffer, buffer1, encryblock;
bool Closed = true;
while (Closed)
{
buffer = null;
buffer = new byte[blocksize];
int k = picfs.Read(buffer, , buffer.Length);
if (k > )
{
if (blocksize == k)
{
encryblock = oRSA1.Encrypt(buffer, false);
fs.Write(encryblock, , encryblock.Length);
}
else
{
buffer1 = new byte[k];
for (int i = ; i < k; i++)
{
buffer1[i] = buffer[i];
}
encryblock = oRSA1.Encrypt(buffer1, false);
fs.Write(encryblock, , encryblock.Length);
}
}
else
{
picfs.Close();
fs.Close();
Closed = false;
}
}
}

6用证书对文件进行签名验签,因为文件可能特别大 所以需要用流和buffer的方式来

private void Form1_Load(object sender, EventArgs e)
{
x509 = new X509Certificate2(Path, "");
SignFile("1.txt", "11.txt"); VerifyFile("1.txt", "11.txt");
}
private bool VerifyFile(string FileName, string SignedFileName)
{ bool reslut = true; System.IO.StreamReader objread = new System.IO.StreamReader(FileName);
System.IO.StreamReader objreadSigned = new System.IO.StreamReader(SignedFileName); RSACryptoServiceProvider VeryRsa = new RSACryptoServiceProvider();
VeryRsa.FromXmlString(x509.PublicKey.Key.ToXmlString(false)); int Inblocksize = ;
int Signedblocksize = ;
if (VeryRsa.KeySize == )
{
Inblocksize = ;
}
else
{
Inblocksize = ;
}
Signedblocksize = VeryRsa.KeySize / ; bool Closed = true;
byte[] Buffer; //原文缓存区
byte[] InBuffer;//原文缓存区
byte[] Buffer1;//签名文件缓存区
while (Closed)
{
Buffer = null;
Buffer = new byte[Inblocksize];
int k = objread.BaseStream.Read(Buffer, , Buffer.Length);
if (k > )
{
if (Inblocksize == k) //读出来的长度和缓存区一样大
{
Buffer1 = new byte[Signedblocksize];
objreadSigned.BaseStream.Read(Buffer1, , Buffer1.Length);
reslut = VeryRsa.VerifyData(Buffer,"SHA1",Buffer1);
if (!reslut)
{
Closed = false;
}
}
else
{ //意思是Buffer没满,只有k个字节,k字节后面全是空所以不需要验签
InBuffer = new byte[k];
for (int i = ; i < k; i++)
{
InBuffer[i] = Buffer[i];
}
Buffer1 = new byte[Signedblocksize];
objreadSigned.BaseStream.Read(Buffer1, , Buffer1.Length);
reslut = VeryRsa.VerifyData(InBuffer, "SHA1", Buffer1);
if (!reslut)
{
Closed = false;
}
}
}
else
{
//这里的意思是原文已经读完毕了,并且已经和签名文件对应验签成功,那么
//签名文件也必须读完毕了。
if (objreadSigned.BaseStream.Position!= objreadSigned.BaseStream.Length)
{
reslut = false;
}
objreadSigned.Close();
objread.Close();
Closed = false;
}
}
return reslut; }
private void SignFile(string InFileName,string OutFileName)
{
RSACryptoServiceProvider SignRsa = (RSACryptoServiceProvider)x509.PrivateKey; System.IO.StreamReader objread = new System.IO.StreamReader(InFileName);
System.IO.StreamWriter objwrite = new System.IO.StreamWriter(OutFileName, false); int blocksize = ;
if (SignRsa.KeySize == )
{
blocksize = ;
}
else
{
blocksize = ;
} bool Closed = true;
byte[] Buffer = new byte[blocksize];
byte[] buffer1, SignBytes;
while (Closed)
{
int k = objread.BaseStream.Read(Buffer, , Buffer.Length);
if (k > )
{
if (k == blocksize)
{
SignBytes = SignRsa.SignData(Buffer, "SHA1");
objwrite.BaseStream.Write(SignBytes, , SignBytes.Length);
}
else
{
buffer1 = new byte[k];
for (int i = ; i < k; i++)
{
buffer1[i] = Buffer[i];
}
SignBytes = SignRsa.SignData(buffer1, "SHA1");
objwrite.BaseStream.Write(SignBytes, , SignBytes.Length);
}
}
else
{
Closed = false;
objread.Close();
objwrite.Close();
}
} }

7、用DESCryptoServiceProvider 进行对称加密

byte[] messagebytes = Encoding.UTF8.GetBytes("LUO罗");
//需要用的对称密钥
DESCryptoServiceProvider Des = new DESCryptoServiceProvider();
byte[] key = Des.Key;
//加密
DESCryptoServiceProvider tdesProvider = new DESCryptoServiceProvider();
tdesProvider.Key = key;
tdesProvider.Mode = CipherMode.ECB;
byte[] encrypted = tdesProvider.CreateEncryptor().TransformFinalBlock(messagebytes, , messagebytes.Length);
//解密
DESCryptoServiceProvider tdesProvider2 = new DESCryptoServiceProvider();
tdesProvider.Key = key1;
tdesProvider.Mode = CipherMode.ECB;
byte[] outputdata = tdesProvider.CreateDecryptor().TransformFinalBlock(encrypted, , encrypted.Length);
string reslut = Encoding.UTF8.GetString(outputdata);
//7用DESCryptoServiceProvider 加解密 流
CryptoStream csDecrypt = new CryptoStream(Stream, Des.CreateEncryptor(), CryptoStreamMode.Write);
CryptoStream csDecrypt = new CryptoStream(Stream, Des.CreateDecryptor(), CryptoStreamMode.Write);

RSACryptoServiceProvider加密解密签名验签和DESCryptoServiceProvider加解密的更多相关文章

  1. C# RSA加解密与验签,AES加解密,以及与JAVA平台的密文加解密

    前言: RSA算法是利用公钥与密钥对数据进行加密验证的一种算法.一般是拿私钥对数据进行签名,公钥发给友商,将数据及签名一同发给友商,友商利用公钥对签名进行验证.也可以使用公钥对数据加密,然后用私钥对数 ...

  2. C# RSACryptoServiceProvider加密解密签名验签和DESCryptoServic

    C#在using System.Security.Cryptography下有 DESCryptoServiceProvider RSACryptoServiceProvider DESCryptoS ...

  3. js rsa sign使用笔记(加密,解密,签名,验签)

    你将会收获: js如何加密, 解密 js如何签名, 验签 js和Java交互如何相互解密, 验签(重点) 通过谷歌, 发现jsrsasign库使用者较多. 查看api发现这个库功能很健全. 本文使用方 ...

  4. Java RSA 加密 解密 签名 验签

    原文:http://gaofulai1988.iteye.com/blog/2262802 import java.io.FileInputStream; import java.io.FileOut ...

  5. [Python3] RSA的加解密和签名/验签实现 -- 使用pycrytodome

    Crypto 包介绍: pycrypto,pycrytodome 和 crypto 是一个东西,crypto 在 python 上面的名字是 pycrypto 它是一个第三方库,但是已经停止更新,所以 ...

  6. RSA密钥生成、加密解密、签名验签

    RSA 非对称加密公钥加密,私钥解密 私钥签名,公钥验签 下面是生成随机密钥对: //随机生成密钥对 KeyPairGenerator keyPairGen = null; try { keyPair ...

  7. 支付接口中常用的加密解密以及验签rsa,md5,sha

    一.常用加密类型分类 1.对称加密:采用单钥对信息进行加密和解密,即同一个秘钥既可以对信息进行加密,也可以进行解密.此类型称之为对称加密.特点速度快,常用于对大量数据信息或文件加密时使用.常用例子:D ...

  8. 利用SHA-1算法和RSA秘钥进行签名验签(带注释)

    背景介绍 1.SHA 安全散列算法SHA (Secure Hash Algorithm)是美国国家标准和技术局发布的国家标准FIPS PUB 180-1,一般称为SHA-1.其对长度不超过264二进制 ...

  9. 数据安全管理:RSA加密算法,签名验签流程详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.RSA算法简介 1.加密解密 RSA加密是一种非对称加密,在公开密钥加密和电子商业中RSA被广泛使用.可以在不直接传递密钥的情况下,完成加 ...

随机推荐

  1. oracle11g 在azure云中使用rman进行实例迁移

    1,開始备份 备份脚本rman_full_backup.sh内容例如以下: #!/bin/sh export DATE=`date +%F` export BACK_DIR='/backupdisk/ ...

  2. .net core 微服务之Api网关(Api Gateway)

    原文:.net core 微服务之Api网关(Api Gateway) 微服务网关目录 1. 微服务引子 2.使用Nginx作为api网关 3.自创api网关(重复轮子) 3.1.构建初始化 3.2. ...

  3. Framework for Graphics Animation and Compositing Operations

    FIELD OF THE DISCLOSURE The subject matter of the present disclosure relates to a framework for hand ...

  4. kettle的job中运行每行

     job中运行每行 有时,我们须要job或转换执行多次.且每次传入的參数都不同.假如你正在做数据迁移的工作,须要导入每天的旧数据,则须要一个job依据指定的日期导入数据,该日期被指定作为參数.假设 ...

  5. Oracle数据库的基本概念(转)

    一.数据库 我们在安装Oracle数据库时,全局数据库名:就是一个数据库的标识,在安装时就要想好,以后一般不修改,修改起来也麻烦,因为数据库一旦安装,数据库名就写进了控制文件,数据库表,很多地方都会用 ...

  6. 如何在CSDN博客自定义栏目中添加“给我写信”

    在"自定义栏目"中添加"连接"(将自己的微博,QQ空间和CSDN博客关联起来)很多人都做过.但是添加"给我写信"这个功能,用的好像不太多.此 ...

  7. Live Unit Testing

    Live Unit Testing 相对于传统的Unit Test,VS2017 带来了一个新的功能,叫Live Unit Testing,从字面意思理解就是实时单元测试,在实际的使用中,这个功能就是 ...

  8. java读取Properties文件及赋值

    懒得整理了,直接复制我工程里的代码: 第一个读取文件的类可以直接复制, 不复制的话,在下面取值和赋值部分的代码new EmailProperRead(systemType).properties根据自 ...

  9. Qt5信号与槽C++11风格连接简介

    最近在论坛上看到了这个方面的问题,详见这里. 随后浅浅地学习了一下子,看到了Qt官方论坛上给出的说明,觉得C++11的functional连接方法还是比Qt4既有的宏连接方法有很大不同. 官方论坛的文 ...

  10. 字符串、对象、数组操作方法、json方法

    1.字符串操作方法                 1.charAt               *     作用              *         通过索引找字符             ...