将xorcrypto加密模块转换为AES加密模块

时间:2011-09-30 16:12:02

标签: c encryption network-programming openssl aes

我已经获得了一个样本加密模块,它只是将一个密钥与分组数据相关联,并将结果放在构造分组本身的数据字段中....

xoricv模块的代码在这里。

void
xorcrypto(uint8_t *key, uint32_t keylen,
    uint8_t *data, uint32_t datalen)
{
    int d, k;

    for (d=0, k=0; d < datalen; ++d, k = (k+1)%keylen) {
            data[d] ^= key[k];
    }
}

现在我需要更改模块,以便它执行AES加密而不是简单的xor操作。

你能否提出我需要做的转变????

这是我项目的一小部分,我陷入其间......

我在命令行上用于加密的AES命令

openssl enc -aes-256-cbc -salt -in file.txt -out file.enc

每天我都会遇到很多错误,当我试图通过自己的方式来实现它时,我的时间非常有限,所以请帮助我.......


这是我的实现......虽然我在答案栏中添加它,因为可能在我的实现中有一个小错误,我可以通过一些有价值的建议解决但仍然如果有任何其他方式是有可能请建议并提供一些实施代码......

/* u_int8_t ... etc all are typedefs for uint8_t....etc 
 so don't bother about them */

void xorcrypto(u_int8_t *key, u_int32_t keylen,u_int8_t *data,
               u_int32_t datalen)
{

int ch,i,j;
uint8_t modata[100];

FILE *fp,*fr,*fq,*ft;

fp=fopen("key","w");
fputs((char *)key,fp);
fq=fopen("file.txt","w");
fputs((char *)data,fq);

fclose(fp);
fclose(fq);

system("sudo openssl enc -aes-256-cbc -salt -in file.txt -out file.enc -pass file:key");

fr=fopen("file.enc","r");

memset(data,0,sizeof(data));

i=0;

while( (ch=fgetc(fr))==EOF) {
   data[i]=ch;
   i++;
}

fclose(fr);

system("sudo openssl enc -d -aes-256-cbc -salt -in file.enc 
 -out file1.txt -pass file:key");


ft=fopen("file1.txt","r");

memset(modata,0,sizeof(modata));

j=0;

while( (ch=fgetc(ft)) != EOF) {
            modata[j]=ch;
            j++;
}

fclose(ft);

}

模块中的函数调用描述为 -

bool
espcrypto(esp_private *epriv, sendip_data *data, sendip_data *pack)
{
    u_int32_t keylen;
    u_int8_t *key;
    static u_int8_t fakekey;
    struct ip_esp_hdr *esp = (struct ip_esp_hdr *)pack->data;

    if (!epriv->keylen) {   /* This isn't going to be very productive... */
            key = &fakekey;
            keylen = 1;
    } else {
            key = (u_int8_t *)epriv->key;
            keylen = epriv->keylen;
    }
    /* Encrypt everything past the ESP header */
    xorcrypto(key, keylen,
            (u_int8_t *)esp->enc_data,
                    pack->alloc_len + data->alloc_len -
                            sizeof(struct ip_esp_hdr));
    return TRUE;
    }

这是我正在使用的数据包生成器工具中的xorcrypto.c文件中的代码,它在数据包构建过程中通过命令行链接为-am xorcrypto.so。这就是我如此懒惰的原因。我是第一次看对于可以作为概念证明的实现。可以在以后完成所有优化。

我得到的输出是 - 所有数据都没有执行加密仍然是数据包中的纯文本。

udit@udit-Dabba ~/Downloads/sendip-2.5-mec-2/mec $ cat file.txt 
udit@udit-Dabba ~/Downloads/sendip-2.5-mec-2/mec $ cat file.enc 
Salted__����
}�#��G�����0����iudit@udit-Dabba ~/Downloads/sendip-2.5-mec-2/mec $ cat file1.txt
udit@udit-Dabba ~/Downloads/sendip-2.5-mec-2/mec $ 

为什么file.txt为null,即使key文件未更新???

如果需要任何其他信息,我会在这里添加......但请帮我摆脱网格。

2 个答案:

答案 0 :(得分:2)

如果不对软件进行其他更改,甚至可能无法实现。看起来您的函数不允许生成的加密数据大于未加密的数据,这对RSA来说是必需的。

传递给你的功能的关键也会大不相同; RSA密钥的一侧将由模数和指数组成。模数将是一个很大的数字(不能用普通的整数类型表示),并且指数通常是一侧的大数字和另一侧的(相对)小的。

除此之外,RSA存在许多问题和困难。您可以尝试自己处理这些问题,但是使用像OpenSSL这样的现有库可能会更好。其中一些问题包括:

  • 实现RSA(使用有用的长密钥)需要对非常大的数字进行模运算,远大于任何普通整数类型。你要么必须为此编写函数,要么找一个库。
  • 数据必须分成比模数(密钥的一部分)短的部分,包括任何填充,并且这些填充与数据一起加密。加密后每个部分的长度将是模数的长度。这就是为什么生成的加密数据将比原始数据(以及填充)更长的原因。
  • 避免某些漏洞需要额外的步骤,例如在每个数据片段中添加随机填充,并确保从密钥中提升到指数的填充数据将超过模数(如果它不是作为模幂运算完成的话)

首先,您需要使加密函数能够返回比您提供的数据更多的数据。那么你应该考虑使用加密库来进行实际加密,以节省大量工作并减少让漏洞漏掉的可能性。

答案 1 :(得分:1)

那么,

我觉得这句话:

while( (ch=fgetc(fr))==EOF)
// Also, Similar statements that you have used many times.

您正在从文件中读取1个字符并将其与EOF进行比较。这很好,直到你正在使用普通的文本文件。

但是,您正在使用加密文件file.enc,它可以包含任何内容。 它甚至可以将EOF个字符本身作为数据内容。

这意味着如果文件有100个字符而第二个字符是EOF则它将终止于第二个字符本身。

我认为这是一个可能的问题。

仍然存在..其他问题 - 我建议使用fprintf()代替fputs(),这些都很容易使用,从而避免了看不见的错误。因为你在逻辑上处理字符串而不是字符。

此外,使用它们还可以在需要时获得字符串格式化的优势。

尝试然后回来.. :))