C#几种常用的加密方式
一、AES加密算法
AES算法基于排列和置换运算。排列是对数据重新进行安排,置换是将一个数据单元替换为另一个。AES 使用几种不同的方法来执行排列和置换运算。
AES是一个迭代的、对称密钥分组的密码,它可以使用128、192 和 256 位密钥,并且用 128 位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换和替换输入数据。 摘自:互动百科
几种模式的优缺点对比:

C#代码:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
namespace PwdDemo
{
public class AESHelper
{
/// <summary>
/// AES 加密
/// </summary>
/// <param name="str">明文(待加密)</param>
/// <param name="key">密文</param>
/// <returns></returns>
public string AesEncrypt(string str, string key)
{
if (string.IsNullOrEmpty(str)) return null;
Byte[] toEncryptArray = Encoding.UTF8.GetBytes(str);
RijndaelManaged rm = new RijndaelManaged
{
Key = Encoding.UTF8.GetBytes(key),
Mode = CipherMode.ECB,
Padding = PaddingMode.PKCS7
};
ICryptoTransform cTransform = rm.CreateEncryptor();
Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Convert.ToBase64String(resultArray);
}
/// <summary>
/// AES 解密
/// </summary>
/// <param name="str">明文(待解密)</param>
/// <param name="key">密文</param>
/// <returns></returns>
public string AesDecrypt(string str, string key)
{
if (string.IsNullOrEmpty(str)) return null;
Byte[] toEncryptArray = Convert.FromBase64String(str);
RijndaelManaged rm = new RijndaelManaged
{
Key = Encoding.UTF8.GetBytes(key),
Mode = CipherMode.ECB,
Padding = PaddingMode.PKCS7
};
ICryptoTransform cTransform = rm.CreateDecryptor();
Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Encoding.UTF8.GetString(resultArray);
}
}
}
二、DES加密算法
DES设计中使用了分组密码设计的两个原则:混淆(confusion)和扩散(diffusion),其目的是抗击敌手对密码系统的统计分析。混淆是使密文的统计特性与密钥的取值之间的关系尽可能复杂化,以使密钥和明文以及密文之间的依赖性对密码分析者来说是无法利用的。扩散的作用就是将每一位明文的影响尽可能迅速地作用到较多的输出密文位中,以便在大量的密文中消除明文的统计结构,并且使每一位密钥的影响尽可能迅速地扩展到较多的密文位中,以防对密钥进行逐段破译。
C#代码:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
namespace PwdDemo
{
public class DESHelper
{
//密钥
public static byte[] _KEY = new byte[] { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
//向量
public static byte[] _IV = new byte[] { 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01 };
/// <summary>
/// DES加密操作
/// </summary>
/// <param name="normalTxt"></param>
/// <returns></returns>
public string DesEncrypt(string normalTxt)
{
//byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(_KEY);
//byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(_IV);
DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
int i = cryptoProvider.KeySize;
MemoryStream ms = new MemoryStream();
CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateEncryptor(_KEY, _IV), CryptoStreamMode.Write);
StreamWriter sw = new StreamWriter(cst);
sw.Write(normalTxt);
sw.Flush();
cst.FlushFinalBlock();
sw.Flush();
string strRet = Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length);
return strRet;
}
/// <summary>
/// DES解密操作
/// </summary>
/// <param name="securityTxt">加密字符串</param>
/// <returns></returns>
public string DesDecrypt(string securityTxt)//解密
{
//byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(_KEY);
//byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(_IV);
byte[] byEnc;
try
{
securityTxt.Replace("_%_", "/");
securityTxt.Replace("-%-", "#");
byEnc = Convert.FromBase64String(securityTxt);
}
catch
{
return null;
}
DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
MemoryStream ms = new MemoryStream(byEnc);
CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateDecryptor(_KEY, _IV), CryptoStreamMode.Read);
StreamReader sr = new StreamReader(cst);
return sr.ReadToEnd();
}
}
}
三、RSA加密算法
RSA是第一个能同时用于加密和数字签名的算法,也易于理解和操作。RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。
C#代码:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
namespace PwdDemo
{
public class RSAHelper
{
private const int RsaKeySize = 2048;
private const string publicKeyFileName = "RSA.Pub";
private const string privateKeyFileName = "RSA.Private";
/// <summary>
///在给定路径中生成XML格式的私钥和公钥。
/// </summary>
public void GenerateKeys(string path)
{
using (var rsa = new RSACryptoServiceProvider(RsaKeySize))
{
try
{
// 获取私钥和公钥。
var publicKey = rsa.ToXmlString(false);
var privateKey = rsa.ToXmlString(true);
// 保存到磁盘
File.WriteAllText(Path.Combine(path, publicKeyFileName), publicKey);
File.WriteAllText(Path.Combine(path, privateKeyFileName), privateKey);
//Console.WriteLine(string.Format("生成的RSA密钥的路径: {0}\\ [{1}, {2}]", path, publicKeyFileName, privateKeyFileName));
}
finally
{
rsa.PersistKeyInCsp = false;
}
}
}
/// <summary>
/// 用给定路径的RSA公钥文件加密纯文本。
/// </summary>
/// <param name="plainText">要加密的文本</param>
/// <param name="pathToPublicKey">用于加密的公钥路径.</param>
/// <returns>表示加密数据的64位编码字符串.</returns>
public string Encrypt(string plainText, string pathToPublicKey)
{
using (var rsa = new RSACryptoServiceProvider(RsaKeySize))
{
try
{
//加载公钥
var publicXmlKey = File.ReadAllText(pathToPublicKey);
rsa.FromXmlString(publicXmlKey);
var bytesToEncrypt = System.Text.Encoding.Unicode.GetBytes(plainText);
var bytesEncrypted = rsa.Encrypt(bytesToEncrypt, false);
return Convert.ToBase64String(bytesEncrypted);
}
finally
{
rsa.PersistKeyInCsp = false;
}
}
}
/// <summary>
/// Decrypts encrypted text given a RSA private key file path.给定路径的RSA私钥文件解密 加密文本
/// </summary>
/// <param name="encryptedText">加密的密文</param>
/// <param name="pathToPrivateKey">用于加密的私钥路径.</param>
/// <returns>未加密数据的字符串</returns>
public string Decrypt(string encryptedText, string pathToPrivateKey)
{
using (var rsa = new RSACryptoServiceProvider(RsaKeySize))
{
try
{
var privateXmlKey = File.ReadAllText(pathToPrivateKey);
rsa.FromXmlString(privateXmlKey);
var bytesEncrypted = Convert.FromBase64String(encryptedText);
var bytesPlainText = rsa.Decrypt(bytesEncrypted, false);
return System.Text.Encoding.Unicode.GetString(bytesPlainText);
}
finally
{
rsa.PersistKeyInCsp = false;
}
}
}
}
}
四、SHA加密算法
SHA,全称SecureHashAlgorithm,是一种数据加密算法,该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。
C#代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
namespace PwdDemo
{
public class SHAHelper
{
public string SHAmd5Encrypt(string normalTxt)
{
var bytes = Encoding.Default.GetBytes(normalTxt);//求Byte[]数组
var Md5 = new MD5CryptoServiceProvider();
var encryptbytes = Md5.ComputeHash(bytes);//求哈希值
return Base64To16(encryptbytes);//将Byte[]数组转为净荷明文(其实就是字符串)
}
public string SHA1Encrypt(string normalTxt)
{
var bytes = Encoding.Default.GetBytes(normalTxt);
var SHA = new SHA1CryptoServiceProvider();
var encryptbytes = SHA.ComputeHash(bytes);
return Base64To16(encryptbytes);
}
public string SHA256Encrypt(string normalTxt)
{
var bytes = Encoding.Default.GetBytes(normalTxt);
var SHA256 = new SHA256CryptoServiceProvider();
var encryptbytes = SHA256.ComputeHash(bytes);
return Base64To16(encryptbytes);
}
public string SHA384Encrypt(string normalTxt)
{
var bytes = Encoding.Default.GetBytes(normalTxt);
var SHA384 = new SHA384CryptoServiceProvider();
var encryptbytes = SHA384.ComputeHash(bytes);
return Base64To16(encryptbytes);
}
public string SHA512Encrypt(string normalTxt)
{
var bytes = Encoding.Default.GetBytes(normalTxt);
var SHA512 = new SHA512CryptoServiceProvider();
var encryptbytes = SHA512.ComputeHash(bytes);
return Base64To16(encryptbytes);
}
private string Base64To16(byte[] buffer)
{
string md_str = string.Empty;
for (int i = 0; i < buffer.Length; i++)
{
md_str += buffer[i].ToString("x2");
}
return md_str;
}
}
}
以上内容大部分摘自网络
C#几种常用的加密方式的更多相关文章
- java正则表达式四种常用的处理方式是怎么样呢《匹配、分割、代替、获取》
java 正则表达式高级篇,介绍四种常用的处理方式:匹配.分割.替代.获取,具体内容如下package test; import java.util.regex.Matcher; import jav ...
- java中常用的加密方式
加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容.大体上分为双向加密和单向加密,而双向加密又分为对称加密和非对称加密(有些 ...
- Java中常用的加密方式(附多个工具类)
一.Java常用加密方式 Base64加密算法(编码方式) MD5加密(消息摘要算法,验证信息完整性) 对称加密算法 非对称加密算法 数字签名算法 数字证书 二.分类按加密算法是否需要key被分为两类 ...
- iOS常用的加密方式--备用
MD5 iOS代码加密 创建MD5类,代码如下 #import <Foundation/Foundation.h> @interface CJMD5 : NSObject +(NSStri ...
- iOS常用的加密方式
MD5 iOS代码加密 创建MD5类,代码如下 #import <Foundation/Foundation.h> @interface CJMD5 : NSObject +(NSStri ...
- 两种常用文件分享方式 - 网络硬盘快速分享, 点对点的文件共享 BitTorrent Sync
普通的用户经常通过电子邮件.QQ传递等方式进行文件的分享,但是由于不同的网络环境有的时候可能会有不同的限制,所以我们就需要寻找其他的方式来替代.今天就为大家推荐两个既常用又与众不同的分享方式. 中国论 ...
- js中几种常用的输出方式
1.alert("要输出的内容"); ->在浏览器中弹出一个对话框,然后把要输出的内容展示出来 ->alert都是把要输出的内容首先转换为字符串然后在输出的 2.doc ...
- DotNet中几种常用的加密算法
在.NET项目中,我们较多的使用到加密这个操作.因为在现代的项目中,对信息安全的要求越来越高,那么多信息的加密就变得至关重要.现在提供几种常用的加密/解密算法. 1.用于文本和Base64编码文本的互 ...
- iOS代码加密常用加密方式
iOS代码加密常用加密方式 iOS代码加密常用加密方式,常见的iOS代码加密常用加密方式算法包括MD5加密.AES加密.BASE64加密,三大算法iOS代码加密是如何进行加密的,且看下文 MD5 iO ...
随机推荐
- GitHub 出现这样的问题怎么办
一开始以为是被墙,憋个半死. 后来自己好了(大概过了一上午),虚惊一场.
- 编写高质量代码改善C#程序的157个建议——建议65:总是处理未捕获的异常
建议65:总是处理未捕获的异常 处理为捕获的异常是每个应用程序具备的基本功能,C#在APPDomain提供了UnhandledException事件来接收未捕获到的异常的通知.常见的应用如下: sta ...
- 一篇文章让你快速入门 学懂Shell脚本
Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合. Shell可以直接使用在win/Unix/Linux上面 ...
- 哇,两门学考都是A(〃'▽'〃)
看来只要拼命去搞,两个月也是可以搞出来的啊~
- VS 和Visual Assist X快捷键(转)
Visual Assist X 最有用的快捷键 1.Alt + G: 在定义与声明之间互跳. 2.Alt + O: 在.h与.cpp之间互跳.(O是字母O,不是数字零) 3.Alt + Shift + ...
- Android-动态添加控件到ScrollView
在实际开发过程中,会需要动态添加控件到ScrollView,就需要在Java代码中,找到ScrollView的孩子(ViewGroup),进行添加即可. Layout: <?xml versio ...
- redis----内部数据结构学习
整数集合 1.应用 用于有序.无重复的保存多个整数值 自动选择该用什么长度的整数类型保存数据
- [LeetCode 题解]: Generate Parentheses
Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes ...
- 面试题:给定一个函数rand()能产生1到m之间的等概率随机数,产生1到n之间等概率的随机数?
虽然TX的面试已经过去好几天了,然而惨痛的过程还历历在目.人生中第一次正式job面试就这么挂掉了.在于面试官的交流过程中,被问及了几个算法设计题,在今后几篇博文中,我一一总结与诸君分享. 1. 给定一 ...
- STM32 IAP+Ymodem功能实现(参考官方代码)
IAP:在线升级代码 ,通俗的讲就是通过USART,IIC,或者SPI,USB等等,方式,在程序中升级程序,一般用在远程升级,或者是在PCB板子都安装到模具之后还需要升级代码,这样我们就需要,通过IA ...