1 可逆加密(Encryption)方式和哈希(Hash)加密方式的区别:
1、可逆加密(Encryption)是可逆的,即明码和加密码之间通过操作是可以相互转换;哈希(Hash)加密方式是不可逆的,哈希(Hash)加密方式一般会导致信息熵减小,即使用哈希(Hash)加密方式转换后可能导致,转换明码是原明码中的一段。
2、可逆加密(Encryption)的密码会随着明码的长度进行改变;而哈希(Hash)加密方式密码的长度是固定的,且只取决于所使用的算法,当明码的长度大于算法中所规则的长度时,哈希(Hash)加密方式会把明码截断后进行加密操作,这也是导致哈希(Hash)加密方式不可逆的与信息熵减小的根本原因。
3、应用场景:一般情况下用户密码加密操作使用可逆加密(Encryption)方式;哈希(Hash)加密方式(一般用于数字签名、数据校验(CRC、SHA、MD5),据说HTTPS协议运行所需要的CA证书就是使用哈希(Hash)算法生成的。
4、哈希(Hash)加密方式无解密操作,即哈希(Hash)加密方式是不能被解密的,如果用户输入的密码经过哈希(Hash)加密方式加密后的加密字符串与原加密字符相等,则用户通过验证,可以登录。了。
2 Core.Domain.Users.PasswordFormat
namespace Core.Domain.Users
{
/// <summary>
/// 【加密方式--枚举】
/// <remarks>
/// 摘要:
/// 该枚举定义了3种加密方式,通过枚举实例选定其中的1种加密方式,对所输入的密码字符串进行加/密操作。
/// </remarks>
/// </summary>
public enum PasswordFormat
{
/// <summary>
/// 【清除】
/// <remarks>
/// 摘要:
/// 不对输入的密码字符串进行加密操作(即明码,输入密码字符串与持久化到相应字段中的字符串相同)。
/// </remarks>
/// </summary>
Clear = 0,
/// <summary>
/// 【哈希】
/// <remarks>
/// 摘要:
/// 使用哈希加密方式,对输入的密码字符串进行加密操作(注意在使用哈希加密方式时,输入的密码(明码)字符串的长度,要小于等于所使用算法的长度,否则会由于信息熵减小,而导至不解密不一致)。
/// </remarks>
/// </summary>
Hashed = 1,
/// <summary>
/// 【可逆加密】
/// <remarks>
/// 摘要:
/// 使用可逆加密方的方式,对输入的密码字符串进行加密操作。
/// </remarks>
/// </summary>
Encrypted = 2
}
}
3 Core.Domain.Users.UsersPassword
namespace Core.Domain.Users
{
/// <summary>
/// 【用户密码--类】
/// <remarks>
/// 摘要:
/// 该类中的属性成员实例存储着指定的加密方式及其密钥,为用户输入密码的加密操作提供实例支撑,最后还把加密后的密码字符串存储到该类的属性成员实例中。
/// </remarks>
/// </summary>
public class UsersPassword
{
#region 拷贝构造方法
/// <summary>
/// 【拷贝构造方法】
/// <remarks>
/// 摘要:
/// 通过拷贝构造方法设定当前对用户密码的默认加密方式为明码,即不加密。
/// </remarks>
/// </summary>
public UsersPassword()
{
PasswordFormat = PasswordFormat.Clear;
}
#endregion
#region 属性
/// <summary>
/// 【密码】
/// <remarks>
/// 摘要:
/// 获取/设置经过指定加密方式加密后的密码字符串。
/// </remarks>
/// </summary>
public string Password { get; set; }
/*
可逆加密(Encryption)方式和哈希(Hash)加密方式的区别:
1、可逆加密(Encryption)是可逆的,即明码和加密码之间通过操作是可以相互转换;哈希(Hash)加密方式是不可逆的,哈希(Hash)加密方式一般会导致信息熵减小,即使用哈希(Hash)加密方式转换后可能导致,转换明码是原明码中的一段。
2、可逆加密(Encryption)的密码会随着明码的长度进行改变;而哈希(Hash)加密方式密码的长度是固定的,且只取决于所使用的算法,当明码的长度大于算法中所规则的长度时,哈希(Hash)加密方式会把明码截断后进行加密操作,这也是导致哈希(Hash)加密方式不可逆的与信息熵减小的根本原因。
3、应用场景:一般情况下用户密码加密操作使用可逆加密(Encryption)方式;哈希(Hash)加密方式(一般用于数字签名、数据校验(CRC、SHA、MD5),据说HTTPS协议运行所需要的CA证书就是使用哈希(Hash)算法生成的。
4、哈希(Hash)加密方式无解密操作,即哈希(Hash)加密方式是不能被解密的,如果用户输入的密码经过哈希(Hash)加密方式加密后的加密字符串与原加密字符相等,则用户通过验证,可以登录了。
*/
/// <summary>
/// 【哈希密钥】
/// <remarks>
/// 摘要:
/// 获取/设置哈希(Hash)加密方式所需的密钥字符串(默认:5个字符的字符串)。
/// 说明:
/// 使用哈希加密方式对用户的密进行加密操作时,所使用的密钥字符串。
/// </remarks>
/// </summary>
public string PasswordSalt { get; set; }
/// <summary>
/// 【哈希密钥长度】
/// <remarks>
/// 摘要:
/// 设定哈希(Hash)加密方式所需密钥字符串长度的整型值。
/// 说明:
/// 当使用哈希方式对用户的密进行加密操作进行加密操作时,设定密钥字符串的长度值为:5个字符。
/// </remarks>
/// </summary>
public static int PasswordSaltKeySize => 5;
/// <summary>
/// 【哈希加密默认编码格式】
/// <remarks>
/// 摘要:
/// 设定哈希加密算法名称的字符串常量(默认:以最高安全性及其最大长度的"SHA512"加密算法,对用户的密码进行加密操作。)。
/// </remarks>
/// </summary>
public static string DefaultHashedPasswordFormat => "SHA512";
/// <summary>
/// 【可逆加密(Encryption)密钥】
/// <remarks>
/// 摘要:
/// 设定可逆加密密钥的字符串常量(默认:16个字符的高安全性数字型字符串)。
/// 说明:
/// 使用可逆加密(Encryption)方式对用户的密进行加密操作时,所使用的密钥字符串。
/// </remarks>
/// </summary>
public static string EncryptionKey => CommonHelper.GenerateRandomDigitCode(16);
/// <summary>
/// 【加密方式编号】
/// <remarks>
/// 摘要:
/// 1个指定编号值,通过该编号值获取/设置加密方式枚举的1个指定实例。
/// </remarks>
/// </summary>
public int PasswordFormatId { get; set; }
/// <summary>
/// 【加密方式】
/// <remarks>
/// 摘要:
/// 获取/设置加密方式枚举的1个指定实例。
/// </remarks>
/// </summary>
public PasswordFormat PasswordFormat
{
get => (PasswordFormat)PasswordFormatId;
set => PasswordFormatId = (int)value;
}
/// <summary>
/// 【默认加密方式】
/// <remarks>
/// 摘要:
/// 设定哈希加密方式对用户密码进行加/解密操作。
/// </remarks>
/// </summary>
public static PasswordFormat DefaultPasswordFormat => PasswordFormat.Hashed;
#endregion
}
}
4 Services.Security.IEncryptionService
namespace Services.Security
{
/// <summary>
/// 【加密服务--类】
/// <remarks>
/// 摘要:
/// 继承于该接口的具体实现类中的方法成员实现了哈希和可逆两种加/解密操作方式,为用户输入的密码进行加/解密提供相应的方法支撑。
/// </remarks>
/// </summary>
public interface IEncryptionService
{
#region 方法
/// <param name="size">一个指定字节数组实例长度的整型值。</param>
/// <summary>
/// 【生成密钥】
/// <remarks>
/// 摘要:
/// 生成哈希(Hash)加密方式所需的密钥字符串(默认:5个字符的字符串),为哈希加/解密操作提供数据支撑。
/// <returns>
/// 返回:
/// 哈希(Hash)加密方式所需的密钥字符串(默认:5个字符的字符串)。
/// </returns>
/// </remarks>
/// </summary>
string CreateSaltKey(int size);
/// <param name="password">一个指定的需要被加密码(明码)字符串。</param>
/// <param name="saltKey">一只用于哈希加密方式的密钥字符串。</param>
/// <param name="passwordFormat">1个指定的哈希加密算法的名称(SHA-224、SHA-256、SHA-384,和 SHA-512等)。</param>
/// <summary>
/// 【哈希方式生成密码】
/// <remarks>
/// 摘要:
/// 通对哈希加密算法方式对指定的密码字符进行加密操作,最后返回一个加密后的密码字符串(该加密字符串定长,长度由算法名称决定)。
/// </remarks>
/// <returns>
/// 返回:
/// 一个经过哈希加密算法加密后的密码字符串(该加密字符串定长,长度由算法名称决定)。
/// </returns>
/// </summary>
string CreatePasswordHash(string password, string saltKey, string passwordFormat);
/// <param name="plainText">一个指定的需要被加密码(明码)字符串。</param>
/// <param name="encryptionPrivateKey">一只用于可逆加密方式的密钥字符串,默认值为:空字符中,即无密钥字符串。</param>
/// <summary>
/// 【文本可逆加密】
/// <remarks>
/// 摘要:
/// 通对称加密方方式对指定的密码(明码)字符进行加密操作,最后返回加密后的字符串。
/// 对称加密方方式:
/// 对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码)。因此,通信双方都必须获得这把钥匙,并保持钥匙的秘密。
/// 单钥密码系统的安全性依赖于以下两个因素:
/// 第一、加密算法必须是足够强的,仅仅基于密文本身去解密信息在实践上是不可能的。
/// 第二、加密方法的安全性依赖于密钥的秘密性,而不是算法的秘密性,因此,我们没有必要确保算法的秘密性(事实上,现实中使用的很多单钥密码系统的算法都是公开的),但是我们一定要保证密钥的秘密性。
/// DES(Data Encryption Standard)和TripleDES是对称加密的两种实现。
/// DES和TripleDES基本算法一致,只是TripleDES算法提供的key位数更多,加密可靠性更高。
/// DES使用的密钥key为8字节,初始向量IV也是8字节。
/// TripleDES:
/// 1、Triple DES又称3DES,是 DES 加密算法的一种模式,它使用3条56位的 密钥对3DES数据进行三次加密。 数据加密标准(DES)是美国的一种由来已久的加密标准,
/// 它使用对称密钥加密法,并于1981年被 ANSI组织规范为ANSI X.3.92。DES使用56位密钥和密码块的方法,而在密码块的方法中,文本被分成64位大小的文本块然后再进行加密。比起最初的DES,3DES更为安全
/// 2、TripleDES使用24字节的key,初始向量IV也是8字节。
/// 3、两种算法都是以8字节为一个块进行加密,一个数据块一个数据块的加密,一个8字节的明文加密后的密文也是8字节。如果明文长度不为8字节的整数倍,添加值为0的字节凑满8字节整数倍。所以加密后的密文长度一定为8字节的整数倍。
/// 注意:
/// 当前程序通过TripleDESCryptoServiceProvider的实例来定义实现加密操作,即使用TripleDES算法对输入的密码字符串进行加密操作。
/// </remarks>
/// <returns>
/// 返回:
/// 一个加密后的密码字符串。
/// </returns>
/// </summary>
string EncryptText(string plainText, string encryptionPrivateKey = "");
/// <param name="cipherText">一个指定的需要被解密码字符串。</param>
/// <param name="encryptionPrivateKey">一只用于可逆加密方式的密钥字符串,默认值为:空字符中,即无密钥字符串。</param>
/// <summary>
/// 【文本可逆解密】
/// <remarks>
/// 摘要:
/// 通对称加密方方式对指定的密码字符进行解密操作,最后返回加解后的字符串。
/// 对称加密方方式:
/// 对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码)。因此,通信双方都必须获得这把钥匙,并保持钥匙的秘密。
/// 单钥密码系统的安全性依赖于以下两个因素:
/// 第一、加密算法必须是足够强的,仅仅基于密文本身去解密信息在实践上是不可能的。
/// 第二、加密方法的安全性依赖于密钥的秘密性,而不是算法的秘密性,因此,我们没有必要确保算法的秘密性(事实上,现实中使用的很多单钥密码系统的算法都是公开的),但是我们一定要保证密钥的秘密性。
/// DES(Data Encryption Standard)和TripleDES是对称加密的两种实现。
/// DES和TripleDES基本算法一致,只是TripleDES算法提供的key位数更多,加密可靠性更高。
/// DES使用的密钥key为8字节,初始向量IV也是8字节。
/// TripleDES:
/// 1、Triple DES又称3DES,是 DES 加密算法的一种模式,它使用3条56位的 密钥对3DES数据进行三次加密。 数据加密标准(DES)是美国的一种由来已久的加密标准,
/// 它使用对称密钥加密法,并于1981年被 ANSI组织规范为ANSI X.3.92。DES使用56位密钥和密码块的方法,而在密码块的方法中,文本被分成64位大小的文本块然后再进行加密。比起最初的DES,3DES更为安全
/// 2、TripleDES使用24字节的key,初始向量IV也是8字节。
/// 3、两种算法都是以8字节为一个块进行加密,一个数据块一个数据块的加密,一个8字节的明文加密后的密文也是8字节。如果明文长度不为8字节的整数倍,添加值为0的字节凑满8字节整数倍。所以加密后的密文长度一定为8字节的整数倍。
/// 注意:
/// 当前程序通过TripleDESCryptoServiceProvider的实例来定义实现加密操作,即使用TripleDES算法对输入的密码字符串进行解密操作。
/// </remarks>
/// <returns>
/// 返回:
/// 一个解密后的密码(明码)字符串。
/// </returns>
/// </summary>
string DecryptText(string cipherText, string encryptionPrivateKey = "");
#endregion
}
}
5 Services.Security.EncryptionService
using Core;
using Core.Domain.Users;
using System.Security.Cryptography;
using System.Text;
namespace Services.Security
{
/// <summary>
/// 【加密服务--类】
/// <remarks>
/// 摘要:
/// 该类中的方法成员实现了哈希和可逆两种加/解密操作方式,为用户输入的密码进行加/解密提供相应的方法支撑。
/// </remarks>
/// </summary>
public class EncryptionService : IEncryptionService
{
#region 方法--私有/保护
/// <param name="data">一个指定的需要被加密码(明码)的字符串。</param>
/// <param name="key">一个字节数组实例,该参数实例中存储着用于指定加密方式所需的密钥。</param>
/// <param name="iv">
/// 一个字节数组实例,该参数实例中存储着用于对称算法的初始化向量。
/// 注意:
/// 初始化向量必须长 8 字节,如果它的长度大于 8 字节,则会截断它,而不会引发异常。
/// </param>
/// <remarks>
/// 摘要:
/// 通对称加密方方式对指定的密码字符进行加密操作,最后返回加密后的一个字节数组实例。
/// 对称加密方方式:
/// 对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码)。因此,通信双方都必须获得这把钥匙,并保持钥匙的秘密。
/// 单钥密码系统的安全性依赖于以下两个因素:
/// 第一、加密算法必须是足够强的,仅仅基于密文本身去解密信息在实践上是不可能的。
/// 第二、加密方法的安全性依赖于密钥的秘密性,而不是算法的秘密性,因此,我们没有必要确保算法的秘密性(事实上,现实中使用的很多单钥密码系统的算法都是公开的),但是我们一定要保证密钥的秘密性。
/// DES(Data Encryption Standard)和TripleDES是对称加密的两种实现。
/// DES和TripleDES基本算法一致,只是TripleDES算法提供的key位数更多,加密可靠性更高。
/// DES使用的密钥key为8字节,初始向量IV也是8字节。
/// TripleDES:
/// 1、Triple DES又称3DES,是 DES 加密算法的一种模式,它使用3条56位的 密钥对3DES数据进行三次加密。 数据加密标准(DES)是美国的一种由来已久的加密标准,
/// 它使用对称密钥加密法,并于1981年被 ANSI组织规范为ANSI X.3.92。DES使用56位密钥和密码块的方法,而在密码块的方法中,文本被分成64位大小的文本块然后再进行加密。比起最初的DES,3DES更为安全
/// 2、TripleDES使用24字节的key,初始向量IV也是8字节。
/// 3、两种算法都是以8字节为一个块进行加密,一个数据块一个数据块的加密,一个8字节的明文加密后的密文也是8字节。如果明文长度不为8字节的整数倍,添加值为0的字节凑满8字节整数倍。所以加密后的密文长度一定为8字节的整数倍。
/// 注意:
/// 当前程序通过TripleDESCryptoServiceProvider的实例来定义实现加密操作,即使用TripleDES算法对输入的密码字符串进行加密操作。
/// </remarks>
/// <summary>
/// 【文本可逆加密到内存】
/// <returns>
/// 返回:
/// 一个字节数组实例,该实例中存储着被加密后的密码。
/// </returns>
/// </summary>
private byte[] EncryptTextToMemory(string data, byte[] key, byte[] iv)
{
using var ms = new MemoryStream();
using (var cs = new CryptoStream(ms, TripleDES.Create().CreateEncryptor(key, iv), CryptoStreamMode.Write))
{
var toEncrypt = Encoding.Unicode.GetBytes(data);
cs.Write(toEncrypt, 0, toEncrypt.Length);
cs.FlushFinalBlock();
}
return ms.ToArray();
}
/// <param name="data">一个指定的需要被加密码的字符串。</param>
/// <param name="key">一个字节数组实例,该参数实例中存储着用于指定加密方式所需的密钥。</param>
/// <param name="iv">
/// 一个字节数组实例,该参数实例中存储着用于对称算法的初始化向量。
/// 注意:
/// 初始化向量必须长 8 字节,如果它的长度大于 8 字节,则会截断它,而不会引发异常。
/// </param>
/// <summary>
/// 【内存可逆解密到文本】
/// <remarks>
/// 摘要:
/// 把字节数组实例中的加密数据,解密为相对应的明码字符串。
/// 对称加密方方式:
/// 对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码)。因此,通信双方都必须获得这把钥匙,并保持钥匙的秘密。
/// 单钥密码系统的安全性依赖于以下两个因素:
/// 第一、加密算法必须是足够强的,仅仅基于密文本身去解密信息在实践上是不可能的。
/// 第二、加密方法的安全性依赖于密钥的秘密性,而不是算法的秘密性,因此,我们没有必要确保算法的秘密性(事实上,现实中使用的很多单钥密码系统的算法都是公开的),但是我们一定要保证密钥的秘密性。
/// DES(Data Encryption Standard)和TripleDES是对称加密的两种实现。
/// DES和TripleDES基本算法一致,只是TripleDES算法提供的key位数更多,加密可靠性更高。
/// DES使用的密钥key为8字节,初始向量IV也是8字节。
/// TripleDES:
/// 1、Triple DES又称3DES,是 DES 加密算法的一种模式,它使用3条56位的密钥对3DES数据进行三次加密。 数据加密标准(DES)是美国的一种由来已久的加密标准,
/// 它使用对称密钥加密法,并于1981年被 ANSI组织规范为ANSI X.3.92。DES使用56位密钥和密码块的方法,而在密码块的方法中,文本被分成64位大小的文本块然后再进行加密。比起最初的DES,3DES更为安全
/// 2、TripleDES使用24字节的key,初始向量IV也是8字节。
/// 3、两种算法都是以8字节为一个块进行加密,一个数据块一个数据块的加密,一个8字节的明文加密后的密文也是8字节。如果明文长度不为8字节的整数倍,添加值为0的字节凑满8字节整数倍。所以加密后的密文长度一定为8字节的整数倍。
/// 注意:
/// 当前程序通过TripleDESCryptoServiceProvider的实例来定义实现加密操作,即使用TripleDES算法对输入的密码字符串进行解密操作。
/// </remarks>
/// <returns>
/// 返回:
/// 明码字符串。
/// </returns>
/// </summary>
private string DecryptTextFromMemory(byte[] data, byte[] key, byte[] iv)
{
using var ms = new MemoryStream(data);
using var cs = new CryptoStream(ms, TripleDES.Create().CreateDecryptor(key, iv), CryptoStreamMode.Read);
using var sr = new StreamReader(cs, Encoding.Unicode);
return sr.ReadToEnd();
}
#endregion
#region 方法--接口实现
/// <param name="size">一个指定字节数组实例长度的整型值。</param>
/// <summary>
/// 【生成密钥】
/// <remarks>
/// 摘要:
/// 生成哈希(Hash)加密方式所需的密钥字符串(默认:5个字符的字符串),为哈希加/解密操作提供数据支撑。
/// <returns>
/// 返回:
/// 哈希(Hash)加密方式所需的密钥字符串(默认:5个字符的字符串)。
/// </returns>
/// </remarks>
/// </summary>
public virtual string CreateSaltKey(int size)
{
//获取高质量的随机数。
using var provider = RandomNumberGenerator.Create();
var buff = new byte[size];
provider.GetBytes(buff);
//把存储字节数组实例中的密钥,转换为字符串形式的密钥。
return Convert.ToBase64String(buff);
}
/// <param name="password">一个指定的需要被加密码(明码)字符串。</param>
/// <param name="saltKey">一只用于哈希加密方式的密钥字符串。</param>
/// <param name="passwordFormat">1个指定的哈希加密算法的名称(SHA-224、SHA-256、SHA-384,和 SHA-512等)。</param>
/// <summary>
/// 【哈希方式生成密码】
/// <remarks>
/// 摘要:
/// 通对哈希加密算法方式对指定的密码字符进行加密操作,最后返回一个加密后的密码字符串(该加密字符串定长,长度由算法名称决定)。
/// </remarks>
/// <returns>
/// 返回:
/// 一个经过哈希加密算法加密后的密码字符串(该加密字符串定长,长度由算法名称决定)。
/// </returns>
/// </summary>
public virtual string CreatePasswordHash(string password, string saltKey, string passwordFormat)
{
return HashHelper.CreateHash(Encoding.UTF8.GetBytes(string.Concat(password, saltKey)), passwordFormat);
}
/// <param name="plainText">一个指定的需要被加密码(明码)字符串。</param>
/// <param name="encryptionPrivateKey">一只用于可逆加密方式的密钥字符串,默认值为:空字符中,即无密钥字符串。</param>
/// <summary>
/// 【文本可逆加密】
/// <remarks>
/// 摘要:
/// 通对称加密方方式对指定的密码(明码)字符进行加密操作,最后返回加密后的字符串。
/// 对称加密方方式:
/// 对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码)。因此,通信双方都必须获得这把钥匙,并保持钥匙的秘密。
/// 单钥密码系统的安全性依赖于以下两个因素:
/// 第一、加密算法必须是足够强的,仅仅基于密文本身去解密信息在实践上是不可能的。
/// 第二、加密方法的安全性依赖于密钥的秘密性,而不是算法的秘密性,因此,我们没有必要确保算法的秘密性(事实上,现实中使用的很多单钥密码系统的算法都是公开的),但是我们一定要保证密钥的秘密性。
/// DES(Data Encryption Standard)和TripleDES是对称加密的两种实现。
/// DES和TripleDES基本算法一致,只是TripleDES算法提供的key位数更多,加密可靠性更高。
/// DES使用的密钥key为8字节,初始向量IV也是8字节。
/// TripleDES:
/// 1、Triple DES又称3DES,是 DES 加密算法的一种模式,它使用3条56位的 密钥对3DES数据进行三次加密。 数据加密标准(DES)是美国的一种由来已久的加密标准,
/// 它使用对称密钥加密法,并于1981年被 ANSI组织规范为ANSI X.3.92。DES使用56位密钥和密码块的方法,而在密码块的方法中,文本被分成64位大小的文本块然后再进行加密。比起最初的DES,3DES更为安全
/// 2、TripleDES使用24字节的key,初始向量IV也是8字节。
/// 3、两种算法都是以8字节为一个块进行加密,一个数据块一个数据块的加密,一个8字节的明文加密后的密文也是8字节。如果明文长度不为8字节的整数倍,添加值为0的字节凑满8字节整数倍。所以加密后的密文长度一定为8字节的整数倍。
/// 注意:
/// 当前程序通过TripleDESCryptoServiceProvider的实例来定义实现加密操作,即使用TripleDES算法对输入的密码字符串进行加密操作。
/// </remarks>
/// <returns>
/// 返回:
/// 一个加密后的密码字符串。
/// </returns>
/// </summary>
public virtual string EncryptText(string plainText, string encryptionPrivateKey = "")
{
if (string.IsNullOrEmpty(plainText))
return plainText;
if (string.IsNullOrEmpty(encryptionPrivateKey))
encryptionPrivateKey = UsersPassword.EncryptionKey;
using var provider = TripleDES.Create();
provider.Key = Encoding.ASCII.GetBytes(encryptionPrivateKey[0..16]);
provider.IV = Encoding.ASCII.GetBytes(encryptionPrivateKey[8..16]);
var encryptedBinary = EncryptTextToMemory(plainText, provider.Key, provider.IV);
return Convert.ToBase64String(encryptedBinary);
}
/// <param name="cipherText">一个指定的需要被解密码字符串。</param>
/// <param name="encryptionPrivateKey">一只用于可逆加密方式的密钥字符串,默认值为:空字符中,即无密钥字符串。</param>
/// <summary>
/// 【文本可逆解密】
/// <remarks>
/// 摘要:
/// 通对称加密方方式对指定的密码字符进行解密操作,最后返回加解后的字符串。
/// 对称加密方方式:
/// 对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码)。因此,通信双方都必须获得这把钥匙,并保持钥匙的秘密。
/// 单钥密码系统的安全性依赖于以下两个因素:
/// 第一、加密算法必须是足够强的,仅仅基于密文本身去解密信息在实践上是不可能的。
/// 第二、加密方法的安全性依赖于密钥的秘密性,而不是算法的秘密性,因此,我们没有必要确保算法的秘密性(事实上,现实中使用的很多单钥密码系统的算法都是公开的),但是我们一定要保证密钥的秘密性。
/// DES(Data Encryption Standard)和TripleDES是对称加密的两种实现。
/// DES和TripleDES基本算法一致,只是TripleDES算法提供的key位数更多,加密可靠性更高。
/// DES使用的密钥key为8字节,初始向量IV也是8字节。
/// TripleDES:
/// 1、Triple DES又称3DES,是 DES 加密算法的一种模式,它使用3条56位的 密钥对3DES数据进行三次加密。 数据加密标准(DES)是美国的一种由来已久的加密标准,
/// 它使用对称密钥加密法,并于1981年被 ANSI组织规范为ANSI X.3.92。DES使用56位密钥和密码块的方法,而在密码块的方法中,文本被分成64位大小的文本块然后再进行加密。比起最初的DES,3DES更为安全
/// 2、TripleDES使用24字节的key,初始向量IV也是8字节。
/// 3、两种算法都是以8字节为一个块进行加密,一个数据块一个数据块的加密,一个8字节的明文加密后的密文也是8字节。如果明文长度不为8字节的整数倍,添加值为0的字节凑满8字节整数倍。所以加密后的密文长度一定为8字节的整数倍。
/// 注意:
/// 当前程序通过TripleDESCryptoServiceProvider的实例来定义实现加密操作,即使用TripleDES算法对输入的密码字符串进行解密操作。
/// </remarks>
/// <returns>
/// 返回:
/// 一个解密后的密码(明码)字符串。
/// </returns>
/// </summary>
public virtual string DecryptText(string cipherText, string encryptionPrivateKey = "")
{
if (string.IsNullOrEmpty(cipherText))
return cipherText;
if (string.IsNullOrEmpty(encryptionPrivateKey))
encryptionPrivateKey = UsersPassword.EncryptionKey;
using var provider = TripleDES.Create();
provider.Key = Encoding.ASCII.GetBytes(encryptionPrivateKey[0..16]);
provider.IV = Encoding.ASCII.GetBytes(encryptionPrivateKey[8..16]);
var buffer = Convert.FromBase64String(cipherText);
return DecryptTextFromMemory(buffer, provider.Key, provider.IV);
}
#endregion
}
}
对以上功能更为具体实现和注释见:230209_034shopDemo(加、解密功能需求支撑)。