2011-09-30 61 views
1

我已经给出一个样本加密模块,其简单地异或与该分组数据的密钥并将结果中构建分组本身....变换xorcrypto加密模块,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 - 盐 - 在file.txt的退房手续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。这就是为什么我很懒惰。我首先寻找可以充当概念验证的实现。以后可以完成所有优化。

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

[email protected] ~/Downloads/sendip-2.5-mec-2/mec $ cat file.txt 
[email protected] ~/Downloads/sendip-2.5-mec-2/mec $ cat file.enc 
Salted__���� 
}�#��G�����0����[email protected] ~/Downloads/sendip-2.5-mec-2/mec $ cat file1.txt 
[email protected] ~/Downloads/sendip-2.5-mec-2/mec $ 

为什么file.txt的是空连key文件没有更新???

如果需要其他信息,我会在这里添加它......但请帮助我离开网格。

+0

如果你想成为真懒:'系统( “ENC的OpenSSL -AES-256-CBC -salt -in file.txt的退房手续file.enc” ); // TODO:refactor' – MSalters

回答

1

好,

我觉得行:

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

您正在从文件读取1个字符,并进行比较,为EOF。这工作得很好,直到你正在使用正常的文本文件。

但在这里你用一个加密文件,file.enc它可以包含任何东西的工作。 它甚至可以拥有EOF字符本身作为数据内容。

这意味着,如果文件中有100个字符,第2个字符是EOF那么它会在第2个字符本身终止。

我觉得这是一个可能的问题。

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

此外,使用这些需要的时候你也可以得到字符串格式化的优势。

试用,然后回来.. :)

2

如果不对软件进行一些其他更改,这可能无法实现。它看起来并不像你的函数允许产生的加密数据大于未加密的数据,对于RSA来说,它是必需的。

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

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

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

首先,您需要使您的加密函数能够返回比您给出的数据更多的数据。那么你应该看看使用加密库来进行实际加密,以节省大量工作并减少漏洞漏洞的机会。

+0

你会建议任何其他加密方法,可能在这里工作......看我在寻找任何加密方法,这将是很好的网络应用程序,请帮我一些执行code.if任何人都可以工作那么至少我可以跟随其他人的工作。 –

+0

我觉得AES会正常工作,如果我没看错的.. –

+0

由于RSA也是一种缓慢的,它一般用于少量数据的加密,例如分组密码算法用于数据的其余部分的关键。 AES可能是一个不错的选择,但是使用像OpenSSL这样的加密库来完成这项工作仍然是一个好主意,除非你有一个很好的理由必须自己去做。不过,我相信这里有其他人对这个话题有更多的了解,但如果他们中的任何人都愿意回答,我会这样做。 – Dmitri