本文介绍了为什么TripleDES.Create(),关键不是这个算法有效的大小?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在我需要解密用不同势键
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);!
});
在我的测试中,每一个试图往返失败。这证实了达明的评论。
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 equals 0
, as expected. So, there is a simple solution.
这篇关于为什么TripleDES.Create(),关键不是这个算法有效的大小?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!