.Net 加密 哈希

一、DES加解密


  DES一共就有4个参数参与运作:明文、密文、密钥、向量。其中这4者的关系可以理解为:

  •   密文=明文+密钥+向量;

  •   明文=密文-密钥-向量;

  为什么要向量这个参数呢?因为如果有一篇文章,有几个词重复,那么这个词加上密钥形成的密文,仍然会重复,这给破解者有机可乘,破解者可以根据重复的内容,猜出是什么词,然而一旦猜对这个词,那么,他就能算出密钥,整篇文章就被破解了!加上向量这个参数以后,每块文字段都会依次加上一段值,这样,即使相同的文字,加密出来的密文,也是不一样的,算法的安全性大大提高!

  下面给出DES加、解密的.Net封装版:


using System;
using System.Text;
using System.Security.Cryptography;
using System.IO;

namespace 开发测试
{
class Program
{
static void Main(string[] args)
{
string user = Encrypt("admin");
string pass = Encrypt("999999");

Console.WriteLine(user);
Console.WriteLine(pass);

string GetUser = Decrypt(user);
string GetPass = Decrypt(pass);

Console.WriteLine(GetUser);
Console.WriteLine(GetPass);

Console.ReadLine();
}

/// <summary>
/// 获取密钥
/// </summary>
private static string Key
{
get { return @"[email protected]+#wG%A"; }
}

/// <summary>
/// 获取向量
/// </summary>
private static string IV
{
get { return @"L*n67}G\[email protected]%:~Y"; }
}

/// <summary>
/// DES加密
/// </summary>
/// <param name="plainStr">明文字符串</param>
/// <returns>密文</returns>
public static string Encrypt(string plainStr)
{
byte[] bKey = Encoding.UTF8.GetBytes(Key);
byte[] bIV = Encoding.UTF8.GetBytes(IV);
byte[] byteArray = Encoding.UTF8.GetBytes(plainStr);

string encrypt = null;
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
try
{
using (MemoryStream mStream = new MemoryStream())
{
using (CryptoStream cStream = new CryptoStream(mStream, des.CreateEncryptor(bKey, bIV), CryptoStreamMode.Write))
{
cStream.Write(byteArray, 0, byteArray.Length);
cStream.FlushFinalBlock();
encrypt = Convert.ToBase64String(mStream.ToArray());
}
}
}
catch { }
des.Clear();
return encrypt;
}

/// <summary>
/// DES解密
/// </summary>
/// <param name="encryptStr">密文字符串</param>
/// <returns>明文</returns>
public static string Decrypt(string encryptStr)
{
byte[] bKey = Encoding.UTF8.GetBytes(Key);
byte[] bIV = Encoding.UTF8.GetBytes(IV);
byte[] byteArray = Convert.FromBase64String(encryptStr);

string decrypt = null;
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
try
{
using (MemoryStream mStream = new MemoryStream())
{
using (CryptoStream cStream = new CryptoStream(mStream, des.CreateDecryptor(bKey, bIV), CryptoStreamMode.Write))
{
cStream.Write(byteArray, 0, byteArray.Length);
cStream.FlushFinalBlock();
decrypt = Encoding.UTF8.GetString(mStream.ToArray());
}
}
}
catch { }
des.Clear();
return decrypt;
}
}
}

二、AES加解密


  AES是美国联邦政府采用的商业及政府数据加密标准,预计将在未来几十年里代替DES在各个领域中得到广泛应用。AES提供128位密钥,因此,128位AES的加密强度是56位DES加密强度的1021倍还多。假设可以制造一部可以在1秒内破解DES密码的机器,那么使用这台机器破解一个128位AES密码需要大约149亿万年的时间。

  下面给出AES加解密的.Net封装版:


using System;
using System.Text;
using System.Security.Cryptography;
using System.IO;

