Преобразовать модуль шифрования xorcrypto в модуль шифрования AES - PullRequest
1 голос
/ 30 сентября 2011

Мне был предоставлен пример модуля шифрования, который просто xor-ключ с данными пакета и помещает результат в поле данных самого построенного пакета ....

Код для модуля 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. Вот почему я так ленив. Сначала я ищу реализацию, которая может служить доказательством концепции .Restвсе оптимизации могут быть выполнены позже.

Вывод, который я получаю, - шифрование не выполняется вообще, данные все еще находятся в виде простого текста в пакете.

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 ]

2 голосов
/ 30 сентября 2011

Это может оказаться невозможным даже без внесения дополнительных изменений в программное обеспечение. Не похоже, что ваша функция допускает, чтобы результирующие зашифрованные данные были больше, чем незашифрованные, например, для RSA.

Ключ, который вы передаете своей функции, также будет совершенно другим; одна сторона ключа RSA будет состоять из модуля и показателя степени. Модуль будет большим числом (не представимым с обычными целочисленными типами), а показатель степени обычно является большим числом для одной стороны и (относительно) небольшим для другой.

Помимо этого, есть ряд проблем и трудностей с RSA. Вы могли бы попытаться справиться с этим самостоятельно, но вам, вероятно, было бы лучше использовать существующую библиотеку, такую ​​как OpenSSL. Вот некоторые из этих проблем:

  • Реализация RSA (с полезными длинными ключами) требует модульной арифметики для очень больших чисел, гораздо больших, чем у любого из целочисленных типов. Для этого вам либо нужно написать функции, либо найти библиотеку.
  • Данные должны быть разбиты на части, которые короче модуля (части ключа), включая любые дополнения и тому подобное, зашифрованные вместе с данными. Длина каждого фрагмента после шифрования будет равна длине модуля. Поэтому результирующие зашифрованные данные будут длиннее исходных данных (а также заполнения).
  • Чтобы избежать определенных уязвимостей, требуются дополнительные шаги, такие как добавление случайного заполнения в каждый фрагмент данных и обеспечение того, чтобы дополненные данные, возведенные в показатель степени из ключа, превысили модуль (если бы это не было сделано как возведение в модуляр) .

Итак, во-первых, вам нужно, чтобы ваша функция шифрования могла возвращать больше данных, чем вы их выделили. Тогда вам, вероятно, стоит взглянуть на использование библиотеки шифрования для выполнения фактического шифрования, чтобы сэкономить много работы и уменьшить вероятность того, что уязвимости могут проскользнуть.

1 голос
/ 02 октября 2011

Ну,

Я чувствую строку:

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

Вы читаете 1 символ из файла и сравниваете его с EOF.Это прекрасно работает, пока вы не работаете с обычными текстовыми файлами.

Но здесь вы работаете с зашифрованным файлом file.enc, который может содержать что угодно.Он может даже содержать EOF символ в качестве содержимого данных.

Это означает, что если файл имеет 100 символов, а 2-й символ равен EOF, то он завершится самим вторым символом.

Я чувствуюэто как возможная проблема.

Остается .. другие проблемы - я предлагаю использовать fprintf() вместо fputs(), они просты в использовании и, следовательно, позволяют избежать невидимых ошибок.Поскольку вы работаете со строками вместо символов логически.

Более того, используя их, вы также получаете преимущество форматирования строк при необходимости.

Попробуйте, а затем вернитесь ..:)

...