博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】asp.net(c#)加密解密算法之sha1、md5、des、aes实现源码详解
阅读量:6811 次
发布时间:2019-06-26

本文共 9589 字,大约阅读时间需要 31 分钟。

原文地址:

目录:

1、

2、

3、

4、

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账号

转载于:https://www.cnblogs.com/GodX/p/5669665.html

你可能感兴趣的文章
AgileEAS.NET平台开发Step By Step系列-药店系统-索引
查看>>
黑盒测试难还是白盒测试难?
查看>>
jQuery CSS 函数
查看>>
Stanford coursera Andrew Ng 机器学习课程编程作业(Exercise 2)及总结
查看>>
字符输出流Writer简要概括
查看>>
ASP.NET MVC5+EF6+EasyUI 后台管理系统(53)-工作流设计-我的批阅
查看>>
Centos 学习大纲
查看>>
我们前端跟后端是怎么合作的
查看>>
我的第一个Chrome扩展
查看>>
线偏移处理参数说明
查看>>
Web Services Introduction
查看>>
快速排序算法之所有版本的c/c++实现
查看>>
linux进程的休眠(等待队列)【转】
查看>>
Git学习系列之Git基本操作克隆项目(图文详解)
查看>>
Makefile学习之make 的运行【转】
查看>>
今天有点爽
查看>>
QTP的那些事--场景恢复的使用(加入场景恢复却不起作用)
查看>>
Asp.net MVC 2 使用Areas功能的常见错误
查看>>
linux系统性能分析
查看>>
《PHP对象、模式与实践》之对象
查看>>