Что будет "openssl enc -a -e -salt -des3 -pass pass:abc123" эквивалентным в.NET?

Мое приложение.Net должно взаимодействовать с системой на основе Linux, которая использует следующую командную строку для шифрования своих сообщений:

openssl enc -a -e -salt -des3 -pass pass:abc123

Как будет выглядеть эквивалентный код для шифрования / дешифрования сообщений в C#?

Я понимаю, что я должен использовать TripleDES в режиме CBC с отступом PKCS7. Я не знаю, какой размер блока и вектор инициализации (IV) мне следует использовать.

Также я запутался, как мне получить ключ из пароля. Должен ли я использовать PBKDF1 или PBKDF2 и какую соль мне следует использовать?

Так что то, что кажется стандартной работой, заканчивается для меня загадкой на всю ночь. Кто-нибудь может мне помочь?

1 ответ

Решение

Итак, вот фокус:

> openssl enc -a -e -salt -des3 -P -pass pass:abc123
salt=17685C0658F85BA4
key=1CB6E5A0AA4953EC2323CBA021EF008C9193F5F29990DE87
iv =9148EB5B2BF2E9B2

Если я использую алгоритм TripleDES, результат будет почти таким же, как у openssl. Единственная разница - дополнительные 16 байтов в начале вывода openssl. Первые восемь из этих байтов - это текст "Salted__", а вторые восемь - это соль.

Соль случайная. Так как мне получить ключ и iv из пароля и соли? PBKDF1 и PBKDF2 не соответствуют требованиям.

Итак, вот второй трюк:

A = MD5(pwd + SALT)
B = MD5(A + PWD + SALT)
KEY + IV = A + B

Знак плюс означает конкатенацию, длина ключа 24 байта, длина IV - 8 байтов.

Я узнал об этом трюке из блога Deusty, где он делает подобные вещи с AES.

Другие вопросы по тегам