DES шифрование / дешифрование

Я использую алгоритм DES, который нашел в сети. Работает нормально но у меня проблема.
Как вы знаете, DES шифрует / дешифрует блоки по 64 байта каждый. Но что произойдет, если в большом файле последний блок не заканчивается на границе 64-байтового блока? Я знаю, что будут ошибки.

Я использую следующий код:

Des d1;
char *plaintext=new char[64];
char *chyphertext=new char[64];
h.open("requisiti.txt",ios::in|ios::binary);.
k.open("requisiti2.txt",ios::out|ios::binary);
while(!h.eof())
{
h.read(plaintext,64);
chyphertext=d1.Encrypt(plaintext);
//decryption is the same.just change Encrypt to Decrypt
k.write(chyphertext,64);
}
h.close();
k.close();
remove("requisiti.txt");
rename("requisiti2.txt","requisiti.txt");

Поэтому мне нужно решение, подобное «заполнению», но я не знаю простого алгоритма для него. Пожалуйста, помогите мне хорошо зашифровать / расшифровать файл.

-1

Решение

Во-первых, я хотел бы отметить, что DES работает на 64-битных блоках (делая это 8 байтов, а не 64), как вы можете видеть в http://en.wikipedia.org/wiki/Data_Encryption_Standard (проверьте размер блока данных).

Теперь вы ищете какой-нибудь отступ (и расшифровку при расшифровке). Вы можете посмотреть на http://en.wikipedia.org/wiki/Padding_(cryptography)

Мне лично нравится PKCS # 7, потому что это легко и обычно добавляет немного накладных расходов по сравнению со стандартным размером.

Для шифрования:

  • проверьте размер фрагмента, который вы только что прочитали из файла
  • если это 64 бита, добавьте новый чанк [8,8,8, … 8], в противном случае добавьте в него количество пропущенных байтов (см. пример ниже)
  • шифровать
  • обратите внимание, что пакет LAST всегда содержит заполнение с этим алгоритмом (худший случай — заполнение 8 байтов)

Пример:

  • читать 0a 0b 0c, пропуская 5 байтов, чтобы уместиться в 8 байтов
  • дополненный пакет: 0a 0b 0c 05 05 05 05 05

Для расшифровки:

  • читать пакет
  • расшифровывать
  • если это последний пакет, проверьте значение последнего байта (скажем, это N)
  • Удалить N байты в конце вашего пакета

Надеюсь, что это делает это более ясным и помогает вам

РЕДАКТИРОВАТЬ

Если ваш входной файл — чистый текст, вы можете добавить 0, если он двоичный (и это должно быть, так как вы открываете его как двоичный файл), PKCS # 7 лучше

Подумайте о файле, созданном так: dd if=/dev/zero of=temp.zero count=100
несколько сотен байтов нулей, что такое заполнение, а что нет?

Реализация действительно проста:

  • считать memset
  • не забудьте добавить последний кусок, если ile кратно 8

Кстати, DES в настоящее время серьезно сломан, вы должны подумать об использовании достойного шифра, если дело касается безопасности (подумайте, по крайней мере, AES, проверьте http://en.wikipedia.org/wiki/Data_Encryption_Standard#Replacement_algorithms )

3

Другие решения

Прежде всего: никогда не используйте eof() проверить, достигнут ли конец файла, так как он не предсказывает конец файла.

while(h.read(plaintext,64))
{
if (std::h.gcount() < 64)   // gcount returns the number of characters extracted by the last unformatted input operation.
for (int i=std::h.gcount(); i<64; i++)
paintext[i] = 0; // pad the last block
chyphertext=d1.Encrypt(plaintext);
//decryption is the same.just change Encrypt to Decrypt
k.write(chyphertext,64);
}
0

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

Кроме того, я думаю, что хорошая библиотека сделает для вас дополнение.

0

Прежде всего не используйте DES! DES сломан и может быть переброшен довольно быстро. Во-вторых, вы используете режим ECB, который вы можете прочитать на вики почему вы должны избегать этого. Ваши данные могут быть подделаны, и вы не будете знать об этом — используйте AE режим как GCM. Как и кто-то из упомянутых ранее, DES имеет размер блока не 64 байта, а 8 бит.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector