2013-07-08 2 views
-1

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

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

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

Непонятно, что вы просите ... не так ли, что вы не понимаете, что такое заполнение?(Просто добавьте 00 байт, чтобы доставить вас до границы 64 байта до шифрования, и помните, что их необходимо удалить после дешифрования - так что сохраните значение «исходного размера» с зашифрованными данными), или это то, что вы ищете для кого-то, чтобы написать свой код для вас (в этом случае переполнение стека не является местом, чтобы найти это)? – mah

+0

Я знаю, что такое padding..but, я не знаю, какой алгоритм для прокладки. Перед отправкой моего вопроса я искал «ответ» на stackoverflow.com, но ничего не помог мне. Так что я спросил напрямую. Я новичок, поэтому я знаю основы более или менее. Также пробовал использовать алгоритм Google pad, но обычно они отправляют меня на crypto ++ или что-то в этом роде. надеюсь, у тебя это получилось. спасибо в любом случае – gAeT

+0

Размер блока DES - 64 * бит *, а не байты. –

ответ

0

Прежде всего: никогда не используйте 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

Как насчет расшифровки? Я попытался просто изменить Encrypt to Decrypt ... но он все равно дает мне ошибки: в последней части файла предыдущий символ перезаписывается символом в конце. – gAeT

+0

В основном вы дециблируете весь блок стандартным способом, а для последнего вы просто удаляете все конечные нули после дешифрования. Просто используйте цикл for **, начинающийся с конца ** блока, и пока ваш 'block [i]' is '0' заменит его символом NULL. –

+0

Что такое команда, чтобы начать с конца? и заменить символом NULL? Должен ли я использовать just = NULL.can вы можете показать мне? :) – gAeT

4

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

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

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

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

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

Пример:

  • чтения 0a 0b 0c, не хватает 5 байт, чтобы поместиться в 8 байт
  • проложенный пакет: 0A 0B 0C

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

  • чтения пакета
  • дешифровать
  • , если это последний пакет, проверить значение последнего байта (говорят, что это п)
  • удалить п байт в конце вашего пакета

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

EDIT

Если ваш входной файл чистый текст, вы можете пэд с 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)

+0

Я проверю его. Но он выглядит более сложным, чем заполнение 0. – gAeT

+0

@gAeT, это всего лишь пример –

+0

0-padding всегда опасно, если ваш фактический двоичный файл может содержать 0 значений. Как вы уверены, что вы восстанавливаете тот же самый файл? Конечно, вам нужно где-то хранить размер. – Bruce

0

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

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

+0

. Я использую DES, потому что это всего лишь школьный проект. Мне вообще не нужна безопасность. . Что я ищу - это библиотека или лучше быстрый код, чтобы делать дополнения и unpaddig и обсуждать их. так что было бы полезно для меня и других людей, которые попадут в эту беду. PS. Я знаю его 64 бита. – gAeT

0

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