本文是利用一个简单的小例子,简述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# 加密术的更多相关文章

  1. Java练习 SDUT-2787_加密术

    加密术 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 加密技术是一种常用的安全保密手段,利用加密技术可以把重要的数据变 ...

  2. 1Caesar加密

    Julius Caesar发明的较早的加密术,举个例子: 明文: meet me after the toga party 密文:   PHHW PH DIWHU WKH WRJD SDUWB 其实就 ...

  3. 加密传输SSL协议2_传统加密

    原本到了睡觉的时间,但是做完了SSL的笔记还有GCC和Oracle等的好多的笔记,所以刻苦一点. The Priciple of Encryption/Decryption --conventiona ...

  4. C#, VB.NET如何加密PDF文档

    在日常工作中,人们通常通过加密PDF文档的方式来保护PDF文档.不管是公司还是个人,使用PDF加密术来设置一些权限是必不可少的.为了使PDF文档既可读又不能被未授权的用户所更改,一份PDF文档往往需要 ...

  5. LApacheMP基础环境搭建

    一.安装前准备 1.下载所需软件包: apr | http://apache.etoak.com/apr/ apr-util | http://apache.etoak.com/apr/ autoco ...

  6. 可视化工具之 IGV 使用方法

    整合基因组浏览器(IGV)是一种高性能的可视化工具,用来交互式地探索大型综合基因组数据.它支持各种数据类型,包括array-based的和下一代测序的数据和基因注释. IGV这个工具很牛,发了NB: ...

  7. JAVA 上加密算法的实现用例---转载

    通常 , 使用的加密算法 比较简便高效 , 密钥简短,加解密速度快,破译极其困难.本文介绍了 MD5/SHA1,DSA,DESede/DES,Diffie-Hellman 的使用. 第 1 章基础知识 ...

  8. DotNET应用架构设计指南 安全 运行管理和通讯策略

    DotNET应用架构设计指南(第三章:安全 运行管理和通讯策略(13-16)) 安全 运行管理和通讯策略 组织策略定义的规则是支配应用程序如何安全,如何管理,不同的应用程序组件是如何和另一组件及外部服 ...

  9. XJOI1652Matrix67的情书

    Matrix67的情书 恺撒大帝曾经使用过这样一种加密术:对于明文中的每个字母,恺撒大帝会用它后面的第t个字母代替.例如,当t=3时,字母A将变成C,字母B将变成D,--,字母Y将变成A,字母Z将变成 ...

随机推荐

  1. Ubantu linux中使用PyCharm之---破解PyCharm,实现永久免费试用

    打开 http://idea.lanyus.com/ 这个网址,可以直接复制到浏览器打开 获取注册码 K71U8DBPNE-eyJsaWNlbnNlSWQiOiJLNzFVOERCUE5FIiwibG ...

  2. (转)asyncio --- 异步 I/O

    原文:https://docs.python.org/zh-cn/3/library/asyncio.html asyncio 是用来编写 并发 代码的库,使用 async/await 语法. asy ...

  3. Android--UI之Radio、Check、Toggle

    前言 这篇博客讲解一下Android平台下,RadioButton.CheckBox以及ToggleButton三个控件的用法,因为这三个控件之中都存在一个选中或是没选中的状态,所以放在一起讲解. 这 ...

  4. [Maven]Maven如何得到单独的单元测试报告

    ----------------------------------------------------------------- 原创博文,如需转载请通知作者并注明出处! 博主:疲惫的豆豆 链接:h ...

  5. 并发服务器三种实现方式之进程、线程和select

    前言:刚开始学网络编程,都会先写一个客户端和服务端,不知道你们有没有试一下:再打开一下客户端,是连不上服务端的.还有一个问题不知道你们发现没:有时启服务器,会提示“Address already in ...

  6. 项目ITP(五) spring4.0 整合 Quartz 实现任务调度

    前言 系列文章:[传送门] 项目需求: 二维码推送到一体机上,给学生签到扫描用.然后需要的是 上课前20分钟 ,幸好在帮带我的学长做 p2p 的时候,接触过.自然 quartz 是首选.所以我就配置了 ...

  7. Java 容器源码分析之 LinkedList

    概览 同 ArrayList 一样,LinkedList 也是对 List 接口的一种具体实现.不同的是,ArrayList 是基于数组来实现的,而 LinkedList 是基于双向链表实现的.Lin ...

  8. Python机器学习笔记:XgBoost算法

    前言 1,Xgboost简介 Xgboost是Boosting算法的其中一种,Boosting算法的思想是将许多弱分类器集成在一起,形成一个强分类器.因为Xgboost是一种提升树模型,所以它是将许多 ...

  9. Jenkins入门之执行Powershell脚本

    之前章节提到过powershell,如果需要构建复杂的任务时,使用cmd不是很方便(也可能是由于笔者不太熟悉cmd命令,这里见笑了),这时候powershell就派上用场了,这里并不详细介绍power ...

  10. CPU上下文切换

    CPU上下文切换包括进程上下文切换.线程上下文切换及中断上下文切换,当任务进行io或发生时间片事件及发生中断(如硬件读取完成)时,就会进入内核态,发生CPU上下文切换. 进程上下文切换,进程的上下文信 ...