Безопасно ли мое шифрование как openPGP / SMIME? - PullRequest
3 голосов
/ 23 октября 2011

Я пытаюсь написать простой файл enc / decryption в рамках более крупного проекта. Я хотел бы избежать libgpgme из-за проблем с лицензией. Стандарт openPGP сложен для того времени проекта, которое у меня есть. Я хотел бы сделать мои вещи шифрования с openssl.

Теперь я реализовал следующее:

шифрование (псевдокод):

RAND_bytes(aes_key)
RAND_bytes(aes_salt)

EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha1(), (const unsigned char *)aes_salt, aes_key, sizeof(aes_key), 5, key, iv);

тогда я aes256 мои данные

EVP_EncryptInit_ex(&e_ctx, EVP_aes_256_cbc(), NULL, key, iv);

затем я шифрую ключ и iv с помощью RSA

RSA_public_encrypt(flen, (unsigned char *)key, encryptedKey, rsa, RSA_PKCS1_PADDING );
RSA_public_encrypt(flen, (unsigned char *)iv, encryptedIV, rsa, RSA_PKCS1_PADDING );

затем я сохраняю 128-битный ключ и iv в верхней части моего файла (заголовок 256Bytes).

расшифровка: -> прочитать первые 256 байт (разбить на ключ и iv) -> расшифровать ключ и iv с помощью локального закрытого ключа RSA (конечно, секретный ключ RSA НЕ находится в файле) -> используйте ключ и iv для расшифровки данных

Я в безопасности с этим кодом?

Ответы [ 4 ]

2 голосов
/ 24 октября 2011

Шифрование - это тема, в которой вещи легко заставить «работать», но трудно , чтобы обеспечить безопасность.В случае сомнений (и вдвойне, когда не в сомнении), выберите широко признанный стандарт и реализуйте точно по спецификации .Идея зашифровать ключ с помощью публично-частного алгоритма, а затем упаковать IV, обоснована в теории, но я не уверен, каковы последствия шифрования IV, и что произойдет, если злоумышленник начнет переворачиватьбиты в зашифрованных данных?И т.д. Это выглядит звуком, но опять же, я настоятельно рекомендую просто реализовать опубликованную спецификацию точно .

Я бы рекомендовал просто реализовать S / MIME , используя двоичную кодировку передачи.S / MIME признана безопасной спецификацией, есть библиотеки , реализующие все сложные части , и, что наиболее важно, вы можете проверить свою реализацию на соответствие другим реализациям, чтобы убедиться, что вы не выходите за рамки спецификации.

2 голосов
/ 24 октября 2011

Поскольку это новый формат, вы должны использовать заполнение OAEP. Просто измените RSA_PKCS1_PADDING на RSA_PKCS1_OAEP_PADDING. На самом деле вам не нужно шифровать IV (насколько я могу судить, это не может повредить, и это может помочь).

В противном случае этот метод должен подойти, если RSA_size(rsa)==16. Конечно, закрытый ключ не должен быть известен любому, кто не сможет расшифровать файл.

1 голос
/ 24 октября 2011

Поскольку вы все равно используете функции шифрования конвертов OpenSSL, вам просто нужно напрямую использовать функции EVP_SealInit() / EVP_SealUpdate() / EVP_SealFinal(). Эти функции обеспечивают генерацию симметричного ключа и IV, шифрование данных с помощью симметричного ключа и шифрование симметричного ключа с помощью ключа (ключей) RSA получателя.

Однажды вещь, о которой ты не заботишься, - это подлинность. В режиме CBC злоумышленник может внести определенные предсказуемые изменения в открытый текст, даже если он не может его прочитать. Чтобы обнаружить это, вы должны либо вычислить HMAC по зашифрованному сообщению (используя отдельный симметричный ключ, чем тот, который использовался для шифрования), либо подписать зашифрованное сообщение (например, с помощью EVP_SignInit() / EVP_SignUpdate() / EVP_SignFinal()).

1 голос
/ 24 октября 2011

Некоторые наблюдения:

  • Функция EVP_BytesToKey предназначена для создания ключа и вектора инициализации из пароля и соли, а не из случайных данных.Это будет работать, но вы также можете просто использовать случайные байты непосредственно в качестве ключа и вектора инициализации.(Убедитесь, что вы используете безопасный PRNG, я не уверен, что на самом деле делает RAND_bytes.)

  • Вектор инициализации не должен быть секретным, режим CBC должен быть безопаснымс незашифрованным IV.(Однако это не помешает.)

  • Шифрование RSA выглядит хорошо (но, как сказал Дэвид, возможно, вы захотите использовать другое заполнение).

    Как сказал Сердалис, вы также должны защищать свой файл от изменений.Подойдет любой MAC-ключ с ключом (наиболее распространенными являются HMAC-сборка на ключе и хэш-функция).Примените MAC после шифрования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...