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

将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

我得到了一个示例加密模块,它简单地将密钥与数据包数据异或,并将结果放在构造的数据包本身的数据字段中

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];
    }
}
对模块中函数的调用描述为-

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.