首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C/ DES和C# DES问题

C/ DES和C# DES问题
EN

Stack Overflow用户
提问于 2013-09-24 08:39:44
回答 1查看 398关注 0票数 0

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

我有一些C#代码使用DESCryptoServiceProvider (Mode = CRC,have = to ),我使用openssl库使用C进行同样的操作。

到目前为止在C#

代码语言:javascript
复制
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语

代码语言:javascript
复制
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);
}

我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-24 08:57:57

我想下面这句话

代码语言:javascript
复制
DES_cblock key[8];

应该是

代码语言:javascript
复制
DES_cblock key;

因为你用的是单键。

其中一个大问题是

代码语言:javascript
复制
memcpy((DES_cblock *)key, &ks, 8);
if (DES_set_key_checked((DES_cblock *)key, &ks))
    printf("\nChecked OKAY");
else
    printf("\nCheck FAILED");

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

在DES_set_key_checked之前,memcpy不应该存在。

它应该是

代码语言:javascript
复制
if (DES_set_key_checked((DES_cblock *)key, &ks))
    printf("\nChecked OKAY");
else
    printf("\nCheck FAILED");

除非你知道你在做什么,否则不要打打字机。显式类型广播可以隐藏许多错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18976721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档