+ -
当前位置:首页 → 问答吧 → 求助DES加密问题

求助DES加密问题

时间:2011-08-17

来源:互联网

我想测试一下DES_ncbc_encrypt,所以写了段代码:

void cbc_test()
{
  DES_cblock key;
  DES_cblock ivec;
  DES_key_schedule schedule;
  UINT8 input[8];
  UINT8 output[8];
  int i;
  for (i = 0; i < 8; ++i)
  {
  key[i] = input[i] = i + 1;
  ivec[i] = i;
  }

  DES_set_odd_parity(&key);
  DES_set_key_checked(&key, &schedule);

  DES_ncbc_encrypt(input, output, 8, &schedule, &ivec, DES_ENCRYPT);

  DES_ncbc_encrypt(output, input, 8, &schedule, &ivec, DES_DECRYPT);

}

为什么加密后再解密出来的明文和我以前的不一样了???

但是如果把在加密和解密前,加入以下代码,则加密后的内容可以正确解密:
memset(&ivec, 0, sizeof(ivec));

请教大家这里的 ivec 到底是干嘛用的?是一直要设置为 ‘0’ 吗?

作者: flyreally   发布时间: 2011-08-17

自己已经解决了,是因为在加密和解密时的ivec不一致导致,
貌似在DES_ncbc_encrypt中会改变ivec的值,下载了openssl,不过竟然在其中未找到
DES_ncbc_encrypt的代码。。。

作者: flyreally   发布时间: 2011-08-17

typedef unsigned char DES_cblock[8];

C/C++ code
#ifdef CBC_ENC_C__DONT_UPDATE_IV
void DES_cbc_encrypt(const unsigned char *in, unsigned char *out, long length,
             DES_key_schedule *_schedule, DES_cblock *ivec, int enc)
#else
void DES_ncbc_encrypt(const unsigned char *in, unsigned char *out, long length,
             DES_key_schedule *_schedule, DES_cblock *ivec, int enc)
#endif
    {
    register DES_LONG tin0,tin1;
    register DES_LONG tout0,tout1,xor0,xor1;
    register long l=length;
    DES_LONG tin[2];
    unsigned char *iv;

    iv = &(*ivec)[0];

    if (enc)
        {
        c2l(iv,tout0);
        c2l(iv,tout1);
        for (l-=8; l>=0; l-=8)
            {
            c2l(in,tin0);
            c2l(in,tin1);
            tin0^=tout0; tin[0]=tin0;
            tin1^=tout1; tin[1]=tin1;
            DES_encrypt1((DES_LONG *)tin,_schedule,DES_ENCRYPT);
            tout0=tin[0]; l2c(tout0,out);
            tout1=tin[1]; l2c(tout1,out);
            }
        if (l != -8)
            {
            c2ln(in,tin0,tin1,l+8);
            tin0^=tout0; tin[0]=tin0;
            tin1^=tout1; tin[1]=tin1;
            DES_encrypt1((DES_LONG *)tin,_schedule,DES_ENCRYPT);
            tout0=tin[0]; l2c(tout0,out);
            tout1=tin[1]; l2c(tout1,out);
            }
#ifndef CBC_ENC_C__DONT_UPDATE_IV
        iv = &(*ivec)[0];
        l2c(tout0,iv);
        l2c(tout1,iv);
#endif
        }
    else
        {
        c2l(iv,xor0);
        c2l(iv,xor1);
        for (l-=8; l>=0; l-=8)
            {
            c2l(in,tin0); tin[0]=tin0;
            c2l(in,tin1); tin[1]=tin1;
            DES_encrypt1((DES_LONG *)tin,_schedule,DES_DECRYPT);
            tout0=tin[0]^xor0;
            tout1=tin[1]^xor1;
            l2c(tout0,out);
            l2c(tout1,out);
            xor0=tin0;
            xor1=tin1;
            }
        if (l != -8)
            {
            c2l(in,tin0); tin[0]=tin0;
            c2l(in,tin1); tin[1]=tin1;
            DES_encrypt1((DES_LONG *)tin,_schedule,DES_DECRYPT);
            tout0=tin[0]^xor0;
            tout1=tin[1]^xor1;
            l2cn(tout0,tout1,out,l+8);
#ifndef CBC_ENC_C__DONT_UPDATE_IV
            xor0=tin0;
            xor1=tin1;
#endif
            }
#ifndef CBC_ENC_C__DONT_UPDATE_IV 
        iv = &(*ivec)[0];
        l2c(xor0,iv);
        l2c(xor1,iv);
#endif
        }
    tin0=tin1=tout0=tout1=xor0=xor1=0;
    tin[0]=tin[1]=0;
    }

作者: thefirstz   发布时间: 2011-08-17

我想用linux中的crypt对密码进行加密,可是我使用的嵌入式系统并未提供crypt函数,openssl中有可以替代的函数吗?

作者: flyreally   发布时间: 2011-08-17