C# 加密术
本文是利用一个简单的小例子,简述C#中和加密术有关的内容,仅供学习参考用。
概述
随着信息技术的发展,计算机网络为信息的获取、传输、处理、利用与共享提供了一个高效、快捷、安全的通信环境和传输通道,网络信息安全也变得越来越重要。信息安全主要包括两个方面的内容:信息存储安全和信息传输安全。保证网络中信息安全的主要技术是数据的加密与解密。如下图示,说明了加密与解密的过程。

公式算法表示如下:
加密公式:c=Eke(m) (11.1) 解密公式:m=Dkd(c) (11.2)其中m代表明文,c代表密文,E是加密算法,D是解密算法,参数ke称为加密密钥,参数kd称为解密密钥
涉及知识点
- HASH算法 :散列函数是现代密码系统的基础。这些函数将任意长度的二进制字符串映射为固定长度的二进制字符串(称为散列值)
- 对称加密算法:指对信息的加密和解密都使用相同的密钥。
- 非对称加密算法:非对称加密算法对信息的加密与解密使用不同的密钥,用来加密的密钥是可以公开的,用来解密的密钥需要保密
- 数字签名术:数字签名技术结合散列算法和非对称加密技术来进行篡改检测和解决相关的身份验证问题。这就像在现实生活中用亲笔签名来保证文件或资料的真实性一样。
散列算法
散列算法主要有MD5【Message Digest Algorithm】,RIPEMD160【RACE Integrity Primitives Evaluation Message Digest】和SHA【Secure Hash Algorithm】,SHA又分为SHA1,SHA256,SHA384,SHA512,【散列算法不可逆,是单向操作】如下如所示:

关于散列算法,效果图如下:

HASH算法核心代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks; namespace DemoCrtpto
{
/// <summary>
/// 信息摘要帮助类
/// </summary>
public class HashHelper
{
#region 信息摘要 /// <summary>
/// MD5信息摘要
/// </summary>
/// <param name="source"></param>
/// <returns></returns>
public static string GetInfoByMd5(string source)
{
HashAlgorithm hash = getHashAlgorithm(HashType.MD5);
return Encrypto(hash, source);
} public static string GetInfoBySHA1(string source)
{
HashAlgorithm hash = getHashAlgorithm(HashType.SHA1);
return Encrypto(hash, source);
} public static string GetInfoBySHA256(string source)
{
HashAlgorithm hash = getHashAlgorithm(HashType.SHA256);
return Encrypto(hash, source);
} public static string GetInfoBySHA384(string source)
{
HashAlgorithm hash = getHashAlgorithm(HashType.SHA384);
return Encrypto(hash, source);
} public static string GetInfoBySHA512(string source)
{
HashAlgorithm hash = getHashAlgorithm(HashType.SHA512);
return Encrypto(hash, source);
} public static string GetInfoByRipeMD(string source)
{
HashAlgorithm hash = getHashAlgorithm(HashType.RIPEMD);
return Encrypto(hash, source);
} #endregion /// <summary>
/// 根据类型获取摘要算法名称
/// </summary>
/// <param name="t"></param>
/// <returns></returns>
private static HashAlgorithm getHashAlgorithm(HashType t) {
HashAlgorithm hash;
switch (t) {
case HashType.MD5:
hash = new MD5CryptoServiceProvider();
break;
case HashType.SHA1:
hash = new SHA1Managed();
break;
case HashType.SHA256:
hash = new SHA256Managed();
break;
case HashType.SHA384:
hash = new SHA384Managed();
break;
case HashType.SHA512:
hash = new SHA512Managed();
break;
case HashType.RIPEMD:
hash = new RIPEMD160Managed();
break;
default:
hash = new MD5CryptoServiceProvider();
break;
}
return hash;
} /// <summary>
/// 加密
/// </summary>
/// <param name="hash"></param>
/// <param name="source"></param>
/// <returns></returns>
private static string Encrypto(HashAlgorithm hash, string source) {
string dest = string.Empty;
try
{
byte[] btSource = Encoding.Default.GetBytes(source);
byte[] btDest = hash.ComputeHash(btSource);
dest = Convert.ToBase64String(btDest, , btDest.Length);
}
catch (Exception ex)
{
throw ex;
}
return dest;
}
} /// <summary>
/// 信息摘要类型
/// </summary>
public enum HashType {
MD5=,
SHA1=,
SHA256=,
SHA384=,
SHA512=,
RIPEMD=
}
}
对称加密算法
关于对称加密算法,主要有DES【Data Encryption Standard / 数据加密标准】 , 3DES【三重数据加密算法】,RC2【Rivest Cipher】,Rijndael【又称AES:Advanced Encryption Standard】。如下图所示:

