第40章 加、解密功能需求支撑

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)加密方式(一般用于数字签名、数据校验(CRCSHAMD5),据说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-224SHA-256SHA-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是对称加密的两种实现。

        ///     DESTripleDES基本算法一致,只是TripleDES算法提供的key位数更多,加密可靠性更高。

        ///     DES使用的密钥key8字节,初始向量IV也是8字节。

        /// TripleDES

        ///     1Triple DES又称3DES,是 DES 加密算法的一种模式,它使用356位的 密钥对3DES数据进行三次加密。 数据加密标准(DES)是美国的一种由来已久的加密标准,

        ///     它使用对称密钥加密法,并于1981年被 ANSI组织规范为ANSI X.3.92DES使用56位密钥和密码块的方法,而在密码块的方法中,文本被分成64位大小的文本块然后再进行加密。比起最初的DES3DES更为安全

        ///     2TripleDES使用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是对称加密的两种实现。

        ///     DESTripleDES基本算法一致,只是TripleDES算法提供的key位数更多,加密可靠性更高。

        ///     DES使用的密钥key8字节,初始向量IV也是8字节。

        /// TripleDES

        ///     1Triple DES又称3DES,是 DES 加密算法的一种模式,它使用356位的 密钥对3DES数据进行三次加密。 数据加密标准(DES)是美国的一种由来已久的加密标准,

        ///     它使用对称密钥加密法,并于1981年被 ANSI组织规范为ANSI X.3.92DES使用56位密钥和密码块的方法,而在密码块的方法中,文本被分成64位大小的文本块然后再进行加密。比起最初的DES3DES更为安全

        ///     2TripleDES使用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是对称加密的两种实现。

        ///     DESTripleDES基本算法一致,只是TripleDES算法提供的key位数更多,加密可靠性更高。

        ///     DES使用的密钥key8字节,初始向量IV也是8字节。

        /// TripleDES

        ///     1Triple DES又称3DES,是 DES 加密算法的一种模式,它使用356位的 密钥对3DES数据进行三次加密。 数据加密标准(DES)是美国的一种由来已久的加密标准,

        ///     它使用对称密钥加密法,并于1981年被 ANSI组织规范为ANSI X.3.92DES使用56位密钥和密码块的方法,而在密码块的方法中,文本被分成64位大小的文本块然后再进行加密。比起最初的DES3DES更为安全

        ///     2TripleDES使用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是对称加密的两种实现。

        ///     DESTripleDES基本算法一致,只是TripleDES算法提供的key位数更多,加密可靠性更高。

        ///     DES使用的密钥key8字节,初始向量IV也是8字节。

        /// TripleDES

        ///     1Triple DES又称3DES,是 DES 加密算法的一种模式,它使用356位的密钥对3DES数据进行三次加密。 数据加密标准(DES)是美国的一种由来已久的加密标准,

        ///     它使用对称密钥加密法,并于1981年被 ANSI组织规范为ANSI X.3.92DES使用56位密钥和密码块的方法,而在密码块的方法中,文本被分成64位大小的文本块然后再进行加密。比起最初的DES3DES更为安全

        ///     2TripleDES使用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-224SHA-256SHA-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是对称加密的两种实现。

        ///     DESTripleDES基本算法一致,只是TripleDES算法提供的key位数更多,加密可靠性更高。

        ///     DES使用的密钥key8字节,初始向量IV也是8字节。

        /// TripleDES

        ///     1Triple DES又称3DES,是 DES 加密算法的一种模式,它使用356位的 密钥对3DES数据进行三次加密。 数据加密标准(DES)是美国的一种由来已久的加密标准,

        ///     它使用对称密钥加密法,并于1981年被 ANSI组织规范为ANSI X.3.92DES使用56位密钥和密码块的方法,而在密码块的方法中,文本被分成64位大小的文本块然后再进行加密。比起最初的DES3DES更为安全

        ///     2TripleDES使用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是对称加密的两种实现。

        ///     DESTripleDES基本算法一致,只是TripleDES算法提供的key位数更多,加密可靠性更高。

        ///     DES使用的密钥key8字节,初始向量IV也是8字节。

        /// TripleDES

        ///     1Triple DES又称3DES,是 DES 加密算法的一种模式,它使用356位的 密钥对3DES数据进行三次加密。 数据加密标准(DES)是美国的一种由来已久的加密标准,

        ///     它使用对称密钥加密法,并于1981年被 ANSI组织规范为ANSI X.3.92DES使用56位密钥和密码块的方法,而在密码块的方法中,文本被分成64位大小的文本块然后再进行加密。比起最初的DES3DES更为安全

        ///     2TripleDES使用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(加、解密功能需求支撑)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值