Беда с ксорингом в Си - PullRequest
       9

Беда с ксорингом в Си

1 голос
/ 11 марта 2012

Я пытаюсь кодировать AES, используя режим Cipher Block Chaining (CBC). Я почти уверен, что у меня правильная структура (сохранение предыдущего зашифрованного текста с новым открытым текстом перед отправкой в ​​AES и наоборот при расшифровке. У меня проблема с расшифровкой зашифрованного файла обратно в исходный открытый текст. Я думаю, это может быть как-то связано с тем, как он ксероксирован. Я знаю, что мой алгоритм AES верен. Я собираю вместе два символьных массива. Я знаю, что если вы возьмете результаты кеширования двух вещей вместе, а затем отсканируете одно из них обратно с ответом вы должны получить другой операнд обратно. Однако, когда я проверяю эту функциональность, он не работает так.

Где я читаю его в виде открытого текста и переписываю его с помощью предыдущего зашифрованного текста

//THERE IS A RANDOM INITIALIZATION VECTOR BEFORE GETTING INTO THE WHILE LOOP
    while ((bytes_in = (read(fin, plaintext, AES_BLOCK)) ))
    {   
      for (count = 0; count < AES_BLOCK; count++){
        xor[count] = (plaintext[count]) ^ (ciphertext[count]);
        }   
       //AES STUFF NOT SHOWN SO THERE ISN'T MUCH CODE
      status = write (fdsk, ciphertext, strlen (ciphertext));
      for (count =0; count < AES_BLOCK; count++)
        plaintext[count] = '0';
    }

Расшифровывающая часть:

bytes = read(fin, previous_CT, AES_BLOCK); //reads in the initialization vector
while(total_bytes < aes_length)
{
 bytes = read(fin, ciphertext, AES_BLOCK);
 for(count = 0; count < AES_BLOCK; count++){
  plaintext[count] = (xor[count]) ^ (previous_CT[count]);
  printf("plaintext %d", plaintext[count]);
 }
}

Подводя итог моей проблеме / вопросу: Мне интересно, есть ли что-то для ксерокса символов, которое я не знаю, что мне нужно сделать. Кажется, я делаю это правильно, но по некоторым причинам я не получаю правильные результаты. Мне также интересно, может ли то, как я читаю информацию, портит мою программу. Пожалуйста, помогите мне! Спасибо!

Ответы [ 2 ]

0 голосов
/ 13 июня 2012

Ошибка, которая выскакивает у меня на этой строке:

  status = write (fdsk, ciphertext, strlen (ciphertext)); // bug here

Я уверен, что вы действительно хотите:

  status = write (fdsk, ciphertext, AES_BLOCK);

Обе версии могут давать одинаковые результаты в большинстве случаев, но иногда шифр создает байт '\ 0' где-то посередине зашифрованного текста, а затем первая ошибочная версия усекает запись до чего-то более короткого, чем вы хотели. (Та же проблема возникает в XORing «Hello World!» Обрезает строку ).

Я получаю все 0 из операции xor

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

0 голосов
/ 11 марта 2012

Если код, о котором идет речь, действительно то, что вы используете, проблема в том, что вы на самом деле не копируете зашифрованный текст при расшифровке. Вы читаете из файла в ciphertext, но выполняете операцию xor с previous_CT.

Посмотрите на добавленные комментарии ниже:

// NOTE - here you read into `previous_CT`
bytes = read(fin, previous_CT, AES_BLOCK); //reads in the initialization vector

while(total_bytes < aes_length)
{
 bytes = read(fin, ciphertext, AES_BLOCK);  // NOTE: here you read into `ciphertext`
 for(count = 0; count < AES_BLOCK; count++){
  plaintext[count] = (xor[count]) ^ (previous_CT[count]); // NOTE: using `previous_CT`
  printf("plaintext %d", plaintext[count]);
 }
}
...