关于对称加密算法,效果图如下:

对称加密算法的核心代码如下:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks; namespace DemoCrtpto
{
/// <summary>
/// 对称加密算法帮助类
/// </summary>
public class SymHelper
{
#region DES加密 /// <summary>
/// DES加密
/// </summary>
/// <param name="source"></param>
/// <param name="key"></param>
/// <param name="iv"></param>
/// <returns></returns>
public static string GetEnCryptoInfoByDES(string source, string key, string iv)
{
SymmetricAlgorithm sym = getSymmetricAlgorithm(SymType.DES);
return Encrypto(sym, source, key, iv); } /// <summary>
/// DES解密
/// </summary>
/// <param name="dest"></param>
/// <param name="key"></param>
/// <param name="iv"></param>
/// <returns></returns>
public static string GetDeCryptoInfoByDES(string dest, string key, string iv)
{
SymmetricAlgorithm sym = getSymmetricAlgorithm(SymType.DES);
return Decrypto(sym, dest, key, iv); } #endregion #region RC2加密与解密 /// <summary>
/// RC2加密
/// </summary>
/// <param name="source"></param>
/// <param name="key"></param>
/// <param name="iv"></param>
/// <returns></returns>
public static string GetEnCryptoInfoByRC2(string source, string key, string iv)
{
SymmetricAlgorithm sym = getSymmetricAlgorithm(SymType.RC2);
return Encrypto(sym, source, key, iv); } /// <summary>
/// RC2解密
/// </summary>
/// <param name="dest"></param>
/// <param name="key"></param>
/// <param name="iv"></param>
/// <returns></returns>
public static string GetDeCryptoInfoByRC2(string dest, string key, string iv)
{
SymmetricAlgorithm sym = getSymmetricAlgorithm(SymType.RC2);
return Decrypto(sym, dest, key, iv); } #endregion #region 3DES加密与解密 /// <summary>
/// 3DES加密
/// </summary>
/// <param name="source"></param>
/// <param name="key"></param>
/// <param name="iv"></param>
/// <returns></returns>
public static string GetEnCryptoInfoBy3DES(string source, string key, string iv)
{
SymmetricAlgorithm sym = getSymmetricAlgorithm(SymType.TripleDES);
return Encrypto(sym, source, key, iv); } /// <summary>
/// 3DES解密
/// </summary>
/// <param name="dest"></param>
/// <param name="key"></param>
/// <param name="iv"></param>
/// <returns></returns>
public static string GetDeCryptoInfoBy3DES(string dest, string key, string iv)
{
SymmetricAlgorithm sym = getSymmetricAlgorithm(SymType.TripleDES);
return Decrypto(sym, dest, key, iv); } #endregion #region Rijndael加密与解密 /// <summary>
/// Rijndael加密
/// </summary>
/// <param name="source"></param>
/// <param name="key"></param>
/// <param name="iv"></param>
/// <returns></returns>
public static string GetEnCryptoInfoByRijndael(string source, string key, string iv)
{
SymmetricAlgorithm sym = getSymmetricAlgorithm(SymType.Rijndael);
return Encrypto(sym, source, key, iv); } /// <summary>
/// Rijndael解密
/// </summary>
/// <param name="dest"></param>
/// <param name="key"></param>
/// <param name="iv"></param>
/// <returns></returns>
public static string GetDeCryptoInfoByRijndael(string dest, string key, string iv)
{
SymmetricAlgorithm sym = getSymmetricAlgorithm(SymType.Rijndael);
return Decrypto(sym, dest, key, iv);
} #endregion public static SymmetricAlgorithm getSymmetricAlgorithm(SymType t)
{
SymmetricAlgorithm sym;
switch (t)
{
case SymType.DES:
sym = new DESCryptoServiceProvider();
break;
case SymType.RC2:
sym = new RC2CryptoServiceProvider();
break;
case SymType.TripleDES:
sym = new TripleDESCryptoServiceProvider();
break;
case SymType.Rijndael:
sym = new RijndaelManaged();
break;
default:
sym = new DESCryptoServiceProvider();
break;
}
return sym;
} /// <summary>
/// 加密
/// </summary>
/// <param name="sym"></param>
/// <param name="source"></param>
/// <param name="key"></param>
/// <param name="iv"></param>
/// <returns></returns>
private static string Encrypto(SymmetricAlgorithm sym, string source, string key, string iv)
{
string dest = string.Empty;
try
{
byte[] btnSource = Encoding.Default.GetBytes(source);
//1.创建对称加密算法实例创建对称加密算法实例
sym.Mode = CipherMode.CBC;
int keyLen = sym.LegalKeySizes[].MaxSize / ;
int ivLen = sym.BlockSize / ;
if (key.Length < keyLen)
{
key = key.PadRight(keyLen, '');
}
if (iv.Length < ivLen)
{
iv = iv.PadRight(ivLen, '');
}
//使用 PBKDF1 算法的扩展从密码派生密钥
PasswordDeriveBytes pkey = new PasswordDeriveBytes(key,
ASCIIEncoding.ASCII.GetBytes("")); //2.设置初始化参数,包括密钥和初始化向量等
sym.Key = pkey.GetBytes(key.Length); //Encoding.Default.GetBytes(key);
sym.IV = Encoding.Default.GetBytes(iv);
//3.使用CreateEncryptor方法创建加密实例
ICryptoTransform trans = sym.CreateEncryptor();
//4.创建加密流
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, trans, CryptoStreamMode.Write);
//5.利用加密流进行数据加密
cs.Write(btnSource, , btnSource.Length);
cs.FlushFinalBlock();
//6.返回密文
byte[] cryptoByte = ms.ToArray();
dest = Convert.ToBase64String(cryptoByte, , cryptoByte.GetLength());
}
catch (Exception ex)
{
throw ex;
}
return dest;
} /// <summary>
/// 解密
/// </summary>
/// <param name="sym"></param>
/// <param name="dest"></param>
/// <param name="key"></param>
/// <param name="iv"></param>
/// <returns></returns>
private static string Decrypto(SymmetricAlgorithm sym, string dest, string key, string iv)
{
string source = string.Empty;
try
{
byte[] btnDest = Convert.FromBase64String(dest);
//1.创建对称加密算法实例创建对称加密算法实例
sym.Mode = CipherMode.CBC;
int keyLen = sym.LegalKeySizes[].MaxSize / ;
int ivLen = sym.BlockSize / ;
if (key.Length < keyLen)
{
key = key.PadRight(keyLen, '');
}
if (iv.Length < ivLen)
{
iv = iv.PadRight(ivLen, '');
}
//使用 PBKDF1 算法的扩展从密码派生密钥
PasswordDeriveBytes pkey = new PasswordDeriveBytes(key,
ASCIIEncoding.ASCII.GetBytes(""));
//2.设置初始化参数,包括密钥和初始化向量等
sym.Key = pkey.GetBytes(key.Length); //Encoding.Default.GetBytes(key);
sym.IV = Encoding.Default.GetBytes(iv);
//3.使用CreateDecryptor方法创建解密实例
ICryptoTransform trans = sym.CreateDecryptor();
//4.创建解密流
MemoryStream ms = new MemoryStream(btnDest, , btnDest.Length);
CryptoStream cs = new CryptoStream(ms, trans, CryptoStreamMode.Read); //5.返回明文
StreamReader sr = new StreamReader(cs);
source = sr.ReadToEnd();
}
catch (Exception ex)
{
throw ex;
}
return source;
}
} /// <summary>
/// 加密类型
/// </summary>
public enum SymType {
DES=,
RC2=,
TripleDES=,
Rijndael=
}
}
非对称加密算法和数字签名
非对称加密算法,主要要RSA【RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。1987年7月首次在美国公布,当时他们三人都在麻省理工学院工作实习。RSA就是他们三人姓氏开头字母拼在一起组成的。】【非对称加密算法对长度有一定的限制,适用于少量数据】

