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将变成 ...
随机推荐
- Saiku多用户使用时数据同步刷新(十七)
Saiku多用户使用时数据同步刷新 这里我们需要了解一下关于saiku的刷新主要有两种数据需要刷新: >1 刷新数据库的表中的数据,得到最新的表数据进行展示. >2 刷新cube信息,得到 ...
- ionic3 npm install cordova error syscall rename
突然出现cordova 不是内部或外部命令,也不是可运行的程序或批处理文件. 可是之前cordova安装后一直用的好好的啊,后来尝试重新安装cordova 出现这个错误.也尝试重新安装了最新版本的no ...
- Java工程师修炼之路(从小白到BAT的两年学习历程)
作者:陆小凤 文章首发于:微信公众号[程序员江湖] 前言 在下本是跨专业渣考研的985渣硕一枚,经历研究生两年的学习积累,有幸于2019秋季招聘中拿到几个公司的研发岗offer,包括百度,阿里,腾 ...
- 剑指offer例题分享--8
前言:继续分享,加油! 面试题44: 代码如下: #include<iostream> #include<stdlib.h> using namespace std; int ...
- ⑦JSP2.0的福利(标签文件)
前言 本篇接着上一篇博客:[传送门] 这次讲的是JSP2.0的特性之一,我们可以编写标签文件,指没有标签处理器和标签类库描述符的定制动作指令,不编译,无标签类描述符. 本文结构: ①标签文件简介 ②第 ...
- RocketMQ源码 — 四、 Consumer 接收消息过程
Consumer consumer pull message 订阅 在Consumer启动之前先将自己放到一个本地的集合中,再以后获取消费者的时候会用到,同时会将自己订阅的信息告诉broker 接收消 ...
- python使用多进程
python多线程适合IO密集型场景,而在CPU密集型场景,并不能充分利用多核CPU,而协程本质基于线程,同样不能充分发挥多核的优势. 针对计算密集型场景需要使用多进程,python的multipro ...
- 【前端框架系列】浅谈当前基于bootstrap框架的几种主流前端框架
一 概述 当新开发一个项目或产品时,技术选型是一个不可缺少的环节,在软件架构中有着举足轻重的作用,可以这么说,技术选型的好坏直接影响项目或产品的成败优劣,因此,在进行软件架构时,一定要想好技术选型. ...
- 监控 | open-falcon | 安装
监控 | open-falcon | 安装 1. 简介 主要看中了它的水平扩展,画图比zabbix要友好,告警支持简单压缩. 绿色:基础组件: 蓝色:作图链路 红色:报警链路 橙色:域名 架构 1.1 ...
- [转]启动container的时候出现iptables: No chain/target/match by that name
本文转自:https://blog.csdn.net/u013948858/article/details/83115388 问题: Error response from daemon: drive ...