首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用DES实现三重DES

用DES实现三重DES
EN

Stack Overflow用户
提问于 2017-05-07 15:44:14
回答 2查看 712关注 0票数 0

我正在尝试使用DES API来实现3Des,如下所示:

代码语言:javascript
复制
des(input, output, key, mode)

其输入、输出和密钥分别为8字节,并且模式标识加密和解密类型。我想知道是否有可能有一个具有可变输出长度的3Des算法?

这是我用C语言编写的代码,通过使用此API创建具有超过8字节密钥的3des。

但我不知道它是否工作正常,或者是否有可能改变输出字节。

代码语言:javascript
复制
unsigned char TripleDes(uchar *input, uchar *output,uchar *deskey, int mode)
{
    uchar tt[100];
    uchar tmpInput[100];
    uchar tmpOutput[100];
    int i=0, j=0;

    memset(tt, 0, sizeof(tt));
    memset(tmpInput, 0, sizeof(tmpInput));
    memset(tmpOutput, 0, sizeof(tmpOutput));

    j =  strlen(input);
    memcpy(tmpInput, input, j);
    while(j/8!=0){
        j-=8;
        if (mode) { //Encrypt
            des(tmpInput+i*8, tmpOutput+i*8, deskey,1);
            des(tmpOutput+i*8, tt, deskey+8, 0);
            des(tt,tmpOutput+i*8, deskey, 1);
        }
        else { //Decrypt
            des(tmpInput+i*8, tmpOutput+i*8, deskey, 0);
            des(tmpOutput+i*8, tt, deskey+8, 1);
            des(tt, tmpOutput+i*8, deskey, 0);
        }
        i++;
    }

    strcpy(output, tmpOutput);
    return;
}

有什么想法吗?

EN

回答 2

Stack Overflow用户

发布于 2017-05-08 12:31:14

我最终可以解决这个问题,而不是使用这个API,而是使用下面链接中提到的类中的方法:

https://github.com/petricek/eternity-service/blob/master/Common/RSARef/source/desc.c

我需要一个具有16个密钥长度的CBC模式下的三重des类。我更改了这些类,它们运行得很好:

代码语言:javascript
复制
 DES3_CBCInit
    {
     .....
      deskey(context->subkeys[0], key, encrypt);
      deskey(context->subkeys[1], &key[8], !encrypt);
    }

 DES3_CBCUpdate
  {
    .....

    DESFunction (work, context->subkeys[0]);
    DESFunction (work, context->subkeys[1]);
    DESFunction (work, context->subkeys[0]);

    ......
   }
票数 0
EN

Stack Overflow用户

发布于 2017-05-07 18:18:56

代码语言:javascript
复制
des(tmpInput+i*8, tmpOutput+i*8, deskey,1); // step1: encrypting 8 bytes of input with first 8 bytes of key
des(tmpOutput+i*8, tt, deskey+8, 0);// step2: decrypting result of step1 with last 8 bytes of key
des(tt,tmpOutput+i*8, deskey, 1);// step3: encrypting result of step2 with first 8 bytes of key

假设您使用了16字节的密钥,并且如果des api正在执行我在注释中提到的操作,那么它将正确地执行3DES

如果输入数据是8字节的倍数,则输出数据的长度与输入数据的长度相同。如果输入数据的长度不是8的倍数,则用尾随零填充,使其成为8的倍数,然后进行加密,例如,如果输入数据的长度为10,则输出数据的长度将为16

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

https://stackoverflow.com/questions/43829039

复制
相关文章

相似问题

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