2015-03-26 2 views
2

Я пытаюсь зашифровать файл с использованием открытого ключа crypto с OpenSSL. Я знаю достаточно, чтобы знать, что для файла любого разумного размера это не может/не должно быть сделано с помощью открытого ключа. Вместо этого:Зашифровать файл открытым ключом с помощью openssl EVP-подпрограмм

1) Генерация случайного ключа (например, 256 бит)

2) Зашифровать ключ с открытым ключом

3) Симметричным Зашифровать файл со случайным ключом (1), например, AES

4) Join (2) и (3) вместе

5) Отправить (4), где/кто

Этот процесс воспроизведен в EVP подпрограмм OpenSSL как «конверт ЭЯКР yption». Мне удалось реализовать программу расшифровки/шифрования, используя этот API в C, который отлично работает :)

Мне интересно, можете ли вы выполнить этот процесс непосредственно через команды OpenSSL, а не через API низкого уровня. Я пробовал и могу генерировать случайный ключ, шифровать файл и т. Д. Затем я застреваю при объединении двух файлов вместе - на данный момент я просто cat два вместе, но это, похоже, не работает. Это возможно?

ответ

1

Ну, вы можете определить свой собственный формат контейнера, но, вероятно, легче just use CMS, который отлично справляется с этим вариантом использования.

+0

Спасибо за ответы. user4718374 - вы хорошо подытожили, где мне удалось добраться до сих пор, но конкатенация ключа и файла - это то место, где я тоже застрял. Maarten - CMS выглядит интересно, знаете ли вы, будет ли это работать с функцией EVP_Open для расшифровки на другом конце? – user4005750

+1

Конкатенация не проблема.Разделение файлов. Но поскольку ваш ключ является постоянной длиной, и AES, похоже, не изменяет эту длину, вы можете просто сделать «ekey ekey», а другая сторона может просто получить ekey (я использую префикс e для обозначения зашифрованного) путем извлечения первые 256 байтов из конкатенированного файла, а остальные будут зашифрованным файлом (например, вы можете сделать это с помощью dd). – PSkocik

+0

@ user4005750 Я бы продолжал использовать CMS полностью. CMS доступен как для командной строки, так и для API (конечно, поскольку OpenSSL - это библиотека сначала и CLI позже). –

1

Я близко к нулю опыта работы с OpenSSL, но следуя страницы руководства, я хотел бы сделать:

1) Сформировать случайный ключ (например, 256 бит = 32 байта)

openssl rand -out key 32 

2) Созданием Публичная privkey пара ключей (для целей тестирования, на самом деле, вы бы просто паб части чужой пары ключей)

openssl genrsa > key.pem 

3) Extract общедоступной части

openssl rsa -in key.pem -pubout > key.pub 

4) Encrypt ключ (случайный ключ для AES) с открытым ключом

openssl rsautl -in key -out ekey -pubin -inkey key.pub -encrypt -raw 

5) Убедитесь, что EKEY расшифровывает к ключевым

openssl rsautl -in ekey -out KEY -inkey key.pem -decrypt -raw 
    cmp KEY key && echo yes 

6) Симметрично шифрует файл со случайным ключом от (1) например AES

openssl enc -aes-256-ecb -kfile key -in file -out efile 

Что касается присоединения к ekey с efile, Я не знаю, какой формат обычно используется. Вы можете просто поместить эти два файла в архив.

+0

Вы проверили это? Мне кажется, что он уже терпит неудачу при первой команде, так как 'openssl rand -out key 256' использует 256 для аргумента' num', а в документации указано: 'num pseudo-random bytes'. –

+0

Да, да. Все команды отлично работают на моем ПК. Кто-нибудь из вас терпит неудачу? – PSkocik

+0

Нет, я просто взглянул на первую строку и увидел, что вместо командной строки ожидаются байты. Обратите внимание, что существует разница между «исполняет» и «работает правильно». Я думаю, что полный ответ должен также включать способ расшифровки (я согласен, мой ответ тоже очень короткий, но это связано с тем, что он использует ранее существовавшие функции). –

0

Фиксированный с:

openssl cms -encrypt -in infile -out outfile -outform DER -binary cert.crt