.net C语言中的DES加密#

.net C语言中的DES加密#,.net,encryption,des,.net,Encryption,Des,我一直在试图找到使用DES算法加密字节[16]变量的正确方法。以下是场景: 数据应以8字节的部分进行加密。加密的密钥是:byte[]{11,11,11,11,11,11} 前8个字节使用实例向量=新字节[8]加密(8个字节,值为0) 加密结果将是接下来8个字节的IV。(这是CBC吗?) 最后8个字节是我应该发送的结果 有了这些信息,我实现了加密方法,如下所示: public static byte[] Encrypt(byte[] data) { var dataChunk = ne

我一直在试图找到使用DES算法加密字节[16]变量的正确方法。以下是场景:

  • 数据应以8字节的部分进行加密。加密的密钥是:
    byte[]{11,11,11,11,11,11}
  • 前8个字节使用
    实例向量=新字节[8]
    加密(8个字节,值为0)
  • 加密结果将是接下来8个字节的IV。(这是CBC吗?)
  • 最后8个字节是我应该发送的结果
有了这些信息,我实现了
加密
方法,如下所示:

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;
}
公共静态字节[]加密(字节[]数据)
{
var dataChunk=新字节[8];
var IV=新字节[8];
var结果=新字节[8];
var key=新字节[]{11,11,11,11,11,11,11};
用于(int计数器=0;计数器

这是使用DES加密技术加密数据的正确方法吗?

您不需要为每个块创建加密程序加密机本身实现操作模式(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的警告。您可能还想在以后查看更简单的加密和解密…

您不需要为每个块创建加密程序加密机本身实现操作模式(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的警告。您可能还想在以后查看更简单的加密和解密…

我无法帮助您使用C#,但我可以尝试解决您的最后一个问题:这是否是加密的“正确方式”。这个答案取决于你期望做什么

您实现的是一种称为CBC-MAC的模式;它不允许接收方恢复消息(因此根本不是真正的“加密”);其中一个线索是消息是16字节,但“加密”消息只有8字节。它确实具有这样的特性,中间的人很难修改消息,并得到正确的8字节MAC值(假设它们没有密钥);因此,像这样的东西通常被用作加密强完整性检查。现在,CBC-MAC确实存在长度扩展攻击问题;如果您不关心长度扩展攻击(所有消息都是16字节),这对您可能并不重要

CBC-MAC是否适合您的应用程序?嗯,我不知道答案;给你的关键问题是:

  • 你想干什么?您是否正在尝试“加密”消息(以便另一方可以恢复它)?或者,您是在试图证明该消息是由带钥匙的人发送的吗
  • 你想和别人和睦相处吗?是否有其他人指定了此“加密”方法
  • ortag决定省略DES的警告,但我想我会包括它们——DES可以用不完全不合理的工作量来破坏;它可能对你的妹妹,甚至可能是普通黑客是安全的,但如果你的对手有权访问一些计算机资源,他可以打破这个。如果这是一个问题,您将希望切换到更强大的密码,如AES

我无法帮助您处理C#,但我可以尝试解决您的最后一个问题:这是否是加密的“正确方式”。这个答案取决于你期望做什么

您实现的是一种称为CBC-MAC的模式;它不允许接收方恢复消息(因此根本不是真正的“加密”);其中一个线索是消息是16字节,但“加密”消息只有8字节。它确实具有这样的特性,中间的人很难修改消息,并得到正确的8字节MAC值(假设它们没有密钥);因此,像这样的东西通常被用作加密强完整性检查。现在,CBC-MAC确实存在长度扩展攻击问题;如果您不关心长度扩展攻击(所有消息都是16字节),这对您可能并不重要

CBC-MAC是否适合您的应用程序?嗯,我不知道答案;给你的关键问题是:

  • 你想干什么?您是否正在尝试“加密”消息(以便另一方可以恢复它)?或者,您是在试图证明该消息是由带钥匙的人发送的吗
  • 你想和别人和睦相处吗?是否有其他人指定了此“加密”方法
  • ortag决定省略DES的警告,但我想我会包括它们——DES可以用不完全不合理的工作量来破坏;它可能对你的妹妹,甚至可能是普通黑客是安全的,但如果你的对手有权访问一些计算机资源,他可以打破这个。如果这是一个问题,您将希望切换到更强大的密码,如AES

您可能希望接受IV作为此功能的输入。顾名思义,它毕竟是初始向量。此外,由于您将丢弃所有加密数据,但最后一个数据块除外,因此这不是真正的加密。它是MAC(消息身份验证码)——本质上是一种共享秘密签名机制。您可能希望接受IV作为输入