我一直试图找出使用DES算法加密byte [16]变量的正确方法。这是场景:
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加密技术加密数据的正确方法吗?
答案 0 :(得分:3)
您不需要为每个块创建加密器。 加密器本身实现了操作模式( CBC ,...)和填充。 所以你需要这样的东西:
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的警告。您可能还想看看CryptoStream之后更加容易的解密和解密......
答案 1 :(得分:2)
我无法帮助您使用C#,但我可以尝试解决您的上一个问题:这是否是加密的“正确方法”。那么,答案取决于你期望做什么。
您实施的是一种称为CBC-MAC的模式;它不允许接收者恢复消息(因此根本不是“加密”);一个线索是消息是16字节,但“加密”消息只有8个字节。它确实具有以下特性:中间的某个人很难修改消息并提出正确的8字节MAC值(假设他们没有密钥);因此,像这样的东西经常被用作加密强的完整性检查。现在,CBC-MAC确实存在长度扩展攻击的问题;如果你不关心长度扩展攻击(你的所有消息都是16个字节),这对你来说可能不重要吗?
CBC-MAC对您的应用程序来说是正确的吗?好吧,我不知道答案;关键问题: