一、Hash加密,使用HashAlgorithm哈希算法类的派生类

HashAlgorithm派生类包括:

  1. KeyedHashAlgorithm: 显示所有加密哈希算法实现均必须从中派生的抽象类。
  2. MD5: 表示 MD5 哈希算法的所有实现均从中继承的抽象类。
    ————MD5Crypto​Service​Provider:使用加密服务提供程序 (CSP) 提供的实现,计算输入数据的 MD5 哈希值。
  3. RIPEMD160: 表示 MD160 哈希算法的所有实现均从中继承的抽象类。
  4. SHA1: 计算输入数据的 SHA1 哈希值。
    ————SHA1Crypto​Service​Provider:使用加密服务提供程序 (CSP) 提供的实现,计算输入数据的 SHA1 哈希值。
  5. SHA256: 计算输入数据的 SHA256 哈希值。
  6. SHA384: 计算输入数据的 SHA384 哈希值。
  7. SHA512: 计算输入数据的 SHA512 哈希值。

只能加密,不可逆。可对目标信息生成一段特定长度唯一的Hash值。

1、使用抽象类HashAlgorithm

//明文密码由字符串转换为byte数组
");

//由明文的byte数组计算出MD5密文byte数组
byte[] hashedBytes = ((HashAlgorithm)CryptoConfig.CreateFromName("MD5")).ComputeHash(clearBytes);

//把byte数组转换为字符串后返回,BitConverter用于将基础数据类型与字节数组相互转换
string result = BitConverter.ToString(hashedBytes).Replace("-", "");

Console.Write(result);

2、使用抽象类MD5

");
byte[] hashedBytes =  MD5.Create().ComputeHash(clearBytes);

StringBuilder sBuilder = new StringBuilder();
; i < hashedBytes.Length; i++)
{
    sBuilder.Append(hashedBytes[i].ToString("x2"));
}
string result = sBuilder.ToString();
Console.Write(result);

3、使用MD5CryptoServiceProvider类

