解码和编码字符串-对称算法的硬编码密钥

本文关键字:编码 算法 对称 密钥 编码字符 字符串 解码 | 更新日期: 2023-09-27 18:02:43

我编写了下面的类来编码和解码字符串数据(一键对称算法):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Text;
using System.Security.Cryptography;
using System.IO;
namespace MyProject.Classes
{
    public static class SymmetricEncryption
    {
        private const string MyKey = "bla bla bla";
        private static string _AlgorithmName;
        public static string AlgorithmName
        {
            get { return _AlgorithmName; }
            set { _AlgorithmName = value; }
        }
        public static string EncryptData(string ClearData)
        {
            // Convert string ClearData to byte array
            byte[] ClearData_byte_Array = Encoding.UTF8.GetBytes(ClearData);
            // Now Create The Algorithm
            SymmetricAlgorithm Algorithm = SymmetricAlgorithm.Create(AlgorithmName);
            Algorithm.Key = Encoding.UTF8.GetBytes(MyKey);
            // Encrypt information
            MemoryStream Target = new MemoryStream();
            // Append IV
            Algorithm.GenerateIV();
            Target.Write(Algorithm.IV, 0, Algorithm.IV.Length);
            // Encrypt Clear Data
            CryptoStream cs = new CryptoStream(Target, Algorithm.CreateEncryptor(), CryptoStreamMode.Write);
            cs.Write(ClearData_byte_Array, 0, ClearData_byte_Array.Length);
            cs.FlushFinalBlock();
            // Output
            byte[] Target_byte_Array = Target.ToArray();
            string Target_string = Convert.ToBase64String(Target_byte_Array);
            return Target_string;
        }
        public static string DecryptData(string EncryptedData)
        {
            byte[] EncryptedData_byte_Array = Convert.FromBase64String(EncryptedData);
            // Now Create The Algorithm
            SymmetricAlgorithm Algorithm = SymmetricAlgorithm.Create(AlgorithmName);
            Algorithm.Key = Encoding.UTF8.GetBytes(MyKey);
            // Decrypt information
            MemoryStream Target = new MemoryStream();
            // Read IV
            int ReadPos = 0;
            byte[] IV = new byte[Algorithm.IV.Length];
            Array.Copy(EncryptedData_byte_Array, IV, IV.Length);
            Algorithm.IV = IV;
            ReadPos += Algorithm.IV.Length;
            // Decrypt Encrypted Data
            CryptoStream cs = new CryptoStream(Target, Algorithm.CreateDecryptor(), CryptoStreamMode.Write);
            cs.Write(EncryptedData_byte_Array, ReadPos, EncryptedData_byte_Array.Length - ReadPos);
            cs.FlushFinalBlock();
            // Output
            byte[] Target_byte_Array = Target.ToArray();
            string Target_string = Encoding.UTF8.GetString(Target_byte_Array);
            return Target_string;
        }

    }
}

和用法如下:

protected void Page_Load(object sender, EventArgs e)
{
    SymmetricEncryptionUtility.AlgorithmName = "TripleDES";
    Response.Write(SymmetricEncryptionUtility.EncryptData("1234-4567-8910-2345"));
}

我有一些问题关于MyKey -> 我们怎么能有硬编码密钥对称算法和使用它在上层阶级?

上面的代码ERROR如下:

    Server Error in '/' Application.

    Specified key is not a valid size for this algorithm. 
    Description: An unhandled exception occurred during the

当前web请求的执行。请查看堆栈跟踪有关错误及其起源的详细信息代码。

    Exception Details:

System.Security.Cryptography。CryptographicException:指定的密钥是

如何修复这个错误?

thanks in advance

解码和编码字符串-对称算法的硬编码密钥

您可以使用System.Security.Cryptography.Rfc2898DeriveBytes安全地生成基于string密码和byte[]盐的密钥的正确字节数:

var helper = new Rfc2898DeriveBytes(password, salt);
algorithm.Key = helper.GetBytes(algorithm.KeySize / 8);

有关Rfc2898DeriveBytes和如何使用它的更多信息,请查看MSDN上的页面。

阅读错误并查看TripleDES.Key的文档:

该算法支持密钥长度从128位到192位,递增64位。

这意味着例如

private const string MyKey = "bla bla bla blah";

你没有问这个,但我不确定创建这个类作为静态是一个好主意。如果您在代码中的两个不同位置使用它,可能会导致意想不到的结果,因为AlgorithmName是静态的。

同样,我不认为有一个恒定的键,但变量算法是有意义的,特别是因为不同的算法需要不同长度的键。