我正在尝试使用DES API来实现3Des,如下所示:
des(input, output, key, mode)其输入、输出和密钥分别为8字节,并且模式标识加密和解密类型。我想知道是否有可能有一个具有可变输出长度的3Des算法?
这是我用C语言编写的代码,通过使用此API创建具有超过8字节密钥的3des。
但我不知道它是否工作正常,或者是否有可能改变输出字节。
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;
}有什么想法吗?
发布于 2017-05-08 12:31:14
我最终可以解决这个问题,而不是使用这个API,而是使用下面链接中提到的类中的方法:
https://github.com/petricek/eternity-service/blob/master/Common/RSARef/source/desc.c
我需要一个具有16个密钥长度的CBC模式下的三重des类。我更改了这些类,它们运行得很好:
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]);
......
}发布于 2017-05-07 18:18:56
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
https://stackoverflow.com/questions/43829039
复制相似问题