");
byte[] hashedBytes = new MD5CryptoServiceProvider().ComputeHash(clearBytes);
string result = "";
; i < hashedBytes.Length; i++)
    result += hashedBytes[i].ToString(, ');

Console.Write(result);

4、Web使用的Hash加密:FormsAuthentication类

FormAuthentication.HashPasswordForStoringInConfigFile(str,"MD5")//或者“SHA1”

5、文件哈希计算

  • MD5是一个将任意长度的数据字符串转化成短的固定长度的值的单向操作。任意两个字符串不应有相同的散列值(即,有“很大可能”是不一样的,并且要人为地创造出来两个散列值相同的字符串应该是困难的)。

  • 因此MD5经常用于校验字符串或者文件,因为如果文件的MD5不一样,说明文件内容也是不一样的,即经过修改的,如果发现下载的文件和给的md5值不一样,就需要慎重使用。
  • MD5文件校验用途非常多,例如:游戏patch包的校验,病毒文件确认,app提审校验等等,只要需要确认某一个文件的唯一性和正确性,都会使用md5作为校验。

输入文件路径,就可以得到对应的哈希值,这个哈希值是对文件本身内容包括文件名字有关,跟文件存放的路径和运行平台,设备无关。

string GetFileHash(string path)
{
    var hash = MD5.Create();//SHA1.Create();
    var stream = new FileStream(path, FileMode.Open);
    byte[] hashByte = hash.ComputeHash(stream);
    stream.Close();
    return BitConverter.ToString(hashByte).Replace("-", "");
}

二、非对称加密:使用AsymmetricAlgorithm非对称算法类的派生类

AsymmetricAlgorithm派生类包括:

  1. DSA:表示数字签名算法(DSA)的所有实现都必须从中继承的抽象基类。
    ————DSACryptoServiceProvider:使用加密服务提供程序 (CSP) 提供的 DSA算法的实现执行不对称加密和解密。
  2. ECDiffie​Hellman:
  3. ECDsa:
  4. RSA:表示 RSA 算法的所有实现均从中继承的基类。
    ————RSACrypto​Service​Provider:使用加密服务提供程序 (CSP) 提供的 RSA 算法的实现执行不对称加密和解密。

指加密和解密使用不同密钥的加密算法,也称为公私钥加密。公钥是可以公开用来加密,私匙严格由接受方保密用于加密。

非对称加密的缺点是加解密速度要远远慢于对称加密,

/// <summary>
/// 获取加密所使用的key,RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。
/// </summary>
public static void GetKey()
{
    string PublicKey = string.Empty;
    string PrivateKey = string.Empty;
    RSACryptoServiceProvider rSACryptoServiceProvider = new RSACryptoServiceProvider();
    PublicKey = rSACryptoServiceProvider.ToXmlString(false); // 获取公匙,用于加密
    PrivateKey = rSACryptoServiceProvider.ToXmlString(true); // 获取公匙和私匙,用于解密

    //Console.WriteLine("PublicKey is {0}", PublicKey);        // 输出公匙
    //Console.WriteLine("PrivateKey is {0}", PrivateKey);     // 输出密匙
    //密匙中含有公匙,公匙是根据密匙进行计算得来的。

    using (StreamWriter streamWriter = new StreamWriter("PublicKey.xml"))
    {
        streamWriter.Write(rSACryptoServiceProvider.ToXmlString(false));// 将公匙保存到运行目录下的PublicKey
    }
    using (StreamWriter streamWriter = new StreamWriter("PrivateKey.xml"))
    {
        streamWriter.Write(rSACryptoServiceProvider.ToXmlString(true)); // 将公匙&私匙保存到运行目录下的PrivateKey
    }
}

/// <summary>
/// 加密
/// </summary>
private static string Encryption(string str)
{
    RSACryptoServiceProvider rSACryptoServiceProvider = new RSACryptoServiceProvider();
    using (StreamReader streamReader = new StreamReader("PublicKey.xml")) // 读取运行目录下的PublicKey.xml
    {
        rSACryptoServiceProvider.FromXmlString(streamReader.ReadToEnd()); // 将公匙载入进RSA实例中
    }
    byte[] buffer = Encoding.UTF8.GetBytes(str); // 将明文转换为byte[]

    // 加密后的数据就是一个byte[] 数组,可以以 文件的形式保存 或 别的形式(网上很多教程,使用Base64进行编码化保存)
    byte[] EncryptBuffer = rSACryptoServiceProvider.Encrypt(buffer, false); // 进行加密

    return Convert.ToBase64String(EncryptBuffer); // 如果使用base64进行明文化,在解密时 需要再次将base64 转换为byte[]
}
/// <summary>
/// 解密
/// </summary>
private static string Decrypt(string strEncryptBase64)
{
    RSACryptoServiceProvider rSACryptoServiceProvider = new RSACryptoServiceProvider();
    using (StreamReader streamReader = new StreamReader("PrivateKey.xml")) // 读取运行目录下的PrivateKey.xml
    {
        rSACryptoServiceProvider.FromXmlString(streamReader.ReadToEnd()); // 将私匙载入进RSA实例中
    }
    byte[] buffer = Convert.FromBase64String(strEncryptBase64);
    // 解密后得到一个byte[] 数组
    byte[] DecryptBuffer = rSACryptoServiceProvider.Decrypt(buffer, false); // 进行解密
    string str = Encoding.UTF8.GetString(DecryptBuffer); // 将byte[]转换为明文

    return str;
}

三、对称加密算法:使用SymmetricAlgorithm对称算法类的派生类

SymmetricAlgorithm派生类包括:

  1. Aes:表示高级加密标准 (AES) 的所有实现都必须从中继承的抽象基类。
    ————Aes​Crypto​Service​Provider:使用高级加密标准 (AES) 算法的加密应用程序编程接口 (CAPI) 实现来执行对称加密和解密。
  2. DES:表示所有 DES 实现都必须从中派生的数据加密标准 (DES) 算法的基类。
    ————DESCrypto​Service​Provider:定义访问数据加密标准 (DES) 算法的加密服务提供程序 (CSP) 版本的包装对象。
  3. RC2:表示 RC2 算法的所有实现都必须从中派生的基类。
  4. Rijndael:表示 Rijndael 对称加密算法的所有实现必须从其继承的基类。
  5. TripleDES:表示三重数据加密标准算法的基类

指加密和解密使用相同密钥的加密算法。

对称加密算法的优点在于加解密的高速度和使用长密钥时的难破解性。

public static string strKey = "abcdefgh";//注意:这里的密钥sKey必须能转为8个byte,即输入密钥为8半角个字符或者4个全角字符或者4个汉字的字符串
public static string strIV = "ijklmnop";

// 加密
public static string Encrypt(string _strQ)
{
    byte[] buffer = Encoding.UTF8.GetBytes(_strQ);
    MemoryStream ms = new MemoryStream();
    DESCryptoServiceProvider des = new DESCryptoServiceProvider();
    CryptoStream encStream = new CryptoStream(ms, des.CreateEncryptor(Encoding.UTF8.GetBytes(strKey), Encoding.UTF8.GetBytes(strIV)), CryptoStreamMode.Write);
    encStream.Write(buffer, , buffer.Length);
    encStream.FlushFinalBlock();
    return Convert.ToBase64String(ms.ToArray());
}

// 解密
public static string Decrypt(string _strQ)
{
    byte[] buffer = Convert.FromBase64String(_strQ);
    MemoryStream ms = new MemoryStream();
    DESCryptoServiceProvider des = new DESCryptoServiceProvider();
    CryptoStream encStream = new CryptoStream(ms, des.CreateDecryptor(Encoding.UTF8.GetBytes(strKey), Encoding.UTF8.GetBytes(strIV)), CryptoStreamMode.Write);
    encStream.Write(buffer, , buffer.Length);
    encStream.FlushFinalBlock();
    return Encoding.UTF8.GetString(ms.ToArray());
}

加密与解密 Sytem.Security.CryptoGraphy的更多相关文章

  1. C#原生加密方法: System.Security.Cryptography.CryptoStream DataSet加密解密

    采用16位密钥形式加密,把数据 dataset或文本转换为二进制流,然后进行加密解密.代码如下: using System; using System.Collections.Generic; usi ...

  2. 解决RSA加密中,System.Security.Cryptography.CryptographicException: 系统找不到指定的文件

    首先说下环境,win2008R2,iis7.5 遇到这个问题,困扰了我一天,在外国的网站上找到答案,还好有点英文基础.最后算是解决了,不过其中的原理还是没有搞的十分清楚. 先说下解决办法, 打开IIS ...

  3. 转:system.Security.Cryptography C# 加密和解密

    以下文转自: http://www.360doc.com/content/13/0122/05/19147_261678471.shtml 总结:注册的时候经过MD5加密存进数据库,在登录的时候需要先 ...

  4. Cryptography加密和解密

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Se ...

  5. python3利用cryptography 进行加密和解密

    我们的日常工作中,一定会遇到需要加密的数据,比如:密码.私密信息... ... 我们不仅要对他们进行加密,更需要对他们进行解密,因为毕竟我们的用户应该不会看得懂加密过后的字符串吧!!! 在python ...

  6. Security基础(二):SELinux安全防护、加密与解密应用、扫描与抓包分析

    一.SELinux安全防护 目标: 本案例要求熟悉SELinux防护机制的开关及策略配置,完成以下任务: 将Linux服务器的SELinux设为enforcing强制模式 在SELinux启用状态下, ...

  7. c# DESEncrypt 加密、解密算法

    using System; using System.Security.Cryptography; using System.Text; namespace AttendService { publi ...

  8. 【知识积累】DES算法之C#加密&Java解密

    一.前言 在项目需要添加安全模块,客户端调用服务端发布的service必须要经过验证,加密算法采用DES,客户端采用C#进行加密,服务端使用Java进行解密.废话不多说,直接上代码. 二.客户端 客户 ...

  9. .Net中的加密与解密

    加密与解密概述 加密与解密属于数据安全的范畴.在消息传输时,通过对消息进行特殊编码(加密),建立一种安全的交流方式,使得只有发送者所期望的接收者能够理解(解密).这里我们定义一个场景:发送方,接收方, ...

随机推荐

  1. sem_wait sem_post信号量操作进本函数

    sem_wait   sem_post 信号量的数据类型为结构sem_t,它本质上是一个长整型的数.函数sem_init()用来初始化一个信号量.它的原型为: extern int sem_init ...

  2. BOOT目录磁盘占用满处理

    背景:Ubuntu:16.04 查看已安装启动镜像 dpkg --get-selections |grep linux-image 这里会列出目前已经安装的启动镜像,一般分两种,一种状态为“insta ...

  3. [转帖]HBase详解(很全面)

    HBase详解(很全面) very long story 简单看了一遍 很多不明白的地方.. 2018-06-08 16:12:32 卢子墨 阅读数 34857更多 分类专栏: HBase   [转自 ...

  4. Java基础---Java 类

    类 成员变量直接定义在类里面,在方法的外面: 成员方法不要写static关键字 eg: public class Student { String name; // 成员变量 int aeg; //成 ...

  5. Word 文档内超级链接跳转到书签

    1. 前言 在Word文档内如何实现一些跳转的超链接呢?Word中,一些外部链接,我们通常叫作超链接,内部链接我们可以叫书签.如何在文档中如何使用书签,跳转到指定位置? 这里我在网上随便找了一份模拟试 ...

  6. 【程序人生】程序员真会玩,工作996,生病ICU

    昨天Github上一个项目彻底爆红了网络,短短一天star数突破一万,Issues已破1800,大家纷纷说出有关企业的不合理加班行为,句句吐露程序员的心声,掀起了一波抵制加班潮,抵制996. 该项目里 ...

  7. Thinking In Java 4th Chap8 多态(未完)

    多态的意义:改善代码的可读性并且使得程序“可扩展” 多态方法调用允许一种类型表现出与其他相似类型之间的"区别",基于方法的行为不同而表现出来 将一个方法调用同一个方法主体关联起来称 ...

  8. Python TypeError: __init__() got multiple values for argument 'master'(转)

    转自:https://stackoverflow.com/questions/33153404/python-typeerror-init-got-multiple-values-for-argume ...

  9. k8s 开源web操作平台

    https://kuboard.cn/install/install-dashboard.html kuborad

  10. vue实现组件切换的两种方式

    <!DOCTYPE html> <html> <head> <title>组件的切换</title> <meta charset=&q ...