iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#实现加密与解密详解
  • 955
分享到

C#实现加密与解密详解

2024-04-02 19:04:59 955人浏览 八月长安
摘要

目录一、Hash加密,使用HashAlGorithm哈希算法类的派生类(MD5、SHA1等)1、使用抽象类HashAlgorithm2、使用抽象类MD53、使用MD5CryptoSe

一、Hash加密,使用HashAlgorithm哈希算法类的派生类(MD5、SHA1等)

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

HashAlgorithm派生类包括:

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

1、使用抽象类HashAlgorithm

//明文密码由字符串转换为byte数组
byte[] clearBytes =Encoding.Default.GetBytes("123");

//由明文的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[] clearBytes = Encoding.Default.GetBytes("123");
byte[] hashedBytes =  MD5.Create().ComputeHash(clearBytes);

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

3、使用MD5CryptoServiceProvider类

byte[] clearBytes = Encoding.Default.GetBytes("123");
byte[] hashedBytes = new MD5CryptoServiceProvider().ComputeHash(clearBytes);
string result = "";
for (int i = 0; i < hashedBytes.Length; i++)
    result += hashedBytes[i].ToString("X").PadLeft(2, '0');

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("-", "");
}

二、对称加密:使用SymmetricAlgorithm对称算法类的派生类(Aes、DES等)

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

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

SymmetricAlgorithm派生类包括:

  • Aes:表示高级加密标准 (AES) 的所有实现都必须从中继承的抽象基类。
    ————Aes​Crypto​Service​Provider:使用高级加密标准 (AES) 算法的加密应用程序编程接口 (Capi) 实现来执行对称加密和解密。
  • DES:表示所有 DES 实现都必须从中派生的数据加密标准 (DES) 算法的基类。
    ————DESCrypto​Service​Provider:定义访问数据加密标准 (DES) 算法的加密服务提供程序 (CSP) 版本的包装对象。
  • RC2:表示 RC2 算法的所有实现都必须从中派生的基类。
  • Rijndael:表示 Rijndael 对称加密算法的所有实现必须从其继承的基类。
  • 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, 0, 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, 0, buffer.Length);
    encStream.FlushFinalBlock();
    return Encoding.UTF8.GetString(ms.ToArray());
}

三、非对称加密:使用AsymmetricAlgorithm非对称算法类的派生类(DSA、RSA等)

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

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

AsymmetricAlgorithm派生类包括:

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

/// 获取加密所使用的key,RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。
/// 
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
    }
}

/// 

/// 加密
/// 
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[]
}

/// 

/// 解密
/// 
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;
}

到此这篇关于C#加密与解密的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: C#实现加密与解密详解

