Некоторое время назад, читая хабр, натолкнулся на статью, в которой автор говорит о необходимости шифрования файлов, загружаемых в облако. Будучи тем, кому неприятна одна только мысль о том, что «дядя», предоставляющий услугу облачного хранения данных, имеет возможность использовать по своему усмотрению мои файлы, я стал размышлять об их шифровании. Подталкивало к этим размышлениям и то, что облако предоставляется бесплатно. Разумеется, использование архива с паролем было жутко неудобным решением, когда речь шла о большом количестве загружаемых файлов. Давно как раз для этой цели создал себе специальную утилиту, и сейчас, коли был поднял вопрос, решил об этом рассказать.
В самом начале использования облачного хранилища я хотел использовать простое XOR-шифрование. Реализация этого алгоритма не представляет никакой сложности (Фридман А., Кландер Л. и др.: «С/С++. Архив программ» — М.: ЗАО «Издательство БИНОМ», 2001 г. — 640с.), для его выполнения не нужно никаких серьезных вычислений. Однако, у данного метода шифрования есть только один плюс — он сравнительно быстро выполняется. На выходе у нас файл, содержимое которого отпугнет лишь непрофессионала. XOR-шифрование дает не настолько серьезную защиту, как может показаться на первый взгляд. Во-первых, если вы весело шифруете много файлов одним ключом, то злому дядьке достаточно где-то получить хотя бы один оригинал какого-то из файлов этой серии, чтобы вскрыть ключ и так же весело расшифровать всю серию файлов:
Key = 01101001
Text = 10010001
Encoded = 01101001^10010001 = 11111000
Key = Encoded^Text = 11111000^10010001 = 01101001
С другой стороны, алгоритм имеет слишком уж простое математическое описание, в связи с чем, вскрыть ключ можно и не имея оригинала файла, о чем написано, например, здесь.
В связи с этим мы не будем использовать эту бяку, но ссылку на исходник я все-таки выложу для полноты картины. Одним из наиболее простых и достаточно криптостойких алгоритмов является стандарт AES-256. Вокруг него было множество споров, однако в США его допустили к шифрованию сведений, относящихся к государственной тайне (смотри архив википедии), сегодня не существует способов успешной атаки на этот алгоритм за разумный промежуток времени. Над программной реализацией этого алгоритма уже поработал один добрый человек и разрешил свободно использовать свои наработки (сайт разработчика). Целесообразно было воспользоваться этим решением. Исходники утилит:
github.com/asu2010/crypt — XOR-шифратор/дешифратор
github.com/asu2010/crypt_AES-256 — AES-256 — шифратор/дешифратор
Обе программы консольные (разумеется) и сделаны для Windows. В программах предусмотрен ключ по умолчанию, созданный программой-генератором паролей. Он хранится в макросах DEFAULT_KEY, что позволяет его легко изменить. Для удобства использования я назвал исполняемый файл программы «crypt++.exe» и добавил путь к этому файлу в переменную окружения PATH. Шифрование с ключом по умолчанию из CMD выглядит следующим образом:
>crypt++ example.jpg enc
Дешифровка:
>crypt++ enc_example.jpg dec
Если нужно использовать другой ключ, то его можно указать после параметра enc/dec:
>crypt++ photo.jpg enc Ajk45BZ972pr
Возможно, этот инструмент не очень-то удобный, однако не безнадежно. Напишем небольшой bat-ник:
@echo off
echo Все файлы в папке после шифрования/дешифрования будут удалены
echo Путь к папке с файлами:
set /P FoldPath=
cd %FoldPath%
for /f %%i in ('dir %FoldPath%*.* /b') do (
crypt++ "%%i" enc
del "%%i"
)
Теперь мы можем шифровать массив файлов в какой-нибудь папке, удаляя оригиналы. Для дешифровки файлов таким же образом напишем подобный командник, в котором наш crypt++ будет вызываться с параметром dec. В этих командниках можно указать пароль, который не потребуется запоминать. Путь к этому командному файлу также можно указать в переменной PATH и пользоваться утилитой для большого количества файлов будет удобней. Теперь справедливости ради расскажу о неприятных моментах.
- В AES-256 файлы шифруются блоками по 16 байт и размер зашифрованного файла всегда кратен этому числу. Если в вашем исходном файле число байт не кратно 16-ти, то в дешифрованном файле в конец допишутся байты со значением NUL. Хотя это не является повреждением файла. Это относится только к утилите, использующей AES-256.
- Не был реализован шифратор/дешифратор для мобильных гаджетов. При скачивании файлов на другой ПК из облака, необходимо их дешифровывать.
- Предложенный bat-ник не способен рекурсивно вызываться для подкаталогов указанной ему папки. К тому же имена файлов в целевой папке не должны содержать пробелов.
- Шифрование AES-256 выполняется очень медленно. На моем Celeron скорость шифрования составила примерно 40 кб/с. Но вряд ли на более мощной машине можно получить сколь-нибудь удовлетворительную цифру.
Первые три проблемы вполне можно решить, если вдруг появится сильное желание.
Данные инструменты разрабатывались небрежно кодились в течении двух дней для личного пользования. Пользуюсь уже почти год и особых неудобств не испытываю.
Автор: BlackTester