C#如何实现加密与解密

发布时间:2022-06-06 10:00:03 作者:iii
来源:亿速云 阅读:214

这篇文章主要讲解了“C#如何实现加密与解密”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#如何实现加密与解密”吧!

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

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

HashAlgorithm派生类包括:

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、文件哈希计算

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

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派生类包括:

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派生类包括:

/// 

/// 获取加密所使用的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#如何实现加密与解密”的内容了,经过本文的学习后,相信大家对C#如何实现加密与解密这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

推荐阅读:
  1. javascript与php实现openssl加密/解密
  2. 怎么在Python中实现AES加密与解密

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

上一篇:Python如何使用Beautiful Soup(BS4)库解析HTML和XML

下一篇:JavaScript如何实现加密与解密

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》