本文链接: https://www.lsjlt.com/news/150501.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#实现加密与解密详解
    目录一、Hash加密,使用HashAlgorithm哈希算法类的派生类(MD5、SHA1等)1、使用抽象类HashAlgorithm2、使用抽象类MD53、使用MD5CryptoSe...
    99+
    2024-04-02
  • JavaScript实现加密与解密详解
    目前原生JS貌似并没有提供MD5计算相关的函数方法,只能自己实现或者使用前辈大神写好的。 一、使用crypto.js库进行加密 GitHub的 https://github...
    99+
    2024-04-02
  • C#如何实现加密与解密
    这篇文章主要讲解了“C#如何实现加密与解密”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#如何实现加密与解密”吧!一、Hash加密,使用HashAlgorithm哈希算法类的派生类(MD5...
    99+
    2023-06-30
  • python密码加密与解密的实现
    目录一、对称加密1.1 安装第三方库 - PyCrypto1.2 加密实现二、非对称加密三、摘要算法3.1 md5加密3.2 sha1加密3.3 sha256加密3.4 sha384...
    99+
    2023-02-07
    python 密码加密 python 密码解密
  • 详解使用Nodejs内置加密模块实现对等加密与解密
    加密与解密是保证通讯安全的一种重要手段,现在加密算法已经有很多,并且都有成熟的软件包可以使用,这就大大降低了应用开发程序员的负担,只需要使用这些第三方提供的加密解密库就可以使用了,在...
    99+
    2024-04-02
  • JavaScript如何实现加密与解密
    这篇“JavaScript如何实现加密与解密”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JavaScript如何实现加密与...
    99+
    2023-06-30
  • C#实现简单的文件加密与解密方式
    目录C#实现文件加密与解密C#进行url加密解密与jquery前端加密解密C#进行url加密与解密jquery总结C#实现文件加密与解密 代码: static class Handl...
    99+
    2023-01-28
    C#文件加密 C#文件解密 C#文件加密解密方式
  • 如何理解C#DES加密解密的实现
    这篇文章将为大家详细讲解有关如何理解C#DES加密解密的实现,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。C# DES加密解密的实现,DES算法为密码体制中的对称密码体制,由IBM公司研制的...
    99+
    2023-06-17
  • Rust实现AES加解密详解
    目录一、选择使用 rust-crypto二、Cargo.toml 文件三、工具类1、加密2、解密3、测试样例一、选择使用 rust-crypto rust-crypto 官方相关站点...
    99+
    2022-11-13
    Rust AES加解密 Rust 加密 Rust 解密
  • python基于crypto实现加密与解密
    1.安装crypto库 pip install pycryptodome ps: 使用pip工具安装步骤: 1、直接安装pycryptodome模块即可 pip install pycryptodom...
    99+
    2023-10-10
    python 开发语言
  • 如何实现VBS加密与VBE解密
    这篇文章主要介绍了如何实现VBS加密与VBE解密,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。用Script Encoder加密VBS脚本Script Encoder 是一个...
    99+
    2023-06-08
  • 详解C#如何加密解密RAR文件
    目录实践过程效果代码实践过程 效果 代码 public partial class Form1 : Form { public Form1() { ...
    99+
    2022-12-31
    C#加密解密RAR文件 C#加密RAR C#解密RAR
  • Python实现栅栏密码的加密解密方法详解
    目录1.栅栏密码介绍2.栅栏密码加密3.栅栏密码解密(爆破)4.W型栅栏密码加密1.栅栏密码介绍 所谓栅栏密码,就是把要加密的明文分成N个一组,然后把每组的第1个字连起来,形成一段无...
    99+
    2023-01-16
    Python栅栏密码加密 Python栅栏密码解密
  • 详解PHPlaravel中的加密与解密函数
    目录一:简介二:配置三:使用加密/解密1:加密2:不使用序列化进行加密3:解密Laravel为我们提供了完整的加密方法及加密模式。 我之前一般在加密的时候使用的是我自己写的加密函数,...
    99+
    2022-11-13
    PHP laravel加密 解密 PHP laravel加密 PHP laravel 解密
  • PHP加密函数与解密函数详解
    去网上找了下。 Php常用的加密函数有 MD5加密(不可逆)、Crypt加密(不可逆)、Sha1加密(不可逆)、Urlencode加密(可逆) base64编码加密(可逆) 还是见识...
    99+
    2022-11-13
    PHP 加密 解密函数 PHP 加密函数 PHP 解密函数
  • 详解c#与js的rsa加密互通
    目录ASN.1密钥结构类型PKCS#1PKCS#8密钥编码类型der格式pem格式证书类型X.509证书PKCS#12证书PKCS#7证书证书后缀证书与密钥关系密钥生成后端加/解密方...
    99+
    2024-04-02
  • c语言如何实现DES加密解密
    目录c语言实现DES加密解密C语言DES加密解密的认识以及解密出现乱码的分析Des加密Des加密模式填充方式保证加密解密的一致性 python中的des加密总结c语言实现DES加密解...
    99+
    2023-05-18
    c语言DES c语言加密解密 DES加密解密
  • mybatis中数据加密与解密的实现
    目录1、需求2、解决方案3、使用拦截器方式3.1 定义加密接口3.2 定义加密注解3.3 拦截器加密数据3.4 拦截器解密数据3.5 解密工具类3.6 实体类样例4、使用类型转换器4...
    99+
    2024-04-02
  • jquery实现aes加密解密
    随着互联网技术的发展,网络安全问题变得越来越突出。许多网站都要求用户输入敏感信息,如密码等。这些信息往往需要进行加密处理,以保证安全性。AES(Advanced Encryption Standard)是一种流行的加密算法,具有高效、安全、...
    99+
    2023-05-24
  • Python实现RSA加密解密
    目录前言一、安装模块二、生成密钥对三、加密四、解密五、完整代码前言 加密技术在数据安全存储,数据传输中发挥着重要作用,能够保护用户隐私数据安全,防止信息窃取。RSA是一种非对称加密技...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作