namespace 开发测试
{
class Program
{
static void Main(string[] args)
{
string user = Encrypt("admin");
string pass = Encrypt("999999");

Console.WriteLine(user);
Console.WriteLine(pass);

string GetUser = Decrypt(user);
string GetPass = Decrypt(pass);

Console.WriteLine(GetUser);
Console.WriteLine(GetPass);

Console.ReadLine();
}

/// <summary>
/// 获取密钥
/// </summary>
private static string Key
{
get { return @"qO[NB]6,YF}gefcaj{+oESb9d8>Z‘e9M"; }
}

/// <summary>
/// 获取向量
/// </summary>
private static string IV
{

get { return @"L+\~f4.Ir)b$=pkf"; }
}

/// <summary>
/// AES加密
/// </summary>
/// <param name="plainStr">明文字符串</param>
/// <returns>密文</returns>
public static string Encrypt(string plainStr)
{
byte[] bKey = Encoding.UTF8.GetBytes(Key);
byte[] bIV = Encoding.UTF8.GetBytes(IV);
byte[] byteArray = Encoding.UTF8.GetBytes(plainStr);

string encrypt = null;
Rijndael aes = Rijndael.Create();
try
{
using (MemoryStream mStream = new MemoryStream())
{
using (CryptoStream cStream = new CryptoStream(mStream, aes.CreateEncryptor(bKey, bIV), CryptoStreamMode.Write))
{
cStream.Write(byteArray, 0, byteArray.Length);
cStream.FlushFinalBlock();
encrypt = Convert.ToBase64String(mStream.ToArray());
}
}
}
catch { }
aes.Clear();

return encrypt;
}

/// <summary>
/// AES解密
/// </summary>
/// <param name="encryptStr">密文字符串</param>
/// <returns>明文</returns>
public static string Decrypt(string encryptStr)
{
byte[] bKey = Encoding.UTF8.GetBytes(Key);
byte[] bIV = Encoding.UTF8.GetBytes(IV);
byte[] byteArray = Convert.FromBase64String(encryptStr);

string decrypt = null;
Rijndael aes = Rijndael.Create();
try
{
using (MemoryStream mStream = new MemoryStream())
{
using (CryptoStream cStream = new CryptoStream(mStream, aes.CreateDecryptor(bKey, bIV), CryptoStreamMode.Write))
{
cStream.Write(byteArray, 0, byteArray.Length);
cStream.FlushFinalBlock();
decrypt = Encoding.UTF8.GetString(mStream.ToArray());
}
}
}
catch { }
aes.Clear();

return decrypt;
}
}
}

三、MD5与SHA128、256...散列


  MD5和SHA1散列通常被用于密码中,很多人称其为散列算法,实际上它正确应该叫做散列算法。散列是不可逆的,也就是没有了"解密"这个说法。

  下面给出MD5与SHA128散列的.Net的System.Web快速实现版:


using System;
using System.Text;
using System.IO;

namespace 开发测试
{
class Program
{
static void Main(string[] args)
{
string user = MD5("admin");
string pass = MD5("999999");

Console.WriteLine(user);
Console.WriteLine(pass);

string user2 = SHA1("admin");
string pass2 = SHA1("999999");

Console.WriteLine(user2);
Console.WriteLine(pass2);

Console.ReadLine();
}

//32位大写MD5散列
public static string MD5(string str)
{
return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").ToUpper();
}

//大写SHA1散列
public static string SHA1(string str)
{
return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "SHA1").ToUpper();
}
}
}

  全面版:


using System;
using System.Text;
using System.IO;
using System.Security.Cryptography;

namespace 开发测试
{
class Program
{
static void Main(string[] args)
{
string user = MD5("admin");
string pass = MD5("999999");

Console.WriteLine(user);
Console.WriteLine(pass);

string user2 = SHA128("admin");
string pass2 = SHA128("999999");

Console.WriteLine(user2);
Console.WriteLine(pass2);

string user3 = SHA256("admin");
string pass3 = SHA256("999999");

Console.WriteLine(user3);
Console.WriteLine(pass3);

string user4 = SHA384("admin");
string pass4 = SHA384("999999");

Console.WriteLine(user4);
Console.WriteLine(pass4);

string user5 = SHA512("admin");
string pass5 = SHA512("999999");

Console.WriteLine(user5);
Console.WriteLine(pass5);

Console.ReadLine();
}

//16字节,128位
public static string MD5(string str)
{
byte[] buffer = Encoding.UTF8.GetBytes(str);
MD5CryptoServiceProvider MD5 = new MD5CryptoServiceProvider();
byte[] byteArr = MD5.ComputeHash(buffer);
return BitConverter.ToString(byteArr);
}

//20字节,160位
public static string SHA128(string str)
{
byte[] buffer = Encoding.UTF8.GetBytes(str);
SHA1CryptoServiceProvider SHA1 = new SHA1CryptoServiceProvider();
byte[] byteArr = SHA1.ComputeHash(buffer);
return BitConverter.ToString(byteArr);
}

//32字节,256位
public static string SHA256(string str)
{
byte[] buffer = Encoding.UTF8.GetBytes(str);
SHA256CryptoServiceProvider SHA256 = new SHA256CryptoServiceProvider();
byte[] byteArr = SHA256.ComputeHash(buffer);
return BitConverter.ToString(byteArr);
}

//48字节,384位
public static string SHA384(string str)
{
byte[] buffer = Encoding.UTF8.GetBytes(str);
SHA384CryptoServiceProvider SHA384 = new SHA384CryptoServiceProvider();
byte[] byteArr = SHA384.ComputeHash(buffer);
return BitConverter.ToString(byteArr);
}

//64字节,512位
public static string SHA512(string str)
{
byte[] buffer = Encoding.UTF8.GetBytes(str);
SHA512CryptoServiceProvider SHA512 = new SHA512CryptoServiceProvider();
byte[] byteArr = SHA512.ComputeHash(buffer);
return BitConverter.ToString(byteArr);
}
}
}

.Net 加密 哈希,布布扣,bubuko.com

时间: 2024-10-14 11:14:29

.Net 加密 哈希的相关文章

证明与计算(5): 从加密哈希函数到一致性哈希

