C# 解码和编码字符串.对称算法的硬编码密钥

C# 解码和编码字符串.对称算法的硬编码密钥,c#,asp.net,key,encryption-symmetric,C#,Asp.net,Key,Encryption Symmetric,我编写了以下用于编码和解码字符串数据的类(带一个键的对称算法): 使用方法如下: protected void Page_Load(object sender, EventArgs e) { SymmetricEncryptionUtility.AlgorithmName = "TripleDES"; Response.Write(SymmetricEncryptionUtility.EncryptData("1234-4567-8910-2345")); } 关于MyKey,

我编写了以下用于编码和解码字符串数据的类(带一个键的对称算法):

使用方法如下:

protected void Page_Load(object sender, EventArgs e)
{
    SymmetricEncryptionUtility.AlgorithmName = "TripleDES";
    Response.Write(SymmetricEncryptionUtility.EncryptData("1234-4567-8910-2345"));
}
关于MyKey,我有一些问题->我们如何为对称算法使用硬编码密钥,并在上层阶级中使用它?

上面的错误代码如下所示:


当前web请求的执行。请查看堆栈跟踪 有关错误以及错误来源的详细信息,请参阅 代码

System.Security.Cryptography.CryptographyException:指定的密钥为 此算法的大小无效

如何修复此错误


提前感谢

阅读错误并查看以下文档:

该算法支持从128位到192位的密钥长度,增量为64位

这意味着例如

private const string MyKey = "bla bla bla blah";
会有用的

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


此外,我认为使用一个恒定的键而不是可变的算法是没有意义的,特别是因为不同的算法需要不同长度的键。

阅读错误并查看文档以了解:

该算法支持从128位到192位的密钥长度,增量为64位

这意味着例如

private const string MyKey = "bla bla bla blah";
会有用的

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


另外,我认为使用一个不变的键但可变的算法是没有意义的,特别是因为不同的算法需要不同长度的密钥。

您可以使用
系统.安全.加密.Rfc2898DeriveBytes
根据
字符串
密码和
字节[]安全地为您的密钥生成正确的字节数。
salt:

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

有关
Rfc2898DeriveBytes
及其使用方法的更多信息,请查看其。

您可以使用
System.Security.Cryptography.Rfc2898DeriveBytes
根据
字符串
密码和
byte[]安全地为密钥生成正确的字节数

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

有关
Rfc2898DeriveBytes
及其使用方法的更多信息,请查看其。

@LostLord,它不是关于字符串本身,而是关于从中创建的
byte[]
。您使用的是UTF8编码,所有字符都来自ASCII,因此每个字符都使用一个字节进行编码。将位转换为字节后,这意味着您需要以8个字符(即16或24个字符)为增量的16到24个字符。@LostLord,这与字符串本身无关,而是与您从中创建的
byte[]
有关。您使用的是UTF8编码,所有字符都来自ASCII,因此每个字符都使用一个字节进行编码。在将位转换为字节后,这意味着您需要以8个字符(即16或24个字符)为增量的16到24个字符。
private const string MyKey = "bla bla bla blah";
var helper = new Rfc2898DeriveBytes(password, salt);
algorithm.Key = helper.GetBytes(algorithm.KeySize / 8);