【问题标题】:c DES and C# DES issuec DES 和 C# DES 问题
【发布时间】:2013-09-24 08:39:44
【问题描述】:

我在整个网络上都在寻找这个问题,但找不到明确的答案:

我有一些使用 DESCryptoServiceProvider(模式 = CRC,填充 = 无)的 C# 代码,我正在使用 openssl 库使用 C 来做同样的事情。

目前为止在 C# 中

public static byte[] DESEncrypt(byte[] Source, byte[] Key)
    {
        byte[] DESKey = new byte[8];
        Array.Copy(Key, 0, DESKey, 0, 8);

        DisplayByteArray("DESKey", DESKey);

        System.Security.Cryptography.DESCryptoServiceProvider DES = new System.Security.Cryptography.DESCryptoServiceProvider();
        DES.Mode = System.Security.Cryptography.CipherMode.CBC;
        byte[] IV = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
        DES.IV = IV;
        DES.Padding = System.Security.Cryptography.PaddingMode.None;
        DES.Key = DESKey;

        System.IO.MemoryStream ms = new System.IO.MemoryStream();
        System.Security.Cryptography.CryptoStream cs = new System.Security.Cryptography.CryptoStream(ms, DES.CreateEncryptor(), System.Security.Cryptography.CryptoStreamMode.Write);

        cs.Write(Source, 0, Source.Length);

        byte[] outdata = ms.ToArray();

        cs.Close();
        ms.Close();

        return outdata;
    }

在 C 中

int DesEncrypt(BYTE *pOriginal, BYTE *oEncrypted, int nDataLength, BYTE *pKey)
{
  DES_cblock ivec = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
  DES_cblock key[8];
  memcpy(key,&pKey[0], 8);
  memset(oEncrypted, 0, sizeof(oEncrypted));
  printf("\nDESkey: ");DisplayByteArray((BYTE *)&key[0], 8);
  DES_key_schedule ks;
  memcpy((DES_cblock *)key, &ks, 8);
  if (DES_set_key_checked((DES_cblock *)key, &ks))
    printf("\nChecked OKAY");
  else
    printf("\nCheck FAILED");
  DES_cbc_encrypt(pOriginal, oEncrypted, nDataLength, &ks, &ivec, DES_ENCRYPT);
}

我做错了什么?

【问题讨论】:

  • 你有什么问题?
  • 您知道 DES 不安全吗?它的钥匙太小了。
  • 另外,使用静态 IV 可能会泄露有关明文的信息。

标签: c# c cryptography openssl


【解决方案1】:

我认为以下行

DES_cblock key[8];

应该是

DES_cblock key;

因为,您使用的是单键。

一个大问题在

memcpy((DES_cblock *)key, &ks, 8);
if (DES_set_key_checked((DES_cblock *)key, &ks))
    printf("\nChecked OKAY");
else
    printf("\nCheck FAILED");

不要通过ks 记忆key。您的 ks 未初始化。 DES_set_key_checked 从密钥设置密钥调度。

memcpy 不应该在 DES_set_key_checked 之前出现。

应该是

if (DES_set_key_checked((DES_cblock *)key, &ks))
    printf("\nChecked OKAY");
else
    printf("\nCheck FAILED");

除非你确定你为什么这样做,否则不要进行类型转换。显式类型转换可以隐藏许多错误。

【讨论】:

  • 在 win 中我得到以下信息:DESKey 02 04 06 07 01 0A E1 FD 。 . . . . . ? ? 8 个字节:00 01 02 03 04 05 06 07。 . . . . . . .加密: B9 9E 23 4F 0A BF 45 A7 ? ? # 哦。 ? E ?
  • 忘记最后一条评论。这是 C 中的错误!
猜你喜欢
  • 2019-11-10
  • 1970-01-01
  • 2014-02-28
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
  • 2015-01-03
  • 1970-01-01
相关资源
最近更新 更多