我一直试图找出使用DES算法加密byte16变量的正确方法。下面是一个场景:
byte[] {11, 11, 11, 11, 11, 11, 11, 11}Instance Vector = new byte[8]加密(8个字节值为0)。有了这些信息,我实现了Encrypt方法如下:
public static byte[] Encrypt(byte[] data)
{
var dataChunk = new byte[8];
var IV = new byte[8];
var result = new byte[8];
var key = new byte[] { 11, 11, 11, 11, 11, 11, 11, 11 };
for (int counter = 0; counter < data.Length / 8; counter++)
{
// Copy the next 8-byte chunk.
Array.Copy(data, counter * 8, dataChunk, 0, 8);
var des = System.Security.Cryptography.DES.Create();
des.Key = key;
des.IV = IV;
des.Padding = PaddingMode.None;
ICryptoTransform cryptoTransform = des.CreateEncryptor(key, IV);
// Encrypt the datra chunk.
cryptoTransform.TransformBlock(dataChunk, 0, 8, result, 0);
// Set the new IV.
Array.Copy(result, IV, 8);
}
return result;
}这是使用DES加密技术加密数据的正确方法吗?
发布于 2011-10-02 16:58:25
不需要为每个块创建一个加密器。加密器本身实现操作模式.),所以你需要这样的东西:
byte[] input = ...
byte[] key = ...
byte[] iv = ...
using (DES des = DES.Create())
{
des.Mode = CipherMode.CBC;
des.Padding = PaddingMode.None;
using (ICryptoTransform encryptor = des.CreateEncryptor(key , iv))
{
byte[] output = encryptor.TransformFinalBlock(input, 0, input.Length);
}
}我省略了使用DES的警告。您可能还想看看http://msdn.microsoft.com/library/system.security.cryptography.cryptostream.aspx之后的一个更容易的en和解密.
发布于 2011-10-02 19:59:08
我无法帮助您处理C#,但我可以尝试解决您的最后一个问题:这是否是加密的“正确方式”。这个答案取决于你期望做什么。
您实现的是一种称为CBC的模式;它不允许接收方恢复消息(因此它根本不是真正的“加密”);其中一条线索是消息是16个字节,但“加密”消息只有8个字节。它确实具有这样的特性,即中间的人很难修改消息并想出正确的8字节MAC值(假设他们没有密钥);因此,这样的东西通常被用作加密性强的完整性检查。现在,CBC确实存在长度扩展攻击的问题;如果您不关心长度扩展攻击(所有消息都是16字节),这对您可能不重要吗?
CBC-MAC对您的应用是正确的吗?我不知道答案,你要问的关键问题是:
https://stackoverflow.com/questions/7627266
复制相似问题