我已经获得了一个样本加密模块,它只是将一个密钥与分组数据相关联,并将结果放在构造分组本身的数据字段中....
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
文件未更新???
如果需要任何其他信息,我会在这里添加......但请帮我摆脱网格。
答案 0 :(得分:2)
如果不对软件进行其他更改,甚至可能无法实现。看起来您的函数不允许生成的加密数据大于未加密的数据,这对RSA来说是必需的。
传递给你的功能的关键也会大不相同; RSA密钥的一侧将由模数和指数组成。模数将是一个很大的数字(不能用普通的整数类型表示),并且指数通常是一侧的大数字和另一侧的(相对)小的。
除此之外,RSA存在许多问题和困难。您可以尝试自己处理这些问题,但是使用像OpenSSL这样的现有库可能会更好。其中一些问题包括:
首先,您需要使加密函数能够返回比您提供的数据更多的数据。那么你应该考虑使用加密库来进行实际加密,以节省大量工作并减少让漏洞漏掉的可能性。
答案 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()
,这些都很容易使用,从而避免了看不见的错误。因为你在逻辑上处理字符串而不是字符。
此外,使用它们还可以在需要时获得字符串格式化的优势。
尝试然后回来.. :))