[英]Why the TripleDES.Create().Key is not a valid size for this algorithm?
在这种情况下,我需要用不同的密钥解密文本,我还需要在后面的代码中生成有效的密钥。
我正在使用此行生成密钥。
var key = Encoding.UTF8.GetString(TripleDES.Create().Key);
但不能在此方法中使用该键。 它说“指定的密钥对于该算法不是有效的大小”
我该如何解决这种情况?
public class CryptoHelper
{
public string Encrypt(string toEncrypt, string key)
{
var toEncryptArray = Encoding.UTF8.GetBytes(toEncrypt);
var keyArray = Encoding.UTF8.GetBytes(key);
var tdes = new TripleDESCryptoServiceProvider { Key = keyArray, Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 };
var cTransform = tdes.CreateEncryptor();
var resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
tdes.Clear();
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}
public string Decrypt(string cipherString, string key)
{
var toEncryptArray = Convert.FromBase64String(cipherString.Replace(' ', '+'));
var keyArray = Encoding.UTF8.GetBytes(key);
var tdes = new TripleDESCryptoServiceProvider { Key = keyArray, Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 };
var cTransform = tdes.CreateDecryptor();
var resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
tdes.Clear();
return Encoding.UTF8.GetString(resultArray);
}
}
如果您编写一些测试,您的问题就很明显,
var failures = ParallelEnumerable.Range(0, 10000).Count(i =>
{
var keyBefore = TripleDES.Create().Key;
var keyAfter = Encoding.UTF8.GetBytes(Encoding.UTF8.GetString(keyBefore));
return !keyBefore.SequenceEqual(keyAfter);
});
在我的测试中,每次尝试的往返都失败。 这证实了达米安的评论。
不能保证为键生成的字节可以像安全的UTF-8序列一样安全地往返到字符串中。
keyAfter
(几乎)总是有所扩展,有时长度是keyAfter
两倍。 实际上,我无法拨动可翻倒的钥匙,这可能与避免使用弱钥匙有关。
但是,如果我尝试
var failures = ParallelEnumerable.Range(0, 10000).Count(i =>
{
var keyBefore = TripleDES.Create().Key;
var keyAfter = Convert.FromBase64String(Convert.ToBase64String(keyBefore));
return !keyBefore.SequenceEqual(keyAfter);
});
failures
总是等于0
,如预期的那样。 因此,有一个简单的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.