目录: ** 0x01 [哈希函数] vs [加密哈希函数] ** 0x02 [哈希碰撞] vs [生日问题] ** 0x03 [哈希表] vs [分布式哈希表] ** 0x04 [欧式距离] vs [三角不等式] ** 0x05 [异或距离] vs [前缀路由表] 0x01 [哈希函数] vs [加密哈希函数] 在哈希表计算索引的时候,我们需要一个哈希函数,通过hash(key)来计算key在哈希表里的index.这个地方的哈希函数只要尽量满足均匀分布,周期尽量大,计算速度又足够快等即可.而在

加密概述

加密可以帮助保护数据不被查看和修改,并且可以帮助在本不安全的信道上提供安全的通信方式.例如,可以使用加密算法对数据进行加密,在加密状态下传输数据,然后由预定的接收方对数据进行解密.如果第三方截获了加密的数据,解密数据是很困难的. 在一个使用加密的典型场合中,双方(小红和小明)在不安全的信道上通信.小红和小明想要确保任何可能正在侦听的人无法理解他们之间的通信.而且,由于小红和小明相距遥远,因此小红必须确保她从小明处收到的信息没有在传输期间被任何人修改.此外,她必须确定信息确实是发自小明而不是有人模

Node.js v0.10.31API手册-加密

加密(Crypto) 使用 require('crypto') 来调用该模块. crypto模块提供在HTTPS或HTTP连接中封装安全凭证的方法. 它提供OpenSSL中的一系列哈希方法,包括hmac.cipher.decipher.签名和验证等方法的封装. crypto.getCiphers() 返回一个数组,包含支持的加密算法的名字. 示例: var ciphers = crypto.getCiphers(); console.log(ciphers); // ['AES-128-CBC'

数据的加密和解密

当前网络环境中,数据的来往是十分密切,面对着海量的信息集合,很少有人去考虑如何去保证,或者说数据是怎么被保证安全的到达目的地的,在默认情况下,数据的发送是明文发送的,也就是说,数据的发送可以被除发送方和接收方的第三方所截获,读取信息,或者通过长年累月的数据量分析得出发送方的某些重要信息,这对于用户来说都是不可接受的,所以随着网络数据的不断发展,人们不断对数据加密进行更新换代,由一开始的传统加密,通过替换的方式加密信息,到后来的块加密算法: 现在的加密算法,如对称加密,公钥加密,作为一段时期的主要

Node.js v0.10.31API手冊-加密

Node.js v0.10.31API手冊-文件夹 加密(Crypto) 使用 require('crypto') 来调用该模块. crypto模块提供在HTTPS或HTTP连接中封装安全凭证的方法. 它提供OpenSSL中的一系列哈希方法,包含hmac.cipher.decipher.签名和验证等方法的封装. crypto.getCiphers() 返回一个数组,包括支持的加密算法的名字. 演示样例: var ciphers = crypto.getCiphers(); console.log

互联网服务器的实现过程需要考虑哪些安全问题 &amp; 加解密及哈希知识点

http://www.cnblogs.com/charlesblc/p/6341265.html 其中的一篇. 参考 https://zhuanlan.zhihu.com/p/20336461?refer=auxten 网络编程(四):互联网中TCP Socket服务器的实现过程需要考虑哪些安全问题? 在Internet环境下,安全问题我主要分为如下几类: 信息传输过程中被黑客窃取 服务器自身的安全 服务端数据的安全 首先,如果能用https,就尽量用https,能用nginx等常见服务器,就用

建立简单的哈希表

#include<stdio.h> #include <stdlib.h> unsigned int SDBMHash(char *str) { unsigned int hash = 0; while (*str) { // equivalent to: hash = 65599*hash + (*str++); hash = (*str++) + (hash << 6) + (hash << 16) - hash; } return (hash &

.NET加密方式解析--散列加密

在现代社会中,信息安全对于每一个人都是至关重要的,例如我们的银行账户安全.支付宝和微信账户安全.以及邮箱等等,说到信息安全,那就必须得提到加密技术,至于加密的一些相关概念,在这里就不说了. 这一次将会主要讲解.NET的加密方式,接下来将会分别介绍散列加密,对称加密,非对称加密等等加密方式在.NET中的应用,本文主要讲解散列加密在.NET中的应用实例. 一.DotNet散列算法概述 说到散列应该都不会陌生,并且首先都会想到MD5加密,但是对于散列更加深入的了解,恐怕知道的人就不会那么多了.散列算法

哈希算法集锦

因为工作原因,看了一下redis的底层实现,发现redis底层使用的哈希算法是murmurhash,第一次听说这个算法感觉自己对哈希值计算的常用算法了解太少,整理了一下网上讲的比较原理性的观点: 简介   哈稀函数按照定义可以实现一个伪随机数生成器(PRNG),从这个角度可以得到一个公认的结论:哈希函数之间性能的比较可以通过比较其在伪随机生成方面的比较来衡量. 一些常用的分析技术,例如泊松分布可用于分析不同的哈希函数对不同的数据的碰撞率(collision rate).一般来说,对任意一类的数据