关于非对称加密算法,效果图如下:

关于数字签名,效果图如下:

关于非对称加密术和数字签名,核心代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks; namespace DemoCrtpto
{
/// <summary>
/// 非对称加密算法帮助类
/// </summary>
public class AsymHelper
{ } public class DSAHelper { private static string keyContainerName = "star"; private static string m_PriKey = string.Empty; private static string m_PubKey = string.Empty; public static string PriKey
{
get
{
return m_PriKey;
} set
{
m_PriKey = value;
}
} public static string PubKey
{
get
{
return m_PubKey;
} set
{
m_PubKey = value;
}
} public static void generateKey()
{
CspParameters m_CspParameters;
m_CspParameters = new CspParameters();
m_CspParameters.KeyContainerName = keyContainerName;
DSACryptoServiceProvider asym = new DSACryptoServiceProvider();
m_PriKey = asym.ToXmlString(true);
m_PubKey = asym.ToXmlString(false);
asym.PersistKeyInCsp = false;
asym.Clear();
} public static string Encrypto(string source) {
if (string.IsNullOrEmpty(m_PubKey) && string.IsNullOrEmpty(m_PriKey))
{
generateKey();
}
return getEncryptoInfoByDSA(source);
} /// <summary>
/// 创建数字签名
/// </summary>
/// <param name="source"></param>
/// <returns></returns>
public static string getEncryptoInfoByDSA(string source)
{
string dest = string.Empty;
string ss = HashHelper.GetInfoBySHA1(source);
byte[] btSource = Convert.FromBase64String(ss);
DSACryptoServiceProvider asym = new DSACryptoServiceProvider();
asym.FromXmlString(m_PriKey);
DSASignatureFormatter dsaFormatter = new DSASignatureFormatter(asym);
dsaFormatter.SetHashAlgorithm("SHA1");
byte[] btDest = dsaFormatter.CreateSignature(btSource);
dest = Convert.ToBase64String(btDest);
return dest;
} /// <summary>
/// 验证数字签名
/// </summary>
/// <param name="source"></param>
/// <param name="dest"></param>
/// <returns></returns>
public static bool verifyInfo(string source, string dest)
{
string ss = HashHelper.GetInfoBySHA1(source);
byte[] btnSource = Convert.FromBase64String(ss);
byte[] btnDest = Convert.FromBase64String(dest);
DSACryptoServiceProvider asym = new DSACryptoServiceProvider();
asym.FromXmlString(m_PubKey);
DSASignatureDeformatter dsaFormatter = new DSASignatureDeformatter(asym);
dsaFormatter.SetHashAlgorithm("SHA1");
return dsaFormatter.VerifySignature(btnSource, btnDest);
}
} public class RSAHelper { private static string keyContainerName = "star"; private static string m_PriKey = string.Empty; private static string m_PubKey = string.Empty; public static string PriKey
{
get
{
return m_PriKey;
} set
{
m_PriKey = value;
}
} public static string PubKey
{
get
{
return m_PubKey;
} set
{
m_PubKey = value;
}
} public static string Encrypto(string source) {
if (string.IsNullOrEmpty(m_PubKey) && string.IsNullOrEmpty(m_PriKey)) {
generateKey();
}
return getEncryptoInfoByRSA(source);
} public static string Decrypto(string dest) {
if (string.IsNullOrEmpty(m_PubKey) && string.IsNullOrEmpty(m_PriKey))
{
generateKey();
}
return getDecryptoInfoByRSA(dest);
} public static void generateKey()
{
CspParameters m_CspParameters;
m_CspParameters = new CspParameters();
m_CspParameters.KeyContainerName = keyContainerName;
RSACryptoServiceProvider asym = new RSACryptoServiceProvider(m_CspParameters); m_PriKey = asym.ToXmlString(true);
m_PubKey = asym.ToXmlString(false);
asym.PersistKeyInCsp = false;
asym.Clear();
} public static string getEncryptoInfoByRSA(string source)
{
byte[] plainByte = Encoding.ASCII.GetBytes(source);
//初始化参数
RSACryptoServiceProvider asym = new RSACryptoServiceProvider();
asym.FromXmlString(m_PubKey);
int keySize = asym.KeySize / ;//非对称加密,每次的长度不能太长,否则会报异常
int bufferSize = keySize - ;
if (plainByte.Length > bufferSize) {
throw new Exception("非对称加密最多支持【"+bufferSize+"】字节,实际长度【"+plainByte.Length+"】字节。");
}
byte[] cryptoByte = asym.Encrypt(plainByte, false);
return Convert.ToBase64String(cryptoByte);
} public static string getDecryptoInfoByRSA(string dest)
{
byte[] btDest = Convert.FromBase64String(dest);
//初始化参数
RSACryptoServiceProvider asym = new RSACryptoServiceProvider();
asym.FromXmlString(m_PriKey);
int keySize = asym.KeySize / ;//非对称加密,每次的长度不能太长,否则会报异常
//int bufferSize = keySize - 11;
if (btDest.Length > keySize)
{
throw new Exception("非对称解密最多支持【" + keySize + "】字节,实际长度【" + btDest.Length + "】字节。");
}
byte[] cryptoByte = asym.Decrypt(btDest, false);
return Encoding.ASCII.GetString(cryptoByte);
}
} public enum AsymType{
DSA=,
RSA=
}
}
本文旨在抛砖引玉,希望大家可以共同探讨,如有不足之处,还请指正。
C# 加密术的更多相关文章
- Java练习 SDUT-2787_加密术
加密术 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 加密技术是一种常用的安全保密手段,利用加密技术可以把重要的数据变 ...
- 1Caesar加密
Julius Caesar发明的较早的加密术,举个例子: 明文: meet me after the toga party 密文: PHHW PH DIWHU WKH WRJD SDUWB 其实就 ...
- 加密传输SSL协议2_传统加密
原本到了睡觉的时间,但是做完了SSL的笔记还有GCC和Oracle等的好多的笔记,所以刻苦一点. The Priciple of Encryption/Decryption --conventiona ...
- C#, VB.NET如何加密PDF文档
在日常工作中,人们通常通过加密PDF文档的方式来保护PDF文档.不管是公司还是个人,使用PDF加密术来设置一些权限是必不可少的.为了使PDF文档既可读又不能被未授权的用户所更改,一份PDF文档往往需要 ...
- LApacheMP基础环境搭建
一.安装前准备 1.下载所需软件包: apr | http://apache.etoak.com/apr/ apr-util | http://apache.etoak.com/apr/ autoco ...
- 可视化工具之 IGV 使用方法
整合基因组浏览器(IGV)是一种高性能的可视化工具,用来交互式地探索大型综合基因组数据.它支持各种数据类型,包括array-based的和下一代测序的数据和基因注释. IGV这个工具很牛,发了NB: ...
- JAVA 上加密算法的实现用例---转载
通常 , 使用的加密算法 比较简便高效 , 密钥简短,加解密速度快,破译极其困难.本文介绍了 MD5/SHA1,DSA,DESede/DES,Diffie-Hellman 的使用. 第 1 章基础知识 ...
- DotNET应用架构设计指南 安全 运行管理和通讯策略
DotNET应用架构设计指南(第三章:安全 运行管理和通讯策略(13-16)) 安全 运行管理和通讯策略 组织策略定义的规则是支配应用程序如何安全,如何管理,不同的应用程序组件是如何和另一组件及外部服 ...
- XJOI1652Matrix67的情书
Matrix67的情书 恺撒大帝曾经使用过这样一种加密术:对于明文中的每个字母,恺撒大帝会用它后面的第t个字母代替.例如,当t=3时,字母A将变成C,字母B将变成D,--,字母Y将变成A,字母Z将变成 ...
随机推荐
- 《你不知道的JavaScript(上卷)》读书笔记
第一次尝试用思维导图记笔记,感觉还不错~~~不过还是改不了我读书笔记写成抄书笔记的毛病 =.= 因为开始学JS的时候,一般浏览器就已经支持ES6了,所以比较喜欢使用ES6语法,let,=>等,文 ...
- nginx、swoole高并发原理初探
阅前热身 为了更加形象的说明同步异步.阻塞非阻塞,我们以小明去买奶茶为例. 同步与异步 同步与异步的重点在消息通知的方式上,也就是调用结果通知的方式. 同步:当一个同步调用发出去后,调用者要一直等待调 ...
- IdentityServer4(8)- 使用密码认证方式控制API访问(资源所有者密码授权模式)
一.前言 本文已经更新到 .NET Core 2.2 OAuth 2.0 资源所有者密码模式允许客户端向令牌服务发送用户名和密码,并获取代表该用户的访问令牌. 除了通过无法浏览器进行交互的应用程序之外 ...
- JDK,JRE,JVM,JMM关系与区别
JVM: Java Virtual Machine, 将java文件编译成class文件并运行class文件的软件 JRE:Java Runtime Enviromental,包含了JVM和Jav ...
- Android内存优化之内存缓存
前言: 上面两篇博客已经讲了图片的基本知识和图片的加载方法及优化,所有的这些优化都是为了避免应用出现OOM这个问题.一个好的应用程序不仅要健壮不能出错还要方便用户使用,对于用户来说你的应用不仅要美观还 ...
- win32线程
win32线程 一丶什么是线程 在windows中常听到的就是线程.多线程.啊什么的. 这里介绍一下什么是线程. 1.线程是附属在进程中的一个执行实体.简而言之就是执行代码的. 2.每个进程至少有一个 ...
- 网络协议抓包分析——IP互联网协议
前言 IP协议是位于OSI模型的第三层协议,其主要目的就是使得网络间可以相互通信.在这一层上运行的协议不止IP协议,但是使用最为广泛的就是互联网协议. 什么是IP数据报 TCP/IP协议定义了一个在因 ...
- Django 系列博客(四)
Django 系列博客(四) 前言 本篇博客介绍 django 如何和数据库进行交互并且通过 model 进行数据的增删查改 ORM简介 ORM全称是:Object Relational Mappin ...
- Haskell复习笔记(一)
Haskell笔记这是第三次总结,前两次都因为各种原因丢失了,对于Haskell我算不上什么大神,只不过在大学时为了学习算法时选择了Haskell. 当时的入门书籍选择的是<Learn You ...
- https创建请求UrL报错: 未能为 SSL/TLS 安全通道建立信任关系
1.项目中异常报错如下: 2.百度结果:原来是 网站没有使用SSL证书或者是SSl证书失效了的缘故. 3.具体解决方案如下: )导入命名空间 using System.Net.Security; us ...