C#常用加密解密方法(RAS加密解密)
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
在日常开发过程中总会遇到需要加密解密的需求这里我整理了C#常用的加密解密方法分享给大家。
先看看加密的基本概念
"加密"是一种限制对网络上传输数据的访问权的技术。原始数据也称为明文plaintext)被加密设备(硬件或软件)和密钥加密而产生的经过编码的数据称为密文ciphertext。将密文还原为原始明文的过程称为解密它是加密的反向处理但解密者必须利用相同类型的加密设备和密钥对密文进行解密。
加密的基本功能包括:
1. 防止不速之客查看机密的数据文件
2. 防止机密数据被泄露或篡改
3. 防止特权用户(如系统管理员)查看私人数据文件
4. 使入侵者不能轻易地查找一个系统的文件。
一、本节摘要
本节主要分享RAS加密解密
RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在美国麻省理工学院开发的。RSA取名来自开发他们三者的名字。RSA是目前最有影响力的公钥加密算法它能够抵抗到目前为止已知的所有密码攻击已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实将两个大素数相乘十分容易但那时想要对其乘积进行因式分解却极其困难因此可以将乘积公开作为加密密钥。RSA算法是第一个能同时用于加密和数字签名的算法也易于理解和操作。
RSA是被研究得最广泛的公钥算法从提出到现在已近二十年经历了各种攻击的考验逐渐为人们接受普遍认为是目前最优秀的公钥方案之一。RSA的安全性依赖于大数的因子分解但并没有从理论上证明破译RSA的难度与大数分解难度等价。即RSA的重大缺陷是无法从理论上把握它的保密性能如何而且密码学界多数人士倾向于因子分解不是NPC问题。
RSA的缺点主要有
A)产生密钥很麻烦受到素数产生技术的限制因而难以做到一次一密。
B)分组长度太大为保证安全性n 至少也要 600bits以上使运算代价很高尤其是速度较慢较对称密码算法慢几个数量级且随着大数分解技术的发展这个长度还在增加不利于数据格式的标准化。目前SET(Secure Electronic Transaction)协议中要求CA采用2048bits长的密钥其他实体使用1024比特的密钥。
C)RSA密钥长度随着保密级别提高增加很快。下表列出了对同一安全级别所对应的密钥长度。
二、源码分享
using System;
using System.Text;
using System.Security.Cryptography;
namespace Common
{
/// <summary>
/// RSA加密解密及RSA签名和验证
/// </summary>
public class RSACryption
{
public RSACryption()
{
}
#region RSA 的密钥产生
/// <summary>
/// RSA 的密钥产生 产生私钥 和公钥
/// </summary>
/// <param name="xmlKeys"></param>
/// <param name="xmlPublicKey"></param>
public void RSAKey(out string xmlKeys,out string xmlPublicKey)
{
System.Security.Cryptography.RSACryptoServiceProvider rsa=new RSACryptoServiceProvider();
xmlKeys=rsa.ToXmlString(true);
xmlPublicKey = rsa.ToXmlString(false);
}
#endregion
#region RSA的加密函数
//##############################################################################
//RSA 方式加密
//说明KEY必须是XML的行式,返回的是字符串
//在有一点需要说明该加密方式有 长度 限制的
//##############################################################################
//RSA的加密函数 string
public string RSAEncrypt(string xmlPublicKey,string m_strEncryptString )
{
byte[] PlainTextBArray;
byte[] CypherTextBArray;
string Result;
RSACryptoServiceProvider rsa=new RSACryptoServiceProvider();
rsa.FromXmlString(xmlPublicKey);
PlainTextBArray = (new UnicodeEncoding()).GetBytes(m_strEncryptString);
CypherTextBArray = rsa.Encrypt(PlainTextBArray, false);
Result=Convert.ToBase64String(CypherTextBArray);
return Result;
}
//RSA的加密函数 byte[]
public string RSAEncrypt(string xmlPublicKey,byte[] EncryptString )
{
byte[] CypherTextBArray;
string Result;
RSACryptoServiceProvider rsa=new RSACryptoServiceProvider();
rsa.FromXmlString(xmlPublicKey);
CypherTextBArray = rsa.Encrypt(EncryptString, false);
Result=Convert.ToBase64String(CypherTextBArray);
return Result;
}
#endregion
#region RSA的解密函数
//RSA的解密函数 string
public string RSADecrypt(string xmlPrivateKey, string m_strDecryptString )
{
byte[] PlainTextBArray;
byte[] DypherTextBArray;
string Result;
System.Security.Cryptography.RSACryptoServiceProvider rsa=new RSACryptoServiceProvider();
rsa.FromXmlString(xmlPrivateKey);
PlainTextBArray =Convert.FromBase64String(m_strDecryptString);
DypherTextBArray=rsa.Decrypt(PlainTextBArray, false);
Result=(new UnicodeEncoding()).GetString(DypherTextBArray);
return Result;
}
//RSA的解密函数 byte
public string RSADecrypt(string xmlPrivateKey, byte[] DecryptString )
{
byte[] DypherTextBArray;
string Result;
System.Security.Cryptography.RSACryptoServiceProvider rsa=new RSACryptoServiceProvider();
rsa.FromXmlString(xmlPrivateKey);
DypherTextBArray=rsa.Decrypt(DecryptString, false);
Result=(new UnicodeEncoding()).GetString(DypherTextBArray);
return Result;
}
#endregion
}
}