Я использую алгоритм 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");
Поэтому мне нужно решение, подобное «заполнению», но я не знаю простого алгоритма для него. Пожалуйста, помогите мне хорошо зашифровать / расшифровать файл.
Во-первых, я хотел бы отметить, что DES работает на 64-битных блоках (делая это 8 байтов, а не 64), как вы можете видеть в http://en.wikipedia.org/wiki/Data_Encryption_Standard (проверьте размер блока данных).
Теперь вы ищете какой-нибудь отступ (и расшифровку при расшифровке). Вы можете посмотреть на http://en.wikipedia.org/wiki/Padding_(cryptography)
Мне лично нравится PKCS # 7, потому что это легко и обычно добавляет немного накладных расходов по сравнению со стандартным размером.
Для шифрования:
Пример:
Для расшифровки:
Надеюсь, что это делает это более ясным и помогает вам
РЕДАКТИРОВАТЬ
Если ваш входной файл — чистый текст, вы можете добавить 0, если он двоичный (и это должно быть, так как вы открываете его как двоичный файл), PKCS # 7 лучше
Подумайте о файле, созданном так: dd if=/dev/zero of=temp.zero count=100
несколько сотен байтов нулей, что такое заполнение, а что нет?
Реализация действительно проста:
memset
Кстати, DES в настоящее время серьезно сломан, вы должны подумать об использовании достойного шифра, если дело касается безопасности (подумайте, по крайней мере, AES, проверьте http://en.wikipedia.org/wiki/Data_Encryption_Standard#Replacement_algorithms )
Прежде всего: никогда не используйте 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);
}
Я не уверен, для чего вы используете DES, но вы действительно должны использовать что-то другое, если вы на самом деле пытаетесь защитить данные, которые вы шифруете. DES больше не является безопасным.
Кроме того, я думаю, что хорошая библиотека сделает для вас дополнение.
Прежде всего не используйте DES! DES сломан и может быть переброшен довольно быстро. Во-вторых, вы используете режим ECB, который вы можете прочитать на вики почему вы должны избегать этого. Ваши данные могут быть подделаны, и вы не будете знать об этом — используйте AE режим как GCM. Как и кто-то из упомянутых ранее, DES имеет размер блока не 64 байта, а 8 бит.