将xorcrypto加密模块转换为AES加密模块
我得到了一个示例加密模块,它简单地将密钥与数据包数据异或,并将结果放在构造的数据包本身的数据字段中 xoricv模块的代码在这里将xorcrypto加密模块转换为AES加密模块,c,encryption,network-programming,openssl,aes,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] ^= ke
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];
}
}
对模块中函数的调用描述为-
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为空,即使键
文件未更新
如果需要任何其他信息,我会将其添加到这里……但请帮助我脱离网格。如果不对您的软件进行一些额外的更改,这甚至是不可能的。您的函数似乎不允许生成的加密数据大于未加密数据,例如RSA需要这样的数据 传递给函数的键也将完全不同;RSA密钥的一侧由模和指数组成。模数将是一个大数字(不能用正常整数类型表示),指数通常是一侧的大数字,另一侧的(相对)小数字 除此之外,RSA还存在许多问题和困难。您可以自己尝试处理这些问题,但最好使用现有的库,如OpenSSL。其中一些问题包括:
- 实现RSA(使用有用的长密钥)需要对非常大的数字进行模运算,远远大于任何正常的整数类型。您要么为此编写函数,要么找到一个库
- 数据必须被分割成比模数(密钥的一部分)短的碎片,包括任何填充,这些填充会与数据一起加密。加密后的每一块的长度将是模数的长度。这就是为什么生成的加密数据会比原始数据长(还有填充)
- 要避免某些漏洞,需要额外的步骤,例如向每段数据中添加随机填充,并确保从密钥提升到指数的填充数据将超过模数(如果不是以模幂运算的方式进行)
while( (ch=fgetc(fr))==EOF)
// Also, Similar statements that you have used many times.
您正在从文件中读取1个字符,并将其与EOF
进行比较。在您使用普通文本文件之前,这一切都很正常
但这里您使用的是一个加密文件,file.enc
,它可以包含任何内容。
它甚至可以拥有EOF
字符本身作为数据内容
这意味着,如果文件有100个字符,并且第二个字符是EOF
,那么它将在第二个字符处终止
我觉得这可能是个问题
仍然。。其他问题-我建议使用fprintf()
而不是fputs()
,这些问题易于使用,因此可以避免看不见的bug。因为您正在处理字符串而不是逻辑上的字符
此外,使用这些工具还可以在需要时使用字符串格式
试试看,然后回来……) 你能推荐任何其他可能在这里工作的加密方法吗…看,我正在寻找任何适合网络应用的加密方法,请帮助我编写一些实现代码。如果任何一种方法可以工作,那么至少我可以向其他工作的人介绍。因为RSA也有点慢,它通常用于加密少量数据,例如用于其余数据的分组密码密钥。AES可能是一个很好的方法,但是使用像OpenSSL这样的加密库来完成这项工作仍然是一个好主意,除非你有充分的理由自己去做。不过,如果有人愿意回答的话,我相信这里还有其他人比我更了解这个话题。RSA和AES之间有什么联系?问题是用AES替换XOR,而RSA一点也没有提到。他最初问的是RSA。。。他后来把它改成了AES。如果你真的想偷懒:
system(“openssl enc-AES-256-cbc-salt-in file.txt-out file.enc”);//TODO:重构
while( (ch=fgetc(fr))==EOF)
// Also, Similar statements that you have used many times.