2011-03-18 64 views
8

我需要为TripleDES加密生成字节数组。我不想使用.generateKey(),因为我需要知道密钥中的字节以将它们传递给另一个应用程序。为TripleDES密钥生成随机字节C#

感谢您的回复,但我忘了提一件事:字节必须是奇数奇偶校验。否则,我无法从它们生成TripleDES密钥。我对奇数奇偶校验不太熟悉,所以我想必须创建一个字节校验,如果它有奇数奇偶校验;那么如果它确实把它放在数组中,否则不。

回答

4

如果您需要确保奇校验,你必须自己去计算它。这应该这样做:

var rng = new RNGCryptoServiceProvider(); 
var key = new byte[24]; 
rng.GetBytes(key); 

for(var i = 0; i < key.Length; ++i) 
{ 
    int keyByte = key[i] & 0xFE; 
    var parity = 0; 
    for (var b = keyByte; b != 0; b >>= 1) parity ^= b & 1; 
    key[i] = (byte)(keyByte | (parity == 0 ? 1 : 0)); 
} 

return key; 
+0

谢谢,这工作。 – hs2d 2011-03-18 08:45:48

-1

什么Random.NextBytes()

更多信息here

+0

“随机”对于加密使用不安全。 – CodesInChaos 2011-03-18 09:14:30

3

如何:

RandomNumberGenerator rng = RandomNumberGenerator.Create(); 
byte[] key = new byte[24]; // For a 192-bit key 
rng.GetBytes(key); 

tripleDes.Key = key; 

注意RandomNumberGenerator适用于加密工作(在合理的安全,难以预知的随机数据方面),而System.Random不是。

+0

RandomNumberGenerator rng = new RandomNumberGenerator.Create(); – theIrishUser 2013-03-16 13:29:12

1

GetBytes方法返回值的crypthographically强序列:

 var rng = System.Security.Cryptography.RandomNumberGenerator.Create(); 
     byte [] barr = new byte[128]; 
     rng.GetBytes(barr); 
     foreach (var b in barr) 
     { 
      Console.WriteLine(b); 
     } 
+0

Thnx,多数民众赞成在工作,但看看我编辑的问题。我忘记说有关奇数比价。 – hs2d 2011-03-18 08:30:50

2

但是......什么是只有问题:

TripleDES provider = TripleDES.Create(); 

byte[] key = provider.Key; 

有你习惯用这个实例创建的恩和解密密钥。

请注意,其他答案缺少TripleDES.IsWeakKey

+0

这个效果最好 – atconway 2013-07-12 22:07:07