原文地址:http://docode.top/Article/Detail/10003

目录:

1、.Net(C#)平台下Des加密解密源代码

2、.Net(C#)平台下Aes加密解密源代码

3、.Net(C#)平台下Sha1加密解密源代码

4、.Net(C#)平台下MD5加密解密源代码

5、总结

一、.Net(C#)平台下Des加密解密源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
public class DesEncryptHelper
{
    /// <summary>
    /// Des默认密钥向量
    /// </summary>
    public static string DesIv
    {
        get
        {
            return "20160602";  // 此处可自定义,8个字符长度
        }
    }
 
    /// <summary>
    /// Des加解密钥必须8位
    /// </summary>
    public static string DesKey
    {
        get
        {
            return "20160602";  // 此处可自定义,8个字符长度
        }
    }
 
    /// <summary>
    /// 获取Des8位密钥
    /// </summary>
    /// <param name="key">Des密钥字符串</param>
    /// <param name="encoding">编码类型</param>
    /// <returns>Des8位密钥</returns>
    static byte[] GetDesKey(string key, Encoding encoding)
    {
        if (string.IsNullOrEmpty(key))
        {
            throw new ArgumentNullException("key", "Des密钥不能为空");
        }
        if (key.Length > 8)
        {
            key = key.Substring(0, 8);
        }
        if (key.Length < 8)
        {
            // 不足8补全
            key = key.PadRight(8, '0');
        }
        return encoding.GetBytes(key);
    }
 
    /// <summary>
    /// Des加密
    /// </summary>
    /// <param name="source">源字符串</param>
    /// <param name="encoding">编码类型</param>
    /// <returns>加密后的字符串</returns>
    public string EncryptDes(string source, Encoding encoding = null)
    {
        return EncryptDes(source, DesKey, DesIv, encoding);
    }
 
    /// <summary>
    /// Des加密
    /// </summary>
    /// <param name="source">源字符串</param>
    /// <param name="key">des密钥,长度必须8位</param>
    /// <param name="iv">密钥向量</param>
    /// <param name="encoding">编码类型</param>
    /// <returns>加密后的字符串</returns>
    public static string EncryptDes(string source, string key, string iv, Encoding encoding = null)
    {
        if (encoding == null) encoding = Encoding.UTF8;
 
        byte[] rgbKeys = GetDesKey(key, encoding),
                rgbIvs = GetDesKey(iv, encoding),
                inputByteArray = encoding.GetBytes(source);
        using (DESCryptoServiceProvider desProvider = new DESCryptoServiceProvider())
        {
            using (MemoryStream memoryStream = new MemoryStream())
            {
                using (CryptoStream cryptoStream = new CryptoStream(memoryStream, 
                desProvider.CreateEncryptor(rgbKeys, rgbIvs), CryptoStreamMode.Write))
                {
                    cryptoStream.Write(inputByteArray, 0, inputByteArray.Length);
                    // 1.第一种
                    cryptoStream.FlushFinalBlock();
                    cryptoStream.Close();
                    memoryStream.Flush();
                    memoryStream.Close();
                    desProvider.Clear();
                    string result = Convert.ToBase64String(memoryStream.ToArray());
                    return result;
 
                    // 2.第二种
                    //StringBuilder result = new StringBuilder();
                    //foreach (byte b in memoryStream.ToArray())
                    //{
                    //    result.AppendFormat("{0:X2}", b);
                    //}
                    //cryptoStream.FlushFinalBlock();
                    //cryptoStream.Close();
                    //memoryStream.Flush();
                    //memoryStream.Close();
                    //desProvider.Clear();
                    //return result.ToString();
                }
            }
        }
    }
 
    /// <summary>
    /// Des解密
    /// </summary>
    /// <param name="source">源字符串</param>
    /// <param name="encoding">编码类型</param>
    /// <returns>解密后的字符串</returns>
    public static string DecryptDes(string source, Encoding encoding = null)
    {
        return DecryptDes(source, DesKey, DesIv, encoding);
    }
 
    /// <summary>
    /// Des解密
    /// </summary>
    /// <param name="source">源字符串</param>
    /// <param name="key">des密钥,长度必须8位</param>
    /// <param name="iv">密钥向量</param>
    /// <param name="encoding">编码类型</param>
    /// <returns>解密后的字符串</returns>
    public static string DecryptDes(string source, string key, string iv, Encoding encoding = null)
    {
        if (encoding == null) encoding = Encoding.UTF8;
 
        byte[] rgbKeys = GetDesKey(key, encoding),
                rgbIvs = GetDesKey(iv, encoding),
                inputByteArray = Convert.FromBase64String(source);
        using (DESCryptoServiceProvider desProvider = new DESCryptoServiceProvider())
        {
            using (MemoryStream memoryStream = new MemoryStream())
            {
                using (CryptoStream cryptoStream = new CryptoStream(memoryStream, 
                desProvider.CreateDecryptor(rgbKeys, rgbIvs), CryptoStreamMode.Write))
                {
                    cryptoStream.Write(inputByteArray, 0, inputByteArray.Length);
                    cryptoStream.FlushFinalBlock();
                    cryptoStream.Close();
                    memoryStream.Flush();
                    memoryStream.Close();
                    desProvider.Clear();
                    byte[] result = memoryStream.ToArray();
                    return encoding.GetString(result);
                }
            }
        }
    }
}

二、.Net(C#)平台下Aes加密解密源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
public class AesEncryptHelper
{
    /// <summary>
    /// Aes加解密钥必须32位
    /// </summary>
    public static string AesKey
    {
        get
        {
            return "asekey32w"; // 此处可自定义,32个字符长度
        }
    }
 
    /// <summary>
    /// 获取Aes32位密钥
    /// </summary>
    /// <param name="key">Aes密钥字符串</param>
    /// <param name="encoding">编码类型</param>
    /// <returns>Aes32位密钥</returns>
    static byte[] GetAesKey(string key, Encoding encoding)
    {
        if (string.IsNullOrEmpty(key))
        {
            throw new ArgumentNullException("key", "Aes密钥不能为空");
        }
        if (key.Length < 32)
        {
            // 不足32补全
            key = key.PadRight(32, '0');
        }
        if (key.Length > 32)
        {
            key = key.Substring(0, 32);
        }
        return encoding.GetBytes(key);
    }
 
    /// <summary>
    /// Aes加密
    /// </summary>
    /// <param name="source">源字符串</param>
    /// <returns>加密后的字符串</returns>
    public static string EncryptAes(string source)
    {
        return EncryptAes(source, AesKey);
    }
 
    /// <summary>
    /// Aes加密
    /// </summary>
    /// <param name="source">源字符串</param>
    /// <param name="key">aes密钥,长度必须32位</param>
    /// <param name="model">运算模式</param>
    /// <param name="padding">填充模式</param>
    /// <param name="encoding">编码类型</param>
    /// <returns>加密后的字符串</returns>
    public static string EncryptAes(string source, string key, CipherMode model = CipherMode.ECB, 
    PaddingMode padding = PaddingMode.PKCS7, Encoding encoding = null)
    {
        if (encoding == null) encoding = Encoding.UTF8;
 
        using (AesCryptoServiceProvider aesProvider = new AesCryptoServiceProvider())
        {
            aesProvider.Key = GetAesKey(key, encoding);
            aesProvider.Mode = model;
            aesProvider.Padding = padding;
            using (ICryptoTransform cryptoTransform = aesProvider.CreateEncryptor())
            {
                byte[] inputBuffers = encoding.GetBytes(source),
                    results = cryptoTransform.TransformFinalBlock(inputBuffers, 0, inputBuffers.Length);
                aesProvider.Clear();
                return Convert.ToBase64String(results, 0, results.Length);
            }
        }
    }
 
    /// <summary>
    /// Aes解密
    /// </summary>
    /// <param name="source">源字符串</param>
    /// <returns>解密后的字符串</returns>
    public static string DecryptAes(string source)
    {
        return DecryptAes(source, AesKey);
    }
 
    /// <summary>
    /// Aes解密
    /// </summary>
    /// <param name="source">源字符串</param>
    /// <param name="key">aes密钥,长度必须32位</param>
    /// <param name="model">运算模式</param>
    /// <param name="padding">填充模式</param>
    /// <param name="encoding">编码类型</param>
    /// <returns>解密后的字符串</returns>
    public static string DecryptAes(string source, string key, CipherMode model = CipherMode.ECB, 
    PaddingMode padding = PaddingMode.PKCS7, Encoding encoding = null)
    {
        if (encoding == null) encoding = Encoding.UTF8;
 
        using (AesCryptoServiceProvider aesProvider = new AesCryptoServiceProvider())
        {
            aesProvider.Key = GetAesKey(key, encoding);
            aesProvider.Mode = model;
            aesProvider.Padding = padding;
            using (ICryptoTransform cryptoTransform = aesProvider.CreateDecryptor())
            {
                byte[] inputBuffers = Convert.FromBase64String(source);
                byte[] results = cryptoTransform.TransformFinalBlock(inputBuffers, 0, inputBuffers.Length);
                aesProvider.Clear();
                return encoding.GetString(results);
            }
        }
    }
}

三、.Net(C#)平台下Sha1加密解密源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/// <summary>
/// 对字符串SHA1加密
/// </summary>
/// <param name="source">源字符串</param>
/// <param name="encoding">编码类型</param>
/// <returns>加密后的十六进制字符串</returns>
public static string Sha1Encrypt(string source, Encoding encoding = null)
{
    if (encoding == null) encoding = Encoding.UTF8;
 
    // 第一种方式
    byte[] byteArray = encoding.GetBytes(source);
    using (HashAlgorithm hashAlgorithm = new SHA1CryptoServiceProvider())
    {
        byteArray = hashAlgorithm.ComputeHash(byteArray);
        StringBuilder stringBuilder = new StringBuilder(256);
        foreach (byte item in byteArray)
        {
            stringBuilder.AppendFormat("{0:x2}", item);
        }
        hashAlgorithm.Clear();
        return stringBuilder.ToString();
    }
 
    //// 第二种方式
    //using (SHA1 sha1 = SHA1.Create())
    //{
    //    byte[] hash = sha1.ComputeHash(encoding.GetBytes(source));
    //    StringBuilder stringBuilder = new StringBuilder();
    //    for (int index = 0; index < hash.Length; ++index)
    //        stringBuilder.Append(hash[index].ToString("x2"));
    //    sha1.Clear();
    //    return stringBuilder.ToString();
    //}
}

四、.Net(C#)平台下MD5加密解密源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/// <summary>
/// 对字符串md5加密
/// </summary>
/// <param name="source">源字符串</param>
/// <param name="encoding">编码类型</param>
/// <returns>加密后的十六进制字符串</returns>
public static string Md5Encrypt(string source, Encoding encoding = null)
{
    if (encoding == null) encoding = Encoding.UTF8;
 
    byte[] byteArray = encoding.GetBytes(source);
    using (HashAlgorithm hashAlgorithm = new MD5CryptoServiceProvider())
    {
        byteArray = hashAlgorithm.ComputeHash(byteArray);
        StringBuilder stringBuilder = new StringBuilder();
        foreach (byte item in byteArray)
        {
            stringBuilder.AppendFormat("{0:x2}", item);
        }
        hashAlgorithm.Clear();
        return stringBuilder.ToString();
    }
}

五、总结:

1、.Net(C#)加密解密使用的类均存在System.Security.Cryptography命名空间下,使用时需先引用。

2、.Net(C#)加密解密类或者其父类都实现IDispose接口,因此需要通过using包裹起来(或者采用.net异常处理机制try catch finally),在使用完后销毁对象。

扫一扫获取百度网盘超级vip账号

【转】asp.net(c#)加密解密算法之sha1、md5、des、aes实现源码详解的更多相关文章

  1. 数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解

    数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解 对数组有不了解的可以先看看我的另一篇文章,那篇文章对数组有很多详细的解析,而本篇文章则着重讲动态数组,另一篇文章链接 ...

  2. 数据结构与算法系列2 线性表 链表的分类+使用java实现链表+链表源码详解

    数据结构与算法系列2.2 线性表 什么是链表? 链表是一种物理存储单元上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表的链接次序实现的一系列节点组成,节点可以在运行时动态生成,每个节点包括两个 ...

  3. 结合OPENSIFT源码详解SIFT算法

    平台:win10 x64 +VS 2015专业版 +opencv-2.4.11 + gtk_-bundle_2.24.10_win32 参考博客:https://www.cnblogs.com/cql ...

  4. java 基础数据结构源码详解及数据结构算法

    http://www.cnblogs.com/skywang12345/category/455711.html http://www.cnblogs.com/liqiu/p/3302607.html

  5. ASP.NET常用加密解密方法

    ASP.NET常用加密解密方法 一.MD5加密解密 1.加密 C# 代码           public static string ToMd5(string clearString)        ...

  6. 兼容javascript和C#的RSA加密解密算法,对web提交的数据进行加密传输

    Web应用中往往涉及到敏感的数据,由于HTTP协议以明文的形式与服务器进行交互,因此可以通过截获请求的数据包进行分析来盗取有用的信息.虽然https可以对传输的数据进行加密,但是必须要申请证书(一般都 ...

  7. 一组PHP可逆加密解密算法

    对于大部分密码加密,我们可以采用md5.sha1等方法.可以有效防止数据泄露,但是这些方法仅适用于无需还原的数据加密. 对于需要还原的信息,则需要采用可逆的加密解密算法. 下面一组PHP函数是实现此加 ...

  8. RC4加密解密算法

    RC4相对是速度快.安全性高的加密算法.在实际应用中,我们可以对安全系数要求高的文本进行多重加密,这样破解就有一定困难了.如下测试给出了先用RC4加密,然后再次用BASE64编码,这样双重锁定,保证数 ...

  9. java 实现 DES加密 解密算法

    DES算法的入口参数有三个:Key.Data.Mode.其中Key为8个字节共64位,是DES算法的工作密钥:Data也为8个字节64位,是要被加密或被解密的数据:Mode为DES的工作方式,有两种: ...

随机推荐

  1. 电子商务网站SQL注入项目实战一例

    故事A段:发现整站SQL对外输出: 有个朋友的网站,由于是外包项目,深圳某公司开发的,某天我帮他检测了一下网站相关情况. 我查看了页面源代码,发现了个惊人的事情,竟然整站打印SQL到Html里,着实吓 ...

  2. 细数iOS上的那些安全防护

    细数iOS上的那些安全防护  龙磊,黑雪,蒸米 @阿里巴巴移动安全 0x00 序 随着苹果对iOS系统多年的研发,iOS上的安全防护机制也是越来越多,越来越复杂.这对于刚接触iOS安全的研究人员来说非 ...

  3. 论如何在手机端web前端实现自定义原生控件的样式

    手机开发webapp的同学一定遇到过这样问题,如何为丑极了的手机元素应用自定义的样式.首先,要弄清楚为什么要定义手机原生控件的样式,就需要看看手机的那些原生框样式的丑陋摸样: android: ios ...

  4. 仅此一文让你明白ASP.NET MVC 之View的显示(仅此一文系列二)

    题外话 一周之前写的<仅此一文让你明白ASP.NET MVC原理>受到了广大学习ASP.NET MVC同学的欢迎,于是下定决心准备把它写成一个系列,以满足更多求知若渴的同学们.蒋金楠老师已 ...

  5. 我为什么很烦在DB服务器上安装杀毒软件

    常见的数据库连接问题无外乎是在数据库服务器本地可以连接SQL Server,但通过其他服务器就不可以连接.但这次我却碰到了相反的情况,在服务器本地无法通过IP/实例名连接,但从其他服务器却可以.而且每 ...

  6. Oracle没有WM_CONCAT函数的解决办法

    WM_CONCAT是oracle的非公开函数,并不鼓励使用,新版本oracle并没有带此函数,需要手工加上. 1.下载三个文件:owmctab.plb  . owmaggrs.plb . owmagg ...

  7. 关于laravel 5.3 使用redis缓存出现 找不到Class 'Predis\Client' not found的问题

    昨天使用5.3.版本的laravel框架开发公司新项目, 发现将cache和session设置为了redis,执行了一下首页访问. 如图: laravel 版本号 简单配置一下控制器路由, Route ...

  8. SSISDB3:Environments 和 Environment Variables

    Environment 是ETL执行时使用的Parameters的集合,可以为一个Project引用不同的Environment variables,从而改变ETL执行的属性. 查看Environme ...

  9. 【Win 10应用开发】多窗口视图

    Windows App一般情况下,同一时刻只能有一个应用程序实例在运行,为了在特殊需求下可以同时呈现不同的UI,SDK提供了多视图操作支持. 应用程序可以创建新的应用视图,以新的视图为基础可以呈现与主 ...

  10. jQuery 2.0.3 源码分析 回溯魔法 end()和pushStack()

    了解了jQuery对DOM进行遍历背后的工作机制,可以在编写代码时有意识地避免一些不必要的重复操作,从而提升代码的性能 从这章开始慢慢插入jQuery内部一系列工具方法的实现 关于jQuery对象的包 ...