为什么TripleDES.Create(),关键不是这个算法有效的大小? [英] Why the TripleDES.Create().Key is not a valid size for this algorithm?
问题描述
在我需要解密用不同势键
I文本还需要genreate在后面的代码有效密钥的情况下。
我用这条线来产生。一键
VAR键= Encoding.UTF8.GetString(TripleDES.Create()键。);
但不能使用这种方法的关键。它说:指定的密钥不是这个算法有效大小
如何解决这种情况呢?
公共类CryptoHelper
{
公共字符串加密(字符串toEncrypt,串键)
{
VAR toEncryptArray = Encoding.UTF8.GetBytes( toEncrypt);
VAR keyArray = Encoding.UTF8.GetBytes(键);
变种TDES =新TripleDESCryptoServiceProvider {重点= keyArray,模式= CipherMode.ECB,填充= PaddingMode.PKCS7};
VAR cTransform = tdes.CreateEncryptor();
变种resultArray = cTransform.TransformFinalBlock(toEncryptArray,0,toEncryptArray.Length);
tdes.Clear();
返回Convert.ToBase64String(resultArray,0,resultArray.Length);
}
公共字符串解密(字符串cipherString,串键)
{
VAR toEncryptArray = Convert.FromBase64String(cipherString.Replace('','+') );
VAR keyArray = Encoding.UTF8.GetBytes(键);
变种TDES =新TripleDESCryptoServiceProvider {重点= keyArray,模式= CipherMode.ECB,填充= PaddingMode.PKCS7};
VAR cTransform = tdes.CreateDecryptor();
变种resultArray = cTransform.TransformFinalBlock(toEncryptArray,0,toEncryptArray.Length);
tdes.Clear();
返回Encoding.UTF8.GetString(resultArray);
}
}
如果你写一个小测试,你的问题变得很明显,
VAR失败= ParallelEnumerable.Range(0,10000).Count之间(我= GT;
{
VAR keyBefore = TripleDES.Create()键;
VAR keyAfter = Encoding.UTF8.GetBytes(Encoding.UTF8.GetString(keyBefore));
返回keyBefore.SequenceEqual(keyAfter);!
});
在我的测试中,每一个试图往返失败。这证实了达明的评论。
有这么一个按键可以安全所产生的字节并不保证
轮,奔进一个字符串通过充当如果他们是一个合法的UTF-8
序列。
块引用>
的
keyAfter
(几乎)总是有所扩大,有时一倍的长度。事实上,我无法侥幸的键是圆形trippable,这可能是与避免弱密钥。
但是,如果我尝试
VAR失败= ParallelEnumerable.Range(0,10000).Count之间(I =>
{
VAR keyBefore = TripleDES.Create()键;
VAR keyAfter = Convert.FromBase64String(Convert.ToBase64String(keyBefore));!
返回keyBefore.SequenceEqual(keyAfter );
});
失败
总是等于0
,符合市场预期。所以,有一个简单的解决方案。in a case i need to decrypt texts with diffrent keys i also need to genreate valid keys in code behind.
i am using this line to generate a key.
var key = Encoding.UTF8.GetString(TripleDES.Create().Key);
but can't use that key in this method. it says "Specified key is not a valid size for this algorithm"
how can i fix this situation?
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); } }
解决方案If you write a little test, your problem becomes obvious,
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); });
In my testing, every attempted roundtrip fails. This confirms Damien's comment.
There's no guarantee that the bytes generated for a key can be safely round-tripped into a string by acting as if they're a valid UTF-8 sequence.
The
keyAfter
is (almost) always somewhat expanded, sometimes doubled in length. In fact, I'm unable to fluke a key that is round trippable, this may have something to do with avoiding weak keys.
However, if i try
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
always equals0
, as expected. So, there is a simple solution.这篇关于为什么TripleDES.Create(),关键不是这个算法有效的大小?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!