为什么TripleDES.Create(),关键不是这个算法有效的大小? [英] Why the TripleDES.Create().Key is not a valid size for this algorithm?

查看:680
本文介绍了为什么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);!
});

在我的测试中,每一个试图往返失败。这证实了达明的评论。




有这么一个按键可以安全所产生的字节并不保证
轮,奔进一个字符串通过充当如果他们是一个合法的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 equals 0, as expected. So, there is a simple solution.

这篇关于为什么TripleDES.Create(),关键不是这个算法有效